Class ActivePersistenceDirectory

java.lang.Object
de.bsvrz.ars.ars.persistence.directories.PersistenceDirectory
de.bsvrz.ars.ars.persistence.directories.ActivePersistenceDirectory
All Implemented Interfaces:
CountEstimator

public final class ActivePersistenceDirectory extends PersistenceDirectory
Diese Klasse steht für ein "aktives" (noch nicht abgeschlossenes) Persistenzverzeichnis, in das laufend Online-Daten archiviert werden. Daher bietet diese Klasse gegenüber der Basisklasse PersistenceDirectory, die für allgemeine Persistenzverzeichnisse (insbesondere im Nur-Lesen-Modus) benutzt wird weitere Funktionalitäten.
  • Field Details

    • REBUILD_INDEX_FILE_FLAG_NAME

      public static final String REBUILD_INDEX_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 gelöscht. 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 verworfen bzw. neu aufgebaut.
      See Also:
  • Constructor Details

    • ActivePersistenceDirectory

      public ActivePersistenceDirectory(@NotNull ContainerCreator containerCreator, @NotNull PersistenceDirectoryLayoutInstance layoutInstance)
      Erstellt ein neues ActivePersistenceDirectory.
      Parameters:
      containerCreator - Interface mit den benötigten Funktionen zum Erstellen von neuen Containern
      layoutInstance - Konkrete Instanz des zu benutzenden Verzeichnis-Layouts
  • Method Details

    • handleUnclosedContainer

      protected void handleUnclosedContainer(ContainerManagementIndex managementIndex, LockedContainerDirectory containerDirectory, long contId, BaseIndex<IndexValues> index) throws IndexException
      Overrides:
      handleUnclosedContainer in class PersistenceDirectory
      Throws:
      IndexException
    • updateContainerIndex

      protected static void updateContainerIndex(ContainerManagementData containerFile, ContainerManagementIndex index) throws PersistenceException
      Die Methode updateContainerIndex aktualisiert den Verwaltungsdatenindex
      Parameters:
      containerFile - Containerdaten, die in den Index eingefügt werden sollen (ersetzt ggf. vorhandene Einträge mit gleicher ContainerID)
      index - Verwaltungsdatenindex
      Throws:
      PersistenceException - wenn ein Fehler auftritt
    • accessOpenContainer

      public ContainerFileHandle accessOpenContainer(ContainerDirectory containerDirectory, 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:
      containerDirectory - Verzeichnis des Containers
      openContID - Id des offenen Containers.
      Returns:
      Containerhandle
      Throws:
      PersistenceException - Lesefehler
    • updateContainerIndex

      public void updateContainerIndex(ContainerManagementData managementData, LockedContainerDirectory containerDirectory) 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)
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten
      Throws:
      PersistenceException - wenn ein Fehler auftritt
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
    • getOpenContainerData

      @Nullable public StandardOpenContainerData getOpenContainerData(ContainerDirectory containerFileDir) throws IndexException, SynchronizationFailedException
      Die Methode getOpenContainerData die zwischengespeicherten Daten für den offenen Container zurück. Dieser Overload ohne ContainerManagementIndex-Parameter öffnet den Index, falls erforderlich.
      Parameters:
      containerFileDir - Containerverzeichnis
      Returns:
      StandardOpenContainerData oder null, falls kein offener Container existiert
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException - Synchronisierung fehlgeschlagen
    • getOpenContainerData

      @Nullable public StandardOpenContainerData getOpenContainerData(LockedContainerDirectory containerDirectory, ContainerManagementIndex containerManagementIndex)
      Die Methode getOpenContainerData ermittelt die Daten vom offenen Container. Dies ist eine optimierte Variante von getOpenContainerData(ContainerDirectory) wenn der ContainerManagementIndex bereits geladen wurde.
      Parameters:
      containerDirectory - Datenidentifikation/Verzeichnis des Containers
      containerManagementIndex - von Typ ContainerManagementIndex
      Returns:
      StandardOpenContainerData
    • getLoadedContainerData

      @Nullable public OpenContainerData getLoadedContainerData(ContainerDirectory containerDirectory)
      Entspricht etwa getOpenContainerData(), gibt die Daten aber nur zurück, wenn sie bereits bekannt sind, d.h. es wird nicht im letzten Container nachgesehen.
      Parameters:
      containerDirectory - Containerverzeichnis
      Returns:
      null, wenn kein OpenContainerData bekannt ist, NO_OPEN_CONTAINER, wenn bekannt ist, dass es keinen offenen Container gibt, sonst die Daten des offenen Containers
    • initOpenContainerData

      protected OpenContainerData initOpenContainerData(LockedContainerDirectory containerDirectory, ContainerManagementIndex headerIndex)
      Die Methode initOpenContainerData initialisiert die Daten eines geöffneten Containers. Da die Header des offenen Containers nicht aussagekräftig sind, muss im offenen Container im Regelfall über die Datensätze iteriert werden.

      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Containerdatenverzeichnis
      headerIndex - Verwaltungsdatenindex, um zu bestimmen welcher Container der offene ist (oder ob es überhaupt einen offenen gibt)
      Returns:
      StandardOpenContainerData
    • setOpenContainerData

      public void setOpenContainerData(LockedContainerDirectory containerDirectory, StandardOpenContainerData data)
      Setzt die Daten eines offenen Containers.
      Parameters:
      containerDirectory - Datenidentifikation/Verzeichnis des Containers
      data - Neue Daten
    • removeOpenContainerData

      public void removeOpenContainerData(ContainerDirectory containerDirectory)
      Setzt, dass es aktuell für eine Datenidentifikation keinen offenen Container mehr gibt.
      Parameters:
      containerDirectory - Datenidentifikation/Verzeichnis des Containers
    • deleteOpenContainerData

      public void deleteOpenContainerData(SyncKey<IdDataIdentification> lock, de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk)
      Löscht die Daten eines offenen Containers komplett, also auch die Information, dass es keinen offenen Container gibt. Hierdurch wird der Speicher freigegeben.
      Parameters:
      lock - Synchroniserungszugriffsschlüssel
      adk - Archivdatenart
    • openContainerDataSize

      public long openContainerDataSize()
      Gibt die Anzahl der Einträge in openContainerData zurück.
      Returns:
      die Anzahl der Einträge in openContainerData
    • getRebuildIdxFile

      @NotNull public Path getRebuildIdxFile(ContainerDirectory directory)
      Die Methode getRebuildIdxFile ermittelt den Speicherort für die _rebuildIndex.flag
      Parameters:
      directory - Datenidentifikation/Verzeichnis der Flag-Datei
      Returns:
      Path
    • createRebuildIxdFlagFile

      public void createRebuildIxdFlagFile(ContainerDirectory directory) throws PersistenceException
      Legt im Verzeichnis der Datenidentifikation ein FLAG-Datei an.
      Parameters:
      directory - Datenidentifikation/Verzeichnis der Flag-Datei
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
    • markAsDirty

      public void markAsDirty(ContainerDirectory directory) throws PersistenceException
      Erzeugt die Kennzeichen-Datei, ob die Indexe verändert wurden, um nach einem Absturz den Wiederanlauf zu beschleunigen.
      Parameters:
      directory - Datenidentifikation/Verzeichnis, das markiert werden soll
      Throws:
      PersistenceException - Lesefehler im Persistenzverzeichnis
    • markAsClean

      public void markAsClean(ContainerDirectory directory)
      Entfernt die Kennzeichen-Datei, ob die Indexe verändert wurden, um nach einem Absturz den Wiederanlauf zu beschleunigen.
      Parameters:
      directory - Datenidentifikation/Verzeichnis, mit Flag-Datei
    • flushIndexes

      public void flushIndexes(LockedContainerDirectory containerDirectory)
      Schreibt den aktuellen Stand der Indexe auf die Festplatte
      Parameters:
      containerDirectory - Datenidentifikation/Verzeichnis, in dem die Indexe geflusht werden sollen
    • maxATime

      public long maxATime(ContainerDirectory containerDirectory) throws IndexException, SynchronizationFailedException
      Die Methode maxATime gibt die maximale Archivzeit einer Datenidentifikation zurück
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Containerverzeichnis
      Returns:
      long
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException - Synchronisierung auf Indexe fehlgeschlagen
    • getOpenContID

      public long getOpenContID(ContainerDirectory containerDirectory) throws IndexException, SynchronizationFailedException
      Die Methode getOpenContID gibt die ID des offenen Containers für eine Datenidentifikation zurück
      Parameters:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Containerverzeichnis
      Returns:
      long oder -1 falls es keinen offenen Container gibt
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException - Synchronisierung auf Indexe fehlgeschlagen
    • 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 aktualisiert dabei die Daten vom offenen Container im Index
      Overrides:
      getIndexResult in class PersistenceDirectory
      Parameters:
      sequenceSpecification - von Typ ArchiveTimeSpecification
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten Container-Verzeichnis
      Returns:
      IndexResult<IndexValues>
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException - wenn die Synchronisierung auf die Indexe fehlschlägt
    • estimate

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

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

      public void addIndexEntries(LockedContainerDirectory containerDirectory, long dataIdx, long arsTime, long dataTime, long openContID) throws IndexException
      Die Methode addIndexEntries fügt einem Index Werte hinzu.
      Parameters:
      containerDirectory - Datenidentifikation/Verzeichnis, in dem die Indexwerte hinzugefügt werden sollen
      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(LockedContainerDirectory containerDirectory) throws IndexException
      Die Methode updateStandardIndexes aktualisiert die Indexe mit dem zuletzt gesicherten OpenContainerData.
      Parameters:
      containerDirectory - Datenidentifikation/Verzeichnis, in dem die Indexwerte aktualisiert werden sollen
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
    • updateStandardIndexes

      public void updateStandardIndexes(LockedContainerDirectory containerDirectory, StandardOpenContainerData data) throws IndexException
      Die Methode updateStandardIndexes fügt einem Index Werte hinzu oder aktualisiert die vorhandenen Werte.
      Parameters:
      containerDirectory - Datenidentifikation/Verzeichnis, in dem die Indexwerte aktualisiert werden sollen
      data - von Typ OpenContainerData
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
    • updateMaxValues

      public void updateMaxValues(ContainerDirectory containerDirectory, 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:
      containerDirectory - Containerverzeichnis
      dataIdx - Datenindex
      arsTime - Archivzeit
      dataTime - Datenzeit
      Throws:
      IndexException - wenn ein Problem beim Zugriff auf den Index auftritt
      SynchronizationFailedException - Synchronisierung auf Indexe fehlgeschlagen
    • closeIndexes

      public void closeIndexes(int numThreads) throws InterruptedException
      Schließt/Flusht alle Indexdateien und wartet bis alle Indexe geschlossen wurden
      Parameters:
      numThreads - Anzahl Threads fürs parallele Schließen
      Throws:
      InterruptedException - Unterbrochen beim Warten auf die Threads
    • closeOpenContainer

      public void closeOpenContainer(LockedContainerDirectory containerDirectory) throws IndexException, SynchronizationFailedException
      Schließt den offenen Container in einem Verzeichnis ab.
      Parameters:
      containerDirectory - Verzeichnis
      Throws:
      IndexException - Fehler beim Schreiben der Indexe
      SynchronizationFailedException - Fehler beim Synchronisieren auf die Indexe der Datenidentifikation
    • closePermanently

      public void closePermanently() throws InterruptedException, PersistenceException
      Schließt dieses Persistenz-Wochenverzeichnis dauerhaft ab, schließt also alle Container und Indexe.
      Throws:
      InterruptedException - Unterbrochen beim Warten auf Beendigung des Abschließens
      PersistenceException - Schreibfehler beim Container schließen
    • getDirtyDirectoriesSize

      public long getDirtyDirectoriesSize()