Class PersistenceManager

java.lang.Object
de.bsvrz.ars.ars.persistence.PersistenceManager

public final class PersistenceManager
extends java.lang.Object
Zentrale Persistenz-Verwaltung für die Archivierung von Daten auf einem Speichermedium vom Typ A (Festplatte) und die entsprechende Meta-Daten-Verwaltung.
  • Field Details

    • ACTIVITY_FLAG_FILE_NAME

      public static final java.lang.String ACTIVITY_FLAG_FILE_NAME
      Dateiname des Lock-Files des Archivsystems. Die Datei wird angelegt, wenn das Archivsystem gestartet wird. Die wird gelöscht, wenn das Archivsystem heruntergefahren wird.
      See Also:
      Constant Field Values
    • REBUILDINDEX_FILE_FLAG_NAME

      public static final java.lang.String REBUILDINDEX_FILE_FLAG_NAME
      Eine Datei dieses Namens wird pro Verzeichnis einer Datenidentifikation/Datensatzart angelegt, wenn ein neuer Datensatz archiviert wurde und der Index möglicherweise (wg. Caching) noch nicht auf die Platte durchgeschrieben wurde. Beim Herunterfahren des Systems werden alle Indexe durchgeschrieben und die Flag-Dateien geloescht. Existiert diese Datei beim Systemstart noch, ist dies ein Hinweis auf eine unkorrekte Beendigung des Archivsystems. Für jede DId, für die die Datei existiert, werden die Indexe neu aufgebaut.
      See Also:
      Constant Field Values
    • RESTART_TIME_FILE_NAME

      public static final java.lang.String RESTART_TIME_FILE_NAME
      Dateiname für Datei mit Zeitstempeln je Datenidentifikation für die Ermittlung des Datenlückenanfangs.
      See Also:
      Constant Field Values
  • Constructor Details

    • PersistenceManager

      public PersistenceManager​(ArchiveManager archMgr, java.nio.file.Path archPath)
      Erzeugt den Persistenz-Manager.
      Parameters:
      archMgr - Archiv-Manager
      archPath - Archivierungs-Verzeichnis
  • Method Details

    • setUseDynamicDeletionTime

      public void setUseDynamicDeletionTime​(boolean useDynamicDeletionTime)
      Methode für Tests: Setzt, ob die Löschzeit dynamisch an den parameter angepasst wird oder nicht (altes Verhalten)
      Parameters:
      useDynamicDeletionTime - Soll der Löschzeitpunkt dynamisch aus der Parametrierung ermittelt werden (true) oder beim Abschließen der Containerdatei dort einmal fest eingetragen werden (klassisches Verhalten, false)
    • setSkipRebuild

      public static void setSkipRebuild​(boolean skipRebuild)
      Setzt, ob beim Wiederherstellungslauf beschädigte Indexe einfach nur gelöscht statt wiederhergestellt werden sollen.
      Parameters:
      skipRebuild - Wiederherstellung überspringen?
    • setDeleteBrokenContainers

      public static void setDeleteBrokenContainers​(boolean deleteBrokenContainers)
      Setzt, ob defekte Containerdateien umbenannt werden sollen
      Parameters:
      deleteBrokenContainers -
    • lockIndex

      public SyncKey<IdDataIdentification> lockIndex​(IdDataIdentification dataIdentification) throws SynchronizationFailedException
      Muss immer vor Zugriffen auf den kritischen Bereich (die Indexe oder Container) der Datenidentifikation aufgerufen werden.

      Wenn ein anderer Task sich im kritischen Bereich befindet, blockiert diese Methode bis der kritische Bereich wieder frei ist.

      Da der Index-Bereich möglicherweise von vielen Tasks benutzt wird und auch Zugriffe beim Archivieren von Daten erfolgen sollte der Bereich so schnell wie möglich wieder verlassen werden. Es ist zwingend erforderlich, das zurückgegebene Lock-Objekt nach Benutzung zu schließen, sonst können andere Threads blockiert werden.

      Beispiel-Code:

      
           try(SyncKey<IdDataIdentification> lock = archMgr.lockIndex(din.getDataIdentification())) {
                // Tue was mit den Indexen
           }
       

      Das zurückgegebene SyncKey-Objekt verhält sich wie ein ReentrantLock, es ist also möglich, ein zweites Lock zu erhalten wenn bereits ein Lock geholt wurde.

      Parameters:
      dataIdentification - Datenidentifikation
      Returns:
      Lock
      Throws:
      SynchronizationFailedException - Synchronisierung ist fehlgeschlagen (Unterbrochen beim Warten)
    • lockIndex

      public SyncKey<IdDataIdentification> lockIndex​(IdDataIdentification dataIdentification, java.time.Duration timeout) throws SynchronizationFailedException
      Muss immer vor Zugriffen auf den kritischen Bereich (die Indexe oder Container) der Datenidentifikation aufgerufen werden.

      Wenn ein anderer Task sich im kritischen Bereich befindet, blockiert diese Methode bis der kritische Bereich wieder frei ist.

      Da der Index-Bereich möglicherweise von vielen Tasks benutzt wird und auch Zugriffe beim Archivieren von Daten erfolgen sollte der Bereich so schnell wie möglich wieder verlassen werden. Es ist zwingend erforderlich, das zurückgegebene Lock-Objekt nach Benutzung zu schließen, sonst können andere Threads blockiert werden.

      Beispiel-Code:

      
           try(SyncKey<IdDataIdentification> lock = archMgr.lockIndex(din.getDataIdentification())) {
                // Tue was mit den Indexen
           }
       

      Das zurückgegebene SyncKey-Objekt verhält sich wie ein ReentrantLock, es ist also möglich, ein zweites Lock zu erhalten wenn bereits ein Lock geholt wurde.

      Parameters:
      dataIdentification - Datenidentifikation
      timeout - Maximale Wartezeit
      Returns:
      Lock
      Throws:
      SynchronizationFailedException - Synchronisierung ist fehlgeschlagen (Timeout oder Unterbrochen beim Warten)
    • getIndexLocks

      public com.google.common.collect.SetMultimap<IdDataIdentification,​SyncKey<IdDataIdentification>> getIndexLocks()
      Gibt alle aktuell genutzten Locks zur Synchronisation auf die Datenidentifikationen zurück.
      Returns:
      Locks
    • assertNoLocks

      public void assertNoLocks()
      Testmethode fürs Debugging, stellt sicher, dass aktuell keine Locks vom aktuellen Thread gehalten werden. Dieser Aufruf kann eingefügt werden, wenn eine Methode einen blockierenden Aufruf macht (z. B. auf Netzwerkantwort warten). Dies sollte aus Deadlock-Gefahr-Gründen nicht gemacht werden, während ein Index gelockt ist.
    • settLSMax

      public static void settLSMax​(long tlsMax)
      Setzt die maximale Löschschutzzeit
      Parameters:
      tlsMax - Zeit in Sekunden
      See Also:
      _tLSMax
    • getDataKindSuffix

      public static java.lang.String getDataKindSuffix​(de.bsvrz.dav.daf.main.archive.ArchiveDataKind archiveDataKind)
      Gibt zu der angegebenen Datenart den Pfadnamen zurück, der verwendet wird.
      Parameters:
      archiveDataKind - Archivdatenart
      Returns:
      Suffix
    • getDataKindSuffix

      public static java.lang.String getDataKindSuffix​(int adkIdx)
      Gibt zu der angegebenen Datenart den Pfadnamen zurück, der verwendet wird.
      Parameters:
      adkIdx - Archivdatenart (siehe Util.getDataKindFromIndex(int))
      Returns:
      Suffix
    • isValidDataKindSuffix

      public static boolean isValidDataKindSuffix​(java.lang.String dirName)
      Gibt true zurück, wenn es sich um einen gültigen Datenart-Ordnernamen handelt
      Parameters:
      dirName - Ordnername
      Returns:
      true, wenn es sich um einen gültigen Datenart-Ordnernamen handelt, sonst false
    • getArchiveDataKindFromDir

      public static de.bsvrz.dav.daf.main.archive.ArchiveDataKind getArchiveDataKindFromDir​(java.io.File dir)
      Extrahiert die Archivdatenart aus einer Pfadangabe
      Parameters:
      dir - Ordner
      Returns:
      Archivdatenart
      Throws:
      java.lang.IllegalArgumentException - Falls der Ordnername ungültig ist.
    • getArchiveDataKindFromDir

      public static de.bsvrz.dav.daf.main.archive.ArchiveDataKind getArchiveDataKindFromDir​(java.nio.file.Path dir)
      Extrahiert die Archivdatenart aus einer Pfadangabe
      Parameters:
      dir - Ordner
      Returns:
      Archivdatenart
      Throws:
      java.lang.IllegalArgumentException - Falls der Ordnername ungültig ist.
    • getContainerLocationFromDir

      public static IdContainerFileDir getContainerLocationFromDir​(java.nio.file.Path dir) throws PersistenceException
      Erzeugt ein IdContainerFileDir aus einem Datenträgerverzeichnis
      Parameters:
      dir - Verzeichnis
      Returns:
      IdContainerFileDir
      Throws:
      PersistenceException - Falls der Pfad kein gültiges Containerverzeichnis war.
    • getContainerLocationFromDir

      public static IdContainerFileDir getContainerLocationFromDir​(java.io.File dir) throws PersistenceException
      Erzeugt ein IdContainerFileDir aus einem Datenträgerverzeichnis.
      Parameters:
      dir - Verzeichnis
      Returns:
      IdContainerFileDir
      Throws:
      PersistenceException - Falls der Pfad kein gültiges Containerverzeichnis war.
    • deleteContainers

      public void deleteContainers​(SyncKey<IdDataIdentification> indexLock, IdContainerFileDir idContainerFileDir, long... containerIds) throws PersistenceException, SynchronizationFailedException, IndexException
      Markiert die angegebenen Container als gelöscht und trägt sie als gelöscht im Index ein. Diese Methode muss synchronisiert auf die Container eines DataIdentNode ausgeführt werden.
      Parameters:
      indexLock - Index-Schlüssel
      idContainerFileDir - Container-Schlüssel
      containerIds - Container-IDs, die gelöscht werden sollen
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
      SynchronizationFailedException
      IndexException
    • getContainerHeaders

      public ContainerHeaders getContainerHeaders​(SyncKey<IdDataIdentification> indexLock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, long containerID) throws IndexException
      Gibt die Header eines Containers zurück. Die Daten werden aus dem Verwaltungsdatenindex gelesen.
      Parameters:
      indexLock - Indexzugriff
      adk - Archivdatenart
      containerID - Container-ID, dessen Header glesen wurden
      Returns:
      die Header eines Containers
      Throws:
      IndexException - Daten konnten nicht ermittelt werden (z. B. Container nicht vorhanden)
    • getContainerHeaders

      public IndexResult<ContainerManagementInformation> getContainerHeaders​(SyncKey<IdDataIdentification> indexLock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk) throws IndexException
      Gibt die Header von alles Cotnainern eines Verzeichnisses zurück. Im Pronzip wird der gesamte Inhlt des Verwaltungsdatenindex zurüückgegeben.
      Parameters:
      indexLock - Indexzugriff
      adk - Archivdatenart
      Returns:
      die Header als IndexResult
      Throws:
      IndexException - Daten konnten nicht ermittelt werden
    • copyHeaders

      public static void copyHeaders​(ContainerManagementData from, ContainerFileHandle to) throws PersistenceException
      Trägt Headerdaten in eine Containerdatei ein
      Parameters:
      from - daten
      to - Handle auf einen Container
      Throws:
      PersistenceException - Schreibfehler
    • isContainerFile

      public static boolean isContainerFile​(java.io.File file)
      Liefert Kennzeichen, ob die angegebene Datei eine Container-Datei ist.
      Parameters:
      file - zu prüfende Datei
      Returns:
      Kennzeichen
    • getContID

      public static long getContID​(java.io.File file)
      Liefert die Container-ID zur angegebenen Container-Datei, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird. Alternativ kann die Container-ID aus den Container-Header-Parametern gelesen werden.
      Parameters:
      file - Container-Datei
      Returns:
      Container-ID
    • getContFileName

      public static java.lang.String getContFileName​(long containerId)
      Liefert den Dateinamen des Daten-Containers mit der angegebenen Container-ID.
      Parameters:
      containerId - Container-ID
      Returns:
      Dateiname
    • getPath

      public java.nio.file.Path getPath​(long objId, long atgId, long aspId, int sv)
      Liefert den Archiv-Pfad für die angegebene Datenidentifikation. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe und pro SimVarwird ein Verzeichnis verwendet.
      Parameters:
      objId - Objekt-ID
      atgId - Attributgruppen-ID
      aspId - Aspekt-ID
      sv - Simulationsvariante
      Returns:
      Archiv-Pfad
    • getPath

      public static java.nio.file.Path getPath​(java.nio.file.Path basePath, long objId, long atgId, long aspId, int sv)
      Liefert den Archiv-Pfad für die angegebene Datenidentifikation und den Wurzelpfad des Archivsystems. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe und pro SimVarwird ein Verzeichnis verwendet.
      Parameters:
      basePath - Wurzelpfad des Archivsystems
      objId - Objekt-ID
      atgId - Attributgruppen-ID
      aspId - Aspekt-ID
      sv - Simulationsvariante
      Returns:
      Archiv-Pfad
    • appendIdElements

      public static java.nio.file.Path appendIdElements​(java.nio.file.Path basePath, java.lang.String prefix, long id)
      Zerlegt die numerische ID in Gruppen von jeweils 3 Zeichen in Dezimaldarstellung und ergänzt das übergebene Path-Objekt, sodass die übergebene Separtor/Prefixsequenz hinzugefügt wird. Beispiel: mit "obj" im Parameter prefix führt die ID 12345678 dazu, dass der Pfad "/obj123/obj456/obj78" ergänzt wird.
      Parameters:
      basePath - Basispfad
      prefix - Prefix, das vor jeder Zeichengruppe eingefügt werden soll.
      id - Numerische ID.
    • getPath

      public java.nio.file.Path getPath​(long objId, long atgId, long aspId, int sv, de.bsvrz.dav.daf.main.archive.ArchiveDataKind dataKind)
      Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe, pro SimVar und pro Datensatzart wird ein Verzeichnis verwendet.
      Parameters:
      objId - Objekt-ID
      atgId - Attributgruppen-ID
      aspId - Aspekt-ID
      sv - Simulationsvariante
      dataKind - Datensatzart
      Returns:
      Archiv-Pfad
    • getPath

      public java.nio.file.Path getPath​(long objId, long atgId, long aspId, int sv, int dataKind)
      Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe, pro SimVar und pro Datensatzart wird ein Verzeichnis verwendet.
      Parameters:
      objId - Objekt-ID
      atgId - Attributgruppen-ID
      aspId - Aspekt-ID
      sv - Simulationsvariante
      dataKind - Datensatzart, 0 für OA, 1 für ON, 2 für NA und 3 für NN
      Returns:
      Archiv-Pfad
    • getPath

      public java.nio.file.Path getPath​(de.bsvrz.dav.daf.main.archive.ArchiveDataSpecification ads, de.bsvrz.dav.daf.main.archive.ArchiveDataKind archiveDataKind)
      Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe, pro SimVar und pro Datensatzart wird ein Verzeichnis verwendet.
      Parameters:
      ads - Spezifikation des Archivdatensatzes (enthält objID, atgID, aspID, sv)
      archiveDataKind - Datensatzart
      Returns:
      Name des Archiv-Pfads
    • getPath

      public java.nio.file.Path getPath​(IdDataIdentification dataIdentification, de.bsvrz.dav.daf.main.archive.ArchiveDataKind archiveDataKind)
      Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe, pro SimVar und pro Datensatzart wird ein Verzeichnis verwendet.
      Parameters:
      dataIdentification - objID, atgID, aspID, sv
      archiveDataKind - Datensatzart
      Returns:
      Name des Archiv-Pfads
    • getPath

      public java.nio.file.Path getPath​(IdDataIdentification dataIdentification)
      Liefert den Archiv-Pfad für die angegebene Datenidentifikation. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe und pro SimVar wird ein Verzeichnis verwendet.
      Parameters:
      dataIdentification - objID, atgID, aspID, sv
      Returns:
      Name des Archiv-Pfads
    • getPath

      public java.nio.file.Path getPath​(DataIdentNode dataIdentification, de.bsvrz.dav.daf.main.archive.ArchiveDataKind archiveDataKind)
      Liefert den Archiv-Pfad für die angegebene DataIdentNode und Datensatzart. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe, pro SimVar und pro Datensatzart wird ein Verzeichnis verwendet.
      Parameters:
      dataIdentification - objID, atgID, aspID, sv
      archiveDataKind - Datensatzart
      Returns:
      Name des Archiv-Pfads
    • deleteSimVar

      public void deleteSimVar​(SyncKey<IdDataIdentification> syncKey) throws PersistenceException
      Diese Methode loescht das komplette Verzeichnis eines DataIdentNode mit allen Unterverzeichnissen der Datensatzarten und aller darin befindlichen Datencontainern; damit werden alle archivierten Datensätze einer Simulationsvariante geloescht. Der DataIdentNode muss in der Verwaltung aus dem DataIdentTree geloescht werden. Falls die Simulationsvariante gleich Null ist, oder das Verzeichnis nicht geloescht werden konnte, wird eine PersistenceException geworfen.
      Parameters:
      syncKey - Schlüssel für Zugriff auf Indexknoten
      Throws:
      PersistenceException - Schreibfehler im Persistenzverzeichnis
    • createRebuildIxdFlagFile

      public void createRebuildIxdFlagFile​(DataIdentificationDir didPath, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk) throws PersistenceException
      Legt im Verzeichnis der Datenidentifikation ein REBUILDINDEX_FILE_FLAG_NAME-Datei an.
      Parameters:
      didPath - Pfad der Datenidentifikation
      adk - Archivdatenart
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
      See Also:
      REBUILDINDEX_FILE_FLAG_NAME
    • getRebuildIdxFile

      @NotNull public java.nio.file.Path getRebuildIdxFile​(DataIdentificationDir didPath, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk)
      Die Methode getRebuildIdxFile ermittelt den Speicherort für die _rebuildIndex.flag
      Parameters:
      didPath - von Typ DataIdentificationDir
      adk - von Typ ArchiveDataKind
      Returns:
      Path
    • checkContainerFile

      public void checkContainerFile​(IdDataIdentification dataIdentification, de.bsvrz.dav.daf.main.archive.ArchiveDataKind archiveDataKind, long containerId) throws PersistenceException
      Überprüft eine Containerdatei darauf, ob diese mit "##\n" endet. Falls nicht wird das ungültige Ende der Datei abgeschnitten (NÄM-79)
      Parameters:
      dataIdentification - Datenidentifikation
      archiveDataKind - Archivdatenart
      containerId - Container-ID
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
    • accessContainer

      @NotNull public ContainerFileHandle accessContainer​(IdContainerFileDir idContainerFileDir, long containerId) throws PersistenceException
      Greift auf einen Container zu.
      Parameters:
      idContainerFileDir - Synchronisierung auf Containerverzeichnis
      containerId - Id
      Returns:
      Cotnainerhandle
      Throws:
      PersistenceException - Lesefehler
    • accessOpenContainer

      public ContainerFileHandle accessOpenContainer​(IdDataIdentification dataIdentification, de.bsvrz.dav.daf.main.archive.ArchiveDataKind dataKind, long openContID) throws PersistenceException
      Greift auf den offenen Container zu. Die Methode darf nicht für geschlossene Container verwendet werden, da dann die Synchronisation nicht sichergestellt ist.
      Parameters:
      dataIdentification - Datenidentifikation
      dataKind - Archivdatenart
      openContID - Id des offenen Containers.
      Returns:
      Containerhandle
      Throws:
      PersistenceException - Lesefehler
    • accessContainerUnsynchronized

      public BasicContainerFileHandle accessContainerUnsynchronized​(java.io.File file) throws PersistenceException
      Greift auf eine Containerdatei unsynchronisiert zu. Diese Methode darf nur für Container außerhalb des Persistenzverzeichisses benutzt werden.
      Parameters:
      file - Containerdatei
      Returns:
      Handle
      Throws:
      PersistenceException - Lesefehler
    • iterator

      public DataIterator iterator​(de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, long containerId, DeletedTreatment deletedTreatment, @Nullable java.util.zip.Inflater inflater, SyncKey<IdDataIdentification> indexLock) throws PersistenceException, SynchronizationFailedException
      Iteriert über die Daten eines Containers.
      Parameters:
      adk - Archivdatenart
      containerId - Container-ID
      deletedTreatment - Behandlung gelöschter Containerdaten
      inflater - Unzip-Klasse zum dekomprimieren (darf null sein, wenn die Dateninhalte nicht interessant sind)
      Returns:
      Iterator
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
      SynchronizationFailedException
    • prepareShutdown

      public void prepareShutdown() throws java.lang.InterruptedException
      Die Methode prepareShutdown wird beim Herunterfahren des Archivsystems ausgeführt.
      Throws:
      java.lang.InterruptedException
    • startupProcedure

      public boolean startupProcedure()
      Versucht, die StartUp-Properties-Datei einzulesen. Wenn das nicht gelingt, wird das gesamte Persistenzverzeichnis (RestorePersDirTsk) durchlaufen und versucht, einen gueltigen Startpunkt wiederherzustellen. Das Persistenzverzeichnis wird in InQueuesMgr.NUM_OF_ARCH_QUEUES_ONLINE Teile aufgeteilt, die jeweils von einem Thread bearbeitet werden (zwengs Performance). Am Schluss wird die StartUp-Properties-Datei geloescht. Beim Herunterfahren wird in prepareShutdown() die Datei neu geschrieben. Daran kann das ArS beim nächsten Start erkennen, ob es ordnungsgemäß heruntergefahren wurde oder ob ein Wiederherstellungslauf erforderlich ist.
      Returns:
      Wahr, falls der Durchlauf des Persistenzverzeichnisses erfolgreich war und das Archivsystem starten kann, falsch sonst.
    • getPath

      public java.nio.file.Path getPath​(IdContainerFileDir containerFileDir)
      Die Methode getPathName gibt den Speicherort für ein Containerverzeichnis zurück
      Parameters:
      containerFileDir - von Typ IdContainerFileDir
      Returns:
      String
    • rebuildStandardIndex

      public void rebuildStandardIndex​(ContainerManagementIndex managementIndex, IdContainerFileDir containerFileDir, BaseIndex<IndexValues> index) throws IndexException
      Die Methode rebuildStandardIndex erstellt einen Standard-Index aus dem Verwaltungsdatenindex
      Parameters:
      managementIndex - Verwaltungsdatenindex
      containerFileDir - Speicherort
      index - Zu erzeugender Index (leer)
      Throws:
      IndexException - problem beim Index-Zugriff
    • rebuildContainerHeaderIndex

      public void rebuildContainerHeaderIndex​(IdContainerFileDir containerFileDir, ContainerManagementIndex containerHeaderIndex, @Nullable PersistenceManager.RebuildResult rebuildResult) throws IndexException
      Erzeugt einen neuen ContainerHeaderIndex basierend aus den Containerdateien in einem Verzeichnis
      Parameters:
      containerFileDir - ID des Containerverzeichnisses
      containerHeaderIndex - Container-Header-Index (leer)
      rebuildResult - Statistik über die Wiederherstellung
      Throws:
      IndexException - Lesefehler der Indexe (z. B. korrupt)
    • hasError

      public boolean hasError​(IndexResult<ContainerManagementInformation> contents, int i, java.util.HashSet<java.lang.Long> knownMinDataIndexes, java.util.Map<java.lang.Long,​java.lang.Long> contIdToMinDataIndex, boolean checkIndexMonotonic)
      Bestimmt, ob ein Eintrag im Verwaltungsdatenindex fehlerhaft ist
      Parameters:
      contents - Indexinhalte
      i - Zu prüfende Zeile im Index
      knownMinDataIndexes - Bereits bekannte Minimum-Datenindex-Werte im Container (Duplikate sind ein Fehler), dieses Set wird von der Methode ergänzt.
      contIdToMinDataIndex - Bekannte Minimum-Datenindex-Werte je Container-ID
      checkIndexMonotonic - Soll geprüft werden ob der Datenindex-Minimum-Wert monoton ist?
      Returns:
      true falls Fehler vorhanden, sonst false
    • getIndexResult

      public IndexResult<IndexValues> getIndexResult​(SyncKey<IdDataIdentification> key, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, de.bsvrz.dav.daf.main.archive.ArchiveTimeSpecification ats) throws IndexException, SynchronizationFailedException
      Die Methode getIndexResult führt eine Index-Abfrage durch (für Archivanfragen) und aktualisiert dabei die Daten vom offenen Container im Index
      Parameters:
      key - von Typ SyncKey<IdDataIdentification>
      adk - von Typ ArchiveDataKind
      ats - von Typ ArchiveTimeSpecification
      Returns:
      IndexResult<IndexValues>
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException
    • updateContainerIndex

      public void updateContainerIndex​(SyncKey<IdDataIdentification> lock, ContainerManagementData managementData) throws PersistenceException, IndexException
      Die Methode updateContainerIndex aktualisiert den Verwaltungsdatenindex
      Parameters:
      managementData - Containerdaten, die in den Index eingefügt werden sollen (ersetzt ggf. vorhandene Einträge mit gleicher ContainerID)
      lock - Schlüssel zum Zugriff auf den Verwaltungsdatenindex
      Throws:
      PersistenceException - wenn ein Fehler auftritt
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
    • maxMedienID

      public int maxMedienID​(IndexResult<ContainerManagementInformation> headers)
      Die Methode maxMedienID ermittelt die maximale Medien-ID in einem Index-Abfrage-Ergebnis
      Parameters:
      headers - von Typ IndexResult<ContainerManagementInformation>
      Returns:
      Medien-ID oder -1 falls Index keine Medien-IDs enthält (also z. B. nie etwas gesichert wurde)
    • maxContainerId

      public long maxContainerId​(SyncKey<IdDataIdentification> indexKey, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk) throws IndexException
      Ermittelt maximale Container-ID
      Parameters:
      indexKey - Indexzugriffschlüssel
      adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
      Returns:
      Größte Container-ID im Verzeichnis
      Throws:
      IndexException - Lesefehler der Indexe (z. B. korrupt)
    • rebuildIndexes

      public void rebuildIndexes​(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, @Nullable PersistenceManager.RebuildResult rebuildResult) throws IndexException
      Die Methode rebuildIndexes baut einen Index erneut auf.
      Parameters:
      lock - von Typ SyncKey<IdDataIdentification>
      adk - von Typ ArchiveDataKind
      rebuildResult - Ergebnis für Statistiken
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
    • addIndexEntries

      public void addIndexEntries​(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, long dataIdx, long arsTime, long dataTime, long openContID) throws IndexException
      Die Methode addIndexEntries fügt einem Index Werte hinzu.
      Parameters:
      lock - von Typ SyncKey<IdDataIdentification>
      adk - von Typ ArchiveDataKind
      dataIdx - von Typ long
      arsTime - von Typ long
      dataTime - von Typ long
      openContID - von Typ long
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
    • updateStandardIndexes

      public void updateStandardIndexes​(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, OpenContainerData data) throws IndexException
      Die Methode updateStandardIndexes fügt einem Index Werte hinzu oder aktualisiert die vorhandenen Werte.
      Parameters:
      lock - von Typ SyncKey<IdDataIdentification>
      adk - von Typ ArchiveDataKind
      data - von Typ OpenContainerData
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
    • updateMaxValues

      public void updateMaxValues​(IdDataIdentification idDataIdentification, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, long dataIdx, long arsTime, long dataTime) throws IndexException, SynchronizationFailedException
      Die Methode speichert im OpenContainerData neue Maximal-Werte für den offenen Container (Maximal-Datenindex usw.)
      Parameters:
      idDataIdentification - Datenidentifikation
      adk - von Typ ArchiveDataKind
      dataIdx - Datenindex
      arsTime - Archivzeit
      dataTime - Datenzeit
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException
    • getOpenContID

      public long getOpenContID​(IdContainerFileDir idContainerFileDir) throws IndexException, SynchronizationFailedException
      Die Methode getOpenContID gibt die ID des offenen Containers für eine Datenidentifikation zurück
      Parameters:
      idContainerFileDir - Containerverzeichnis
      Returns:
      long oder -1 falls es keinen offenen Container gibt
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException
    • maxATime

      public long maxATime​(IdContainerFileDir idContainerFileDir) throws IndexException, SynchronizationFailedException
      Die Methode maxATime gibt die maximale Archivzeit einer datenidentifikation zurück
      Parameters:
      idContainerFileDir - Containerverzeichnis
      Returns:
      long
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException
    • getOpenContainerData

      @Nullable public StandardOpenContainerData getOpenContainerData​(IdContainerFileDir containerFileDir) throws IndexException, SynchronizationFailedException
      Die Methode getOpenContainerData die zwischengespeicherten daten für den offenen Container zurück
      Parameters:
      containerFileDir - Containerverzeichnis
      Returns:
      StandardOpenContainerData oder null falls kein offener Container existiert
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException
    • removeOpenContainerData

      @Nullable public void removeOpenContainerData​(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk)
      Löscht die Daten eines offenen Containers. Diese Methode wird aufgerufen, wenn es keinen offenen Container mehr gibt.
      Parameters:
      lock - Synchroniserungszugriffsschlüssel
      adk - Archivdatenart
    • removeContainerFromIndex

      public void removeContainerFromIndex​(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind archiveDataKind, long containerId) throws IndexException
      Die Methode removeContainerFromIndex löscht einen Contaienr aus den Indexen
      Parameters:
      lock - von Typ SyncKey<IdDataIdentification>
      archiveDataKind - von Typ ArchiveDataKind
      containerId - von Typ long
      Throws:
      IndexException - wenn der Indexzugriff fehlschlägt
    • numContainers

      public long numContainers​(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind dataKind) throws IndexException
      Die Methode numContainers zählt die Anzahl Einträge im Verwaltungsdatenindex für ein Containerverzeichnis. Dies ist die Menge der potentiell vorhandenen Container, ausgelagerte Container werden dabei mitgezählt.
      Parameters:
      lock - Synchronisierung auf Datenidentifikation
      dataKind - Archivdatenart
      Returns:
      long Anzahl Containerdateien
      Throws:
      IndexException - wenn der Indexzugriff fehlschlägt
    • getLastContainerHeaders

      @Nullable public ContainerHeaders getLastContainerHeaders​(SyncKey<IdDataIdentification> indexLock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk) throws IndexException
      Die Methode getLastContainerHeaders ermittelt die Header vom letzten Container (vom Container mti der größten ID)
      Parameters:
      indexLock - Synchronisierung auf Datenidentifikation
      adk - Archivdatenart
      Returns:
      ContainerHeaders
      Throws:
      IndexException - wenn der Indexzugriff fehlschlägt
    • arSParamGetVorhalten

      public long arSParamGetVorhalten​(IdDataIdentification dataIdentification)
      Die Methode arSParamGetVorhalten ermittelt den parametrierten Vorhaltezeitraum in Sekunden für eine Datenidentifikation.
      Parameters:
      dataIdentification - Datenidentifikation
      Returns:
      long Vorhaltezeitraum in Sekunden
    • getStatistics

      public PersistenceManager.Statistics getStatistics()
      Gibt Statistiken von diesem PersistenceManager-Objekt zurück.
      Returns:
      Statistiken (Typ Statistics)
    • warnAboutHugeContainerDirectory

      public void warnAboutHugeContainerDirectory​(IdContainerFileDir location, long numEntries)
      Die Methode warnAboutHugeContainerDirectory warnt den Benutzer, wenn zu viele Container in einem Containerverzeichnis gespeichert wurden.
      Parameters:
      location - von Typ IdContainerFileDir
      numEntries - von Typ long
    • warnAboutSlowRestore

      public void warnAboutSlowRestore​(IdContainerFileDir location, long currentEntries, java.time.Duration currentDuration)
      Die Methode warnAboutSlowRestore warnt den Benutzer, wenn die Wiederherstellung eines Verzeichnisses sehr lange dauert.
      Parameters:
      location - von Typ IdContainerFileDir
      currentEntries - von Typ long
      currentDuration - von Typ Duration
    • getLargeDataIdentifications

      public java.util.Set<IdContainerFileDir> getLargeDataIdentifications()
      Gibt ein Set zurück, dass alle bekannten Contaienrverzeichnisse enthält, die "übermäßig viel" Daten enthalten. Das Set ist threadsafe und änderbar.
      Returns:
      Set mit Containerverzeichnissen
    • formatDataIdentification

      @NotNull public java.lang.String formatDataIdentification​(IdContainerFileDir location)
      Die Methode formatDataIdentification gibt eine Datenidentifikation als lesbaren String aus (z. B. ermitteln der Pid falls möglich)
      Parameters:
      location - Containerverzeichnis-ID
      Returns:
      String
    • formatObj

      public java.lang.String formatObj​(long objId)
      Die Methode formatObj gibt eine Objekt-ID als lesbaren String aus (z. B. ermitteln der Pid falls möglich)
      Parameters:
      objId - von Typ long
      Returns:
      String
    • flushIndexes

      public void flushIndexes​(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk) throws IndexException
      Schreibt den aktuellen Stand der Indexe auf die Festplatte
      Parameters:
      lock - Lock für Datenidentifikation
      adk - Archivdatenart
      Throws:
      IndexException - Falls ein Indexfehler auftrat.
    • createLockFile

      @Nullable public java.lang.String createLockFile()
      Das Logfile isActive anlegen. Wird verwendet, um einem Archivsystem anzuzeigen, ob ein anderes Archivsystem dasselbe Persistenzverzeichnis verwendet
      Returns:
      Fehlermeldung, wenn das Erstellen nicht erfolgreich war, null sonst
    • deleteLockFile

      public void deleteLockFile()
      Löscht das LogFile isActive, falls es von diesem ArS angelegt wurde und es existiert und gibt damit das Persistenzverzeichnis wieder frei
    • checkPersistenceDir

      public void checkPersistenceDir​(java.lang.String mode) throws java.lang.InterruptedException
      Prüft das Persistenzverzeichnis auf fremde Dateien und Verzeichnisse und falsche Reihenfolgen von ID-Verzeichnissen. Die Ergebnisse werden über den Logger protokolliert. Kann durch einen Kommandozeilenparameter beim Systemstart aufgerufen werden.
      Parameters:
      mode - Ein Wert von P_CHECK_PERS_DIR_DIR, P_CHECK_PERS_DIR_HDR, P_CHECK_PERS_DIR_ALL
      Throws:
      java.lang.InterruptedException
    • getDataIdentificationFromPath

      public static IdDataIdentification getDataIdentificationFromPath​(java.io.File path) throws PersistenceException
      Extrahiert Objekt-ID, Attributgruppen-ID, Aspekt-ID und SimVar von unten beginnend aus einem Verzeichnispfad, der mindestens die Länge 4 haben muss. Voraußetzung ist, dass alle Verzeichnisnamen entsprechend den Konventionen des PersistenceManagers gebildet sind. Das unterste Verzeichnis kann entweder die SimVar bezeichnen oder eine Datensatzart sein.
      Parameters:
      path - Pfad bis zum Verzeichnis der Simulationsvariante. Falls ein Datenart-Verzeichnis angegeben wird, wir dieses ignoriert.
      Returns:
      Feld bestehend aus [ObjID, AtgID, AspID SimVar] wenn der Pfad ein gueltiges Verzeichnis ist
      Throws:
      PersistenceException - wenn der Pfad kein gueltiges Verzeichnis ist
      See Also:
      isValidObjIdFolderName(String), isValidAtgIdFolderName(String), isValidAspIdFolderName(String), isValidSvFolderName(String)
    • getDataIdentificationFromPath

      public static IdDataIdentification getDataIdentificationFromPath​(java.nio.file.Path path) throws PersistenceException
      Extrahiert Objekt-ID, Attributgruppen-ID, Aspekt-ID und SimVar von unten beginnend aus einem Verzeichnispfad, der mindestens die Länge 4 haben muss. Voraußetzung ist, dass alle Verzeichnisnamen entsprechend den Konventionen des PersistenceManagers gebildet sind. Das unterste Verzeichnis kann entweder die SimVar bezeichnen oder eine Datensatzart sein.
      Parameters:
      path - Pfad bis zum Verzeichnis der Simulationsvariante. Falls ein Datenart-Verzeichnis angegeben wird, wir dieses ignoriert.
      Returns:
      Feld bestehend aus [ObjID, AtgID, AspID SimVar] wenn der Pfad ein gueltiges Verzeichnis ist
      Throws:
      PersistenceException - wenn der Pfad kein gueltiges Verzeichnis ist
      See Also:
      isValidObjIdFolderName(String), isValidAtgIdFolderName(String), isValidAspIdFolderName(String), isValidSvFolderName(String)
    • isValidSvFolderName

      public static boolean isValidSvFolderName​(java.lang.String dirName)
      Prüft, ob der gegebene Verzeichnisname ein gueltiger Name für ein Verzeichnis ist, das eine Simulationsvariante repraesentiert.
      Parameters:
      dirName - Verzeichisname
      Returns:
      Wahr, wenn der Verzeichnisname korrekt ist, falsch sonst.
      See Also:
      SV_DIRNAME_PAT
    • isValidIDFolderName

      public static boolean isValidIDFolderName​(java.lang.String dirName)
      Die Methode isValidIDFolderName früft ob ein Order einen gültigen Namen hat
      Parameters:
      dirName - von Typ String
      Returns:
      boolean
    • getArchivePath

      public java.nio.file.Path getArchivePath()
      Liefert den Wurzelpfad des Persistenzverzeichisses, der beim Systemstart in der Kommandozeile übergeben wurde.
      Returns:
      Wurzelpfad des Persistenzverzeichisses
    • nextContainerID

      public long nextContainerID()
      Erhoeht nextContainerID um 1 und gibt den Wert zurück.
      Returns:
      als nächste zu verwendende Container-ID
    • getLastContainerID

      public long getLastContainerID()
      Returns:
      Letzte vergebe ContainerID
    • saveUnsubscriptionTime

      public void saveUnsubscriptionTime()
      Sichert den letzten Zeitpunkt, wo gültige Daten empfangen wurden bzw. beim Beenden wo Daten abgemeldet wurden. Dieser Zeitpunkt wird nach einem Neustart als Grundlage für die Bildung von potentiellen Datenlücken verwendet.
    • saveUnsubscriptionTime

      public void saveUnsubscriptionTime​(com.google.common.collect.Multimap<java.lang.Long,​IdDataIdentification> didForUnsubscriptionTime, java.nio.file.Path unsubscriptionFile)
      Sichert den letzten Zeitpunkt, wo gültige Daten empfangen wurden bzw. beim Beenden wo Daten abgemeldet wurden. Dieser Zeitpunkt wird nach einem Neustart als Grundlage für die Bildung von potentiellen Datenlücken verwendet.
      Parameters:
      didForUnsubscriptionTime - Zu schreibende Zeitstempel
      unsubscriptionFile - Datei, die geschrieben wird.
    • openDeletedContainerFile

      public DeletedContainerFile openDeletedContainerFile​(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind archiveDataKind) throws PersistenceException, SynchronizationFailedException
      Die Methode openDeletedContainerFile öffnet die Datei mit den Informationen zu den gelöschten Containern
      Parameters:
      lock - von Typ SyncKey<IdDataIdentification>
      archiveDataKind - von Typ ArchiveDataKind
      Returns:
      DeletedContainerFile
      Throws:
      PersistenceException - Lesefehler
      SynchronizationFailedException - Fehler bei Index-Synchronisation
    • extendLoeschschutz

      public void extendLoeschschutz​(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, long contID) throws PersistenceException, IndexException
      Verlängert die Löschzeit eines Containers in Folge einer Archivanfrage oder ArchivInfoAnfrage.
      Parameters:
      lock - Objekt, das den synchronisierten Zugriff auf den Index erlaubt
      adk - Archivdatenart
      contID - ContainerID
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
      IndexException
    • extendLoeschschutz

      public void extendLoeschschutz​(SyncKey<IdDataIdentification> lock, ContainerHeaders handle, long t_lsMillis) throws PersistenceException, IndexException
      Verlängert die Löschzeit eines Containers.
      Parameters:
      lock - Objekt, das den synchronisierten Zugriff auf den Index erlaubt
      handle - Container-Header
      t_lsMillis - Neuer Löschschutz ab aktuellem Zeitpunkt (in Millisekunden)
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
      IndexException
    • getProtectedDeletionTime

      public long getProtectedDeletionTime​(ContainerHeaders headers)
      Gibt den Zeitpunkt zurück, an dem der Löschschutz abläuft.
      Parameters:
      headers - von Typ ContainerHeaders
      Returns:
      long (Millisekunden-Zeitstempel)
    • getRegularDeletionTime

      public long getRegularDeletionTime​(ContainerHeaders headers)
      Gibt den Zeitpunkt zurück, an dem der Container regulär gelöscht werden kann
      Parameters:
      headers - von Typ ContainerHeaders
      Returns:
      long (Millisekunden-Zeitstempel)
    • getArchiveManager

      public ArchiveManager getArchiveManager()
      Gibt archiveManager von diesem PersistenceManager-Objekt zurück.
      Returns:
      archiveManager (Typ ArchiveManager)