Class PersistenceDirectory

java.lang.Object
de.bsvrz.ars.ars.persistence.directories.PersistenceDirectory
All Implemented Interfaces:
CountEstimator
Direct Known Subclasses:
ActivePersistenceDirectory, ReadonlyPersistenceDirectory

public abstract sealed class PersistenceDirectory extends Object implements CountEstimator permits ActivePersistenceDirectory, ReadonlyPersistenceDirectory
Einzelnes Persistenzverzeichnis, das für einen bestimmten Zeitbereich oder für eine bestimmte Simulationsvariante die Daten enthält.
  • Field Details

    • debug

      protected static final de.bsvrz.sys.funclib.debug.Debug debug
    • indexTree

      protected final IndexTree indexTree
      Baum zur Verwaltung der Indexe
    • largeDataIdentifications

      protected final ConcurrentSkipListSet<IdContainerFileDir> largeDataIdentifications
      Menge von Datenidentifikationen, in denen sehr viele Containerdateien enthalten sind (für Warnmeldung)
  • Constructor Details

  • Method Details

    • getLastContainerHeaders

      @Nullable public ContainerHeaders getLastContainerHeaders(LockedContainerDirectory containerDirectory) throws IndexException
      Die Methode getLastContainerHeaders ermittelt die Header vom letzten Container (vom Container mit der größten ID)
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Container-Verzeichnis
      Returns:
      ContainerHeaders
      Throws:
      IndexException - wenn der Indexzugriff fehlschlägt
    • executeOnContainer

      protected void executeOnContainer(Path contFile, PersistenceDirectory.ContainerCall action) throws PersistenceException, SynchronizationFailedException
      Führt eine Aktion auf einem Container auf und benennt den Container um, falls die Aktion eine PersistenceException geworfen hat und der Benutzer PersistenceManager.shouldDeleteBrokenContainers() gesetzt hat.
      Parameters:
      contFile - Containerdatei
      action - Aktion
      Throws:
      PersistenceException - Beliebiger Grund
      SynchronizationFailedException
    • renameContainerFile

      protected void renameContainerFile(Path contFile) throws PersistenceException
      Throws:
      PersistenceException
    • getContainerHeaders

      public ContainerHeaders getContainerHeaders(LockedContainerDirectory containerDirectory, long containerID) throws IndexException
      Gibt die Header eines Containers zurück. Die Daten werden aus dem Verwaltungsdatenindex gelesen.
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Container-Verzeichnis
      containerID - Container-ID, dessen Header gelesen werden sollen
      Returns:
      die Header eines Containers
      Throws:
      IndexException - Daten konnten nicht ermittelt werden (z. B. Container nicht vorhanden)
    • getContainerHeaders

      public IndexResult<ContainerManagementInformation> getContainerHeaders(LockedContainerDirectory containerDirectory) throws IndexException
      Gibt die Header von allen Containern eines Verzeichnisses zurück. Im Prinzip wird der gesamte Inhalt des Verwaltungsdatenindex zurückgegeben.
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Container-Verzeichnis
      Returns:
      die Header als IndexResult
      Throws:
      IndexException - Daten konnten nicht ermittelt werden
    • accessContainer

      @NotNull public ContainerFileHandle accessContainer(LockedContainerDirectory containerDirectory, long containerId) throws PersistenceException
      Greift auf einen Container zu
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Containerverzeichnis
      containerId - Id des Containers
      Returns:
      Container-Handle
      Throws:
      PersistenceException - Lesefehler
    • getBasePath

      public final Path getBasePath()
      Gibt das Verzeichnis auf dem Datenträger zurück.
      Returns:
      das Verzeichnis auf dem Datenträger
    • createDirectoriesIfAbsent

      public static Path createDirectoriesIfAbsent(Path path) throws PersistenceException
      Liefert ein File für das angegebene Verzeichnis. Wenn das Verzeichnis nicht existiert, wird es angelegt (lazy-Verhalten).
      Parameters:
      path - Verzeichnis
      Returns:
      Archiv-Pfad als File
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
    • rebuildStandardIndex

      public final void rebuildStandardIndex(ContainerManagementIndex managementIndex, BaseIndex<IndexValues> index, LockedContainerDirectory containerDirectory) throws IndexException
      Die Methode rebuildStandardIndex erstellt einen Standard-Index aus dem Verwaltungsdatenindex
      Parameters:
      managementIndex - Verwaltungsdatenindex
      index - Zu erzeugender Index (leer)
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten
      Throws:
      IndexException - Problem beim Index-Zugriff
    • handleUnclosedContainer

      protected void handleUnclosedContainer(ContainerManagementIndex managementIndex, LockedContainerDirectory containerDirectory, long contId, BaseIndex<IndexValues> index) throws IndexException
      Throws:
      IndexException
    • rebuildContainerHeaderIndex

      public void rebuildContainerHeaderIndex(IdContainerFileDir containerFileDir, ContainerManagementIndex containerHeaderIndex, @Nullable 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, HashSet<Long> knownMinDataIndexes, Map<Long,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
    • warnAboutSlowRestore

      public void warnAboutSlowRestore(IdContainerFileDir location, long currentEntries, 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
    • getLayoutInstance

      public final PersistenceDirectoryLayoutInstance getLayoutInstance()
    • getPath

      @NotNull @Contract(pure=true) public Path getPath(IdDataIdentification dataIdentification)
      Gibt zu einer Datenidentifikation das zugehörige Verzeichnis zurück. Die Simulationsvariante der Datenidentifikation muss mit getSimulationVariant() übereinstimmen.
      Parameters:
      dataIdentification - Datenidentifikation
      Returns:
      Verzeichnis
    • getPath

      @NotNull @Contract(pure=true) public Path getPath(ContainerDirectory containerDirectory)
      Gibt zu einem ContainerDirectory das zugehörige Verzeichnis zurück. Die Simulationsvariante der Datenidentifikation muss mit getSimulationVariant() übereinstimmen.
      Parameters:
      containerDirectory - Datenidentifikation und Archivdatenart, die das Containerverzeichnis identifizieren
      Returns:
      Verzeichnis
    • getIndexTree

      public IndexTree getIndexTree()
      Gibt die Verwaltung der Indexe zurück
      Returns:
      Klasse zum zugriff auf Indexdateien in diesem Verzeichnis
    • getLargeDataIdentifications

      public Set<IdContainerFileDir> getLargeDataIdentifications()
      Gibt ein Set zurück, dass alle bekannten Containerverzeichnisse enthält, die "übermäßig viel" Daten enthalten. Das Set ist thread-safe und änderbar.
      Returns:
      Set mit Containerverzeichnissen
    • getLockFile

      public Path getLockFile()
      Gibt den Pfad der Lockdatei zurück (unabhängig davon, ob diese gerade vorhanden ist).
      Returns:
      Potenzieller Pfad der Lockdatei
    • 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
    • openDeletedContainerFile

      public DeletedContainerFile openDeletedContainerFile(LockedContainerDirectory containerDirectory) throws PersistenceException, SynchronizationFailedException
      Die Methode openDeletedContainerFile öffnet die Datei mit den Informationen zu den gelöschten Containern
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Containerverzeichnis
      Returns:
      DeletedContainerFile
      Throws:
      PersistenceException - Lesefehler
      SynchronizationFailedException - Fehler bei Index-Synchronisation
    • iterator

      @NotNull public DataIterator iterator(de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, long containerId, IdDataIdentification dataIdentification) throws PersistenceException
      Erstellt einen Iterator über die Daten eines Containers. Der zurückgegebene Iterator muss nach Gebrauch geschlossen werden!
      Parameters:
      adk - Archivdatenart
      containerId - Container-ID
      dataIdentification - Datenidentifikation
      Returns:
      Iterator
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
    • removeContainerFromIndex

      public void removeContainerFromIndex(LockedContainerDirectory containerDirectory, long containerId) throws IndexException
      Die Methode removeContainerFromIndex löscht einen Container aus den Indexen
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Container-Verzeichnis
      containerId - von Typ long
      Throws:
      IndexException - wenn der Indexzugriff fehlschlägt
    • getIndexResult

      public IndexResult<IndexValues> getIndexResult(LockedContainerDirectory containerDirectory, SequenceSpecification sequenceSpecification) throws IndexException, SynchronizationFailedException
      Die Methode getIndexResult führt eine Index-Abfrage durch (für Archivanfragen und ähnliche Operationen)
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Container-Verzeichnis
      sequenceSpecification - der gewünschte Datenbereich, siehe SequenceSpecification
      Returns:
      IndexResult<IndexValues>
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException - wenn die Synchronisierung auf die Indexe fehlschlägt
    • rebuildIndexes

      public void rebuildIndexes(LockedContainerDirectory containerDirectory, @Nullable RebuildResult rebuildResult) throws IndexException
      Die Methode rebuildIndexes baut die Indexe in einem Verzeichnis erneut auf.
      Parameters:
      containerDirectory - Containerverzeichnis im exklusiven Zugriff, in dem die Indexdateien aufgebaut werden sollen
      rebuildResult - Ergebnis für Statistiken, optional
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
    • deleteIndexes

      public void deleteIndexes(LockedContainerDirectory containerDirectory, @Nullable RebuildResult rebuildResult) throws IndexException
      Die Methode deleteIndexes löscht alle Indexdateien in einem Verzeichnis.
      Parameters:
      containerDirectory - Containerverzeichnis im exklusiven Zugriff, in dem die Indexdateien gelöscht werden sollen
      rebuildResult - Ergebnis für Statistiken
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
    • maxContainerId

      public long maxContainerId(LockedContainerDirectory containerDirectory) throws IndexException
      Ermittelt maximale Container-ID in einem Verzeichnis.
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Containerverzeichnis
      Returns:
      Größte Container-ID im Verzeichnis
      Throws:
      IndexException - Lesefehler der Indexe (z. B. korrupt)
    • getSimulationVariant

      public int getSimulationVariant()
      Gibt die Simulationsvariante dieses Verzeichnisses zurück. In jedem Persistenz-Wochenverzeichnis wird nur eine einzelne Simulationsvariante verwaltet.
      Returns:
      die Simulationsvariante dieses Verzeichnisses
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • estimate

      public long estimate()
      Description copied from interface: CountEstimator
      Schätzt eine Anzahl
      Specified by:
      estimate in interface CountEstimator
      Returns:
      geschätzte Anzahl. Der Wert muss größer-gleich 0 sein und sollte der realen Anzahl möglichst gut entsprechen.
    • setCount

      public void setCount(long actualCount)
      Description copied from interface: CountEstimator
      Wird aufgerufen, wenn die richtige Anzahl (einmalig als Schnappschuss) ermittelt wurde. Eine Implementierung kann (muss aber nicht) den Wert nutzen, um zukünftige Schätzungen zu aktualisieren.
      Specified by:
      setCount in interface CountEstimator
      Parameters:
      actualCount - Momentanwert der tatsächlichen Anzahl
    • getDataRange

      public abstract DataRange getDataRange(LockedContainerDirectory directory) throws IndexException
      Ermittelt zu einem Containerverzeichnis den gesamten (ggf. in diesem Wochenverzeichnis) vorliegenden Datenbereich.
      Parameters:
      directory - Containerdatenidentifikation
      Returns:
      Datenbereich, insbesondere NoData.Instance wenn gar keine Daten vorliegen, ein ValidDataRange sonst.
      Throws:
      IndexException
    • computeDataRange

      protected DataRange computeDataRange(LockedContainerDirectory directory)