Klasse PersistenceManager

java.lang.Object
de.bsvrz.ars.ars.persistence.PersistenceManager
Alle implementierten Schnittstellen:
TaskManager, TaskManagerInterface, ContainerCreator, DataIdentificationManager, DataGapManager

public final class PersistenceManager extends Object implements ContainerCreator, DataGapManager, TaskManager
Zentrale Persistenz-Verwaltung für die Archivierung von Daten auf einem Speichermedium vom Typ A (Festplatte) und die entsprechende Meta-Daten-Verwaltung.
  • Felddetails

    • BACKUP_DIR_NAME

      public static final String BACKUP_DIR_NAME
      Name des Verzeichnisses für das Datenkonsistente Backup
      Siehe auch:
    • RESTART_TIME_FILE_NAME

      public static final String RESTART_TIME_FILE_NAME
      Name der Datei mit den Datenzeitinformationen für den Neustart
      Siehe auch:
  • Konstruktordetails

    • PersistenceManager

      public PersistenceManager(TaskManagerInterface archMgr, Path archPath, TimeDomain<?> domain)
      Erzeugt den Persistenz-Manager.
      Parameter:
      archMgr - Archiv-Manager oder andere Implementierung von TaskManagerInterface (insb. für Tests)
      archPath - Archivierungs-Verzeichnis
      domain - Klasse, die die Unterteilung der Persistenzverzeichnisse definiert
  • Methodendetails

    • setDeleteBrokenContainers

      public static void setDeleteBrokenContainers(boolean deleteBrokenContainers)
      Setzt, ob defekte Containerdateien umbenannt werden sollen
      Parameter:
      deleteBrokenContainers - Sollen defekte Containerdateien umbenannt werden?
    • shouldDeleteBrokenContainers

      public boolean shouldDeleteBrokenContainers()
      Beschreibung aus Schnittstelle kopiert: DataIdentificationManager
      Gibt zurück, ob bei Fehlern beim Lesen von Containerdateien die Datei umbenannt (und damit deaktiviert) werden soll.
      Angegeben von:
      shouldDeleteBrokenContainers in Schnittstelle DataIdentificationManager
      Gibt zurück:
      Defekte Container umbenennen/löschen?
    • getGapFilePath

      @NotNull public Path getGapFilePath(IdDataIdentification dataIdentification)
      Gibt den Dateipfad zurück, in dem Lückendateien gespeichert werden sollen
      Parameter:
      dataIdentification - Datenidentifikation
      Gibt zurück:
      Dateipfad
    • initialize

      Initialisiert die vorhandenen Wochenverzeichnisse von der Festplatte
      Löst aus:
      IOException - Lesefehler
      InterruptedException - Unterbrochen
      PersistenceException - Lesefehler
      DirectoryIsLockedException - Das aktuelle Persistenzverzeichnis ist noch gesperrt (_isActive.flag-Datei existiert)
    • 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.
      Parameter:
      syncKey - Schlüssel für Zugriff auf Indexknoten
      Löst aus:
      PersistenceException - Schreibfehler im Persistenzverzeichnis
    • deletePath

      public static void deletePath(Path path) throws IOException
      Löscht ein Verzeichnis inklusive enthaltener Dateien.
      Parameter:
      path - Verzeichnis
      Löst aus:
      IOException - Mögliche Exception
    • prepareShutdown

      public void prepareShutdown() throws InterruptedException
      Die Methode prepareShutdown wird beim Herunterfahren des Archivsystems ausgeführt.
      Löst aus:
      InterruptedException - Wenn der Thread beim Warten auf das Schließen der Indexdateien unterbrochen wurde
    • startupProcedure

      public boolean startupProcedure(RebuildMode rebuildMode)
      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 (zwecks 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.
      Parameter:
      rebuildMode - Wiederherstellungsmodus
      Gibt zurück:
      Wahr, falls der Durchlauf des Persistenzverzeichnisses erfolgreich war und das Archivsystem starten kann, falsch sonst.
    • getStatistics

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

      public long nextContainerID()
      Erhoeht nextContainerID um 1 und gibt den Wert zurück.
      Angegeben von:
      nextContainerID in Schnittstelle ContainerCreator
      Gibt zurück:
      als nächste zu verwendende Container-ID
    • getCloseThreadCount

      public int getCloseThreadCount()
      Beschreibung aus Schnittstelle kopiert: ContainerCreator
      Gibt die Anzahl Threads zurück, die für das Schließen von Container- und Indexdateien benutzt werden sollen.
      Angegeben von:
      getCloseThreadCount in Schnittstelle ContainerCreator
      Gibt zurück:
      Anzahl Threads (>= 1)
    • getLastContainerID

      public long getLastContainerID()
      Gibt zurück:
      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 potenziellen Datenlücken verwendet.
    • saveUnsubscriptionTime

      public void saveUnsubscriptionTime(com.google.common.collect.Multimap<Long,IdDataIdentification> didForUnsubscriptionTime, 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 potenziellen Datenlücken verwendet.
      Parameter:
      didForUnsubscriptionTime - Zu schreibende Zeitstempel
      unsubscriptionFile - Datei, die geschrieben wird.
    • getLastContainerHeaders

      @Nullable public ContainerHeaders getLastContainerHeaders(LockedContainerDirectory containerDirectory) throws IndexException
      Ermittelt die Header vom letzten Container (vom Container mit der größten ID)
      Parameter:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten (Datenidentifikation + ADK, unabhängig vom spezifischen Persistenzverzeichnis)
      Gibt zurück:
      ContainerHeaders
      Löst aus:
      IndexException - wenn der Indexzugriff fehlschlägt
    • getLastDataSet

      Ermittelt den zuletzt archivierten Datensatz einer Datenidentifikation und Datenart
      Parameter:
      containerDirectory - Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten (Datenidentifikation + ADK, unabhängig vom spezifischen Persistenzverzeichnis)
      Gibt zurück:
      ContainerHeaders
      Löst aus:
      IndexException - wenn der Indexzugriff fehlschlägt
      SynchronizationFailedException - Synchronisierung fehlgeschlagen
      PersistenceException - Persistenzfehler
    • lockIndex

      Beschreibung aus Schnittstelle kopiert: DataIdentificationManager
      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.

      Angegeben von:
      lockIndex in Schnittstelle DataIdentificationManager
      Parameter:
      dataIdentification - Datenidentifikation
      Gibt zurück:
      Lock
      Löst aus:
      SynchronizationFailedException - Synchronisierung ist fehlgeschlagen (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.
      Gibt zurück:
      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.
    • getActivePersistenceDirectory

      @Nullable public ActivePersistenceDirectory getActivePersistenceDirectory(int simVariant)
      Gibt das aktive Persistenzverzeichnis (in das gerade aktiviert wird) zurück.
      Parameter:
      simVariant - Simulationsvariante
      Gibt zurück:
      Persistenzverzeichnis, oder null, wenn gerade keines zum Beschreiben benutzt wird.
    • getPersistenceDirectories

      public List<? extends PersistenceDirectory> getPersistenceDirectories(int simVariant, SequenceSpecification sequenceSpecification)
      Ermittelt relevante Persistenzverzeichnisse. Achtung: Die zurückgegebenen Verzeichnisse sind grob nach der angegebenen SequenceSpecification gefiltert. D. h. der Anfangs-Zustand und ein ggf. nachfolgender Datensatz fehlen in sehr ungünstigen Fällen eventuell, und zwar wenn die Grenze des Anfragebereichs genau auf einem Wechsel des Wochenverzeichnisses liegt.

      Daher muss in diesen Fällen #validateIndexResult aufgerufen werden.

      Parameter:
      simVariant - Simulationsvariante (oder 0 für "normale" Daten)
      sequenceSpecification - Anfragebereich
      Gibt zurück:
      Liste mit Persistenzverzeichnissen
    • getPersistenceDirectories

      public List<? extends PersistenceDirectory> getPersistenceDirectories(int simVariant)
      Gibt alle Persistenzverzeichnisse einer Simulationsvariante zurück.
      Parameter:
      simVariant - Simulationsvariante (oder 0 für "normale" Daten)
      Gibt zurück:
      alle Persistenzverzeichnisse, die zurückgegebene Liste ist immutable.
    • getIndexResult

      public LocatedIndexResult<IndexValues> getIndexResult(LockedContainerDirectory containerDirectory, de.bsvrz.dav.daf.main.archive.ArchiveTimeSpecification archiveTimeSpecification) throws IndexException
      Führt eine Index-Abfrage über mehrere Persistenzverzeichnisse durch
      Parameter:
      containerDirectory - Gelocktes Containerverzeichnis
      archiveTimeSpecification - Archivzeitspezifikation
      Gibt zurück:
      Index-Ergebnis
      Löst aus:
      IndexException - Fehler beim Index-Zugriff
    • getIndexResult

      public LocatedIndexResult<IndexValues> getIndexResult(LockedContainerDirectory containerDirectory, SequenceSpecification sequenceSpecification) throws IndexException
      Führt eine Index-Abfrage über mehrere Persistenzverzeichnisse durch
      Parameter:
      containerDirectory - Gelocktes Containerverzeichnis
      sequenceSpecification - Abfragebereich
      Gibt zurück:
      Index-Ergebnis
      Löst aus:
      IndexException - Fehler beim Index-Zugriff
    • createSequenceFromArchiveTimeSpecification

      public SequenceSpecification createSequenceFromArchiveTimeSpecification(de.bsvrz.dav.daf.main.archive.ArchiveTimeSpecification ats, LockedContainerDirectory containerDirectory) throws IndexException
      Konvertiert eine ArchiveTimeSpecification (aus einer Anfrage) in eine SequenceSpecification. Es werden nur absolute ArchiveTimeSpecification-Objekte unterstützt.
      Parameter:
      ats - Archivzeitspezifikation
      containerDirectory - Containerverzeichnis
      Gibt zurück:
      SequenceSpecification
      Löst aus:
      IndexException - Fehler beim Index-Zugriff
    • getBackupConfigurationDirectory

      public Path getBackupConfigurationDirectory()
    • deletePersistenceDirectory

      public void deletePersistenceDirectory(ActivePersistenceDirectory directory) throws PersistenceException
      Löscht das Persistenzverzeichnis von einer Simulation komplett vom Datenträger. Es dürfen keine Verzeichnisse übergeben werden, die nicht von Simulationen können, dann wird ein Fehler geworfen.
      Parameter:
      directory - Persistenzverzeichnis der Simulation.
      Löst aus:
      PersistenceException - Fehler beim Löschen
    • updateArchTime

      public void updateArchTime(long archTime) throws PersistenceException
      Diese Methode wird aufgerufen, um die aktuelle Archivzeit zu setzen. Diese Methode wird aufgerufen, bevor ein Datensatz archiviert wird, damit die Persistenzschicht die erforderlichen Arbeiten durchführen kann, also z. B. ein neues Wochenverzeichnis anzulegen.
      Parameter:
      archTime - Aktuelle Archivzeit
      Löst aus:
      PersistenceException - Fehler beim Erstellen eines neuen Persistenzverzeichnisses
    • updateAndGetActivePersistenceDirectory

      @NotNull public ActivePersistenceDirectory updateAndGetActivePersistenceDirectory(long archTime, int simVariant) throws PersistenceException
      Diese Methode wird aufgerufen, um die aktuelle Archivzeit zu setzen und gibt gleichzeitig das zugehörige aktive Persistenzverzeichnis zurück. Diese Methode wird aufgerufen, bevor ein Datensatz archiviert wird, damit die Persistenzschicht die erforderlichen Arbeiten durchführen kann, also z. B. ein neues Wochenverzeichnis anzulegen.

      Im Gegensatz zu getActivePersistenceDirectory(int) wird nie null zurückgegeben.

      Parameter:
      archTime - Aktuelle Archivzeit
      simVariant - Simulationsvariante
      Gibt zurück:
      Persistenzverzeichnis für die angegebenen Dateninformationen.
      Löst aus:
      PersistenceException - Fehler beim Erstellen eines neuen Persistenzverzeichnisses
    • getRootPath

      public Path getRootPath()
      Gibt das Wurzelverzeichnis der Persistenz zurück.
      Gibt zurück:
      Wurzelverzeichnis
    • getPersistenceDirectoryManager

      public PersistenceDirectoryManager getPersistenceDirectoryManager()
      Gibt die Verwaltung der einzelnen Unterverzeichnisse zurück.
      Gibt zurück:
      Verwaltungsschicht für Verzeichnisse
    • getDataIdentTree

      public DataIdentTree getDataIdentTree()
      Beschreibung aus Schnittstelle kopiert: ContainerCreator
      Gibt den DataIdentTree zurück, der zu Datenidentifikationen zusatzinformationen enthält.
      Angegeben von:
      getDataIdentTree in Schnittstelle ContainerCreator
      Gibt zurück:
      den DataIdentTree
    • getIndexCacheMaxSize

      public int getIndexCacheMaxSize()
      Beschreibung aus Schnittstelle kopiert: DataIdentificationManager
      Gibt die maximale Größe für Index-Caches zurück
      Angegeben von:
      getIndexCacheMaxSize in Schnittstelle DataIdentificationManager
      Angegeben von:
      getIndexCacheMaxSize in Schnittstelle TaskManagerInterface
      Gibt zurück:
      Maximale Größe in Bytes
    • formatObj

      public String formatObj(long objId)
      Die Methode formatObj gibt eine Objekt-ID als lesbaren String aus (z. B. ermitteln der Pid falls möglich)
      Angegeben von:
      formatObj in Schnittstelle DataIdentificationManager
      Parameter:
      objId - von Typ long
      Gibt zurück:
      String
    • isRangeUnavailable

      public boolean isRangeUnavailable(long fromArchiveTime, long toArchiveTime)
      Beschreibung aus Schnittstelle kopiert: DataGapManager
      Prüft, ob sich Teile des Persistenzverzeichnisses zwischen 2 Datensätzen nicht mehr im direkten Zugriff befinden, also ausgelagert oder gelöscht wurden. Es wird davon ausgegangen, dass die Zeitstempel selbst zu Daten gehören, die gelesen wurden und also noch im Zugriff sind.
      Angegeben von:
      isRangeUnavailable in Schnittstelle DataGapManager
      Parameter:
      fromArchiveTime - Start-Archivzeit in Epoch-Millis
      toArchiveTime - End-Archivzeit in Epoch-Millis
      Gibt zurück:
      true, falls der Bereich nicht vollständig verfügbar ist
    • wasTerminated

      public boolean wasTerminated()
      Beschreibung aus Schnittstelle kopiert: TaskManagerInterface
      Gibt true zurück, wenn das System terminiert wurde.
      Angegeben von:
      wasTerminated in Schnittstelle TaskManagerInterface
      Gibt zurück:
      true, wenn das System terminiert wurde, sonst false
    • getNumCloseIndexThreads

      public int getNumCloseIndexThreads()
      Angegeben von:
      getNumCloseIndexThreads in Schnittstelle TaskManagerInterface
    • getRuntimeControl

      @Nullable public RuntimeControl getRuntimeControl()
      Beschreibung aus Schnittstelle kopiert: TaskManagerInterface
      Gibt die aktuelle Laufzeitsteuerung zurück. Falls das System noch nicht voll initialisiert ist, wird null zurückgegeben.
      Angegeben von:
      getRuntimeControl in Schnittstelle TaskManagerInterface
      Gibt zurück:
      die aktuelle Laufzeitsteuerung
    • suspendTaskIfNecessary

      public void suspendTaskIfNecessary(Task task) throws InterruptedException
      Beschreibung aus Schnittstelle kopiert: TaskManagerInterface
      Die Methode blockiert und hält damit den aufrufenden Task an, wenn dies (z. B. wegen Überlastung) notwendig ist.
      Angegeben von:
      suspendTaskIfNecessary in Schnittstelle TaskManagerInterface
      Parameter:
      task - Task
      Löst aus:
      InterruptedException - Unterbrochen beim Anhalten
    • countDataInQueues

      public long countDataInQueues()
      Angegeben von:
      countDataInQueues in Schnittstelle TaskManagerInterface
    • estimateQueueMemoryUsage

      public long estimateQueueMemoryUsage()
      Angegeben von:
      estimateQueueMemoryUsage in Schnittstelle TaskManagerInterface
    • getNumCheckPersistenceThreads

      public int getNumCheckPersistenceThreads()
      Angegeben von:
      getNumCheckPersistenceThreads in Schnittstelle TaskManagerInterface
    • getPersistenceManager

      public PersistenceManager getPersistenceManager()
      Beschreibung aus Schnittstelle kopiert: TaskManager
      Gibt den PersistenzManager zurück.
      Angegeben von:
      getPersistenceManager in Schnittstelle TaskManager
      Gibt zurück:
      den PersistenzManager