Class PersistenceManager
- All Implemented Interfaces:
TaskManager
,TaskManagerInterface
,ContainerCreator
,DataIdentificationManager
,DataGapManager
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionclass
Klasse die Statistiken wie Queue-Größe oder Speicherverbrauch enthält, die z. -
Field Summary
Fields -
Constructor Summary
ConstructorsConstructorDescriptionPersistenceManager
(TaskManagerInterface archMgr, Path archPath, TimeDomain<?> domain) Erzeugt den Persistenz-Manager. -
Method Summary
Modifier and TypeMethodDescriptionvoid
Testmethode fürs Debugging, stellt sicher, dass aktuell keine Locks vom aktuellen Thread gehalten werden.long
createSequenceFromArchiveTimeSpecification
(de.bsvrz.dav.daf.main.archive.ArchiveTimeSpecification ats, LockedContainerDirectory containerDirectory) Konvertiert eineArchiveTimeSpecification
(aus einer Anfrage) in eineSequenceSpecification
.static void
deletePath
(Path path) Löscht ein Verzeichnis inklusive enthaltener Dateien.void
Löscht das Persistenzverzeichnis von einer Simulation komplett vom Datenträger.void
deleteSimVar
(SyncKey<IdDataIdentification> syncKey) Diese Methode loescht das komplette Verzeichnis einesDataIdentNode
mit allen Unterverzeichnissen der Datensatzarten und aller darin befindlichen Datencontainern; damit werden alle archivierten Datensätze einer Simulationsvariante geloescht.long
formatObj
(long objId) Die Methode formatObj gibt eine Objekt-ID als lesbaren String aus (z.getActivePersistenceDirectory
(int simVariant) Gibt das aktive Persistenzverzeichnis (in das gerade aktiviert wird) zurück.int
Gibt die Anzahl Threads zurück, die für das Schließen von Container- und Indexdateien benutzt werden sollen.Gibt den DataIdentTree zurück, der zu Datenidentifikationen zusatzinformationen enthält.getGapFilePath
(IdDataIdentification dataIdentification) Gibt den Dateipfad zurück, in dem Lückendateien gespeichert werden sollenint
Gibt die maximale Größe für Index-Caches zurückcom.google.common.collect.SetMultimap<IdDataIdentification,
SyncKey<IdDataIdentification>> Gibt alle aktuell genutzten Locks zur Synchronisation auf die Datenidentifikationen zurück.getIndexResult
(LockedContainerDirectory containerDirectory, SequenceSpecification sequenceSpecification) Führt eine Index-Abfrage über mehrere Persistenzverzeichnisse durchgetIndexResult
(LockedContainerDirectory containerDirectory, de.bsvrz.dav.daf.main.archive.ArchiveTimeSpecification archiveTimeSpecification) Führt eine Index-Abfrage über mehrere Persistenzverzeichnisse durchgetLastContainerHeaders
(LockedContainerDirectory containerDirectory) Ermittelt die Header vom letzten Container (vom Container mit der größten ID)long
getLastDataSet
(LockedContainerDirectory containerDirectory) Ermittelt den zuletzt archivierten Datensatz einer Datenidentifikation und Datenartint
int
List<? extends PersistenceDirectory>
getPersistenceDirectories
(int simVariant) Gibt alle Persistenzverzeichnisse einer Simulationsvariante zurück.List<? extends PersistenceDirectory>
getPersistenceDirectories
(int simVariant, SequenceSpecification sequenceSpecification) Ermittelt relevante Persistenzverzeichnisse.Gibt die Verwaltung der einzelnen Unterverzeichnisse zurück.Gibt den PersistenzManager zurück.Gibt das Wurzelverzeichnis der Persistenz zurück.Gibt die aktuelle Laufzeitsteuerung zurück.Gibt Statistiken von diesem PersistenceManager-Objekt zurück.void
Initialisiert die vorhandenen Wochenverzeichnisse von der Festplatteboolean
isRangeUnavailable
(long fromArchiveTime, long toArchiveTime) Prüft, ob sich Teile des Persistenzverzeichnisses zwischen 2 Datensätzen nicht mehr im direkten Zugriff befinden, also ausgelagert oder gelöscht wurden.lockIndex
(IdDataIdentification dataIdentification) Muss immer vor Zugriffen auf den kritischen Bereich (die Indexe oder Container) der Datenidentifikation aufgerufen werden.long
Erhoeht nextContainerID um 1 und gibt den Wert zurück.void
Die Methode prepareShutdown wird beim Herunterfahren des Archivsystems ausgeführt.void
Sichert den letzten Zeitpunkt, wo gültige Daten empfangen wurden bzw. beim Beenden wo Daten abgemeldet wurden.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.static void
setDeleteBrokenContainers
(boolean deleteBrokenContainers) Setzt, ob defekte Containerdateien umbenannt werden sollenboolean
Gibt zurück, ob bei Fehlern beim Lesen von Containerdateien die Datei umbenannt (und damit deaktiviert) werden soll.boolean
startupProcedure
(RebuildMode rebuildMode) Versucht, die StartUp-Properties-Datei einzulesen.void
suspendTaskIfNecessary
(Task task) Die Methode blockiert und hält damit den aufrufenden Task an, wenn dies (z.updateAndGetActivePersistenceDirectory
(long archTime, int simVariant) Diese Methode wird aufgerufen, um die aktuelle Archivzeit zu setzen und gibt gleichzeitig das zugehörige aktive Persistenzverzeichnis zurück.void
updateArchTime
(long archTime) Diese Methode wird aufgerufen, um die aktuelle Archivzeit zu setzen.boolean
Gibttrue
zurück, wenn das System terminiert wurde.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface de.bsvrz.ars.ars.persistence.DataIdentificationManager
formatContainerDirectory, lockIndex
-
Field Details
-
BACKUP_DIR_NAME
Name des Verzeichnisses für das Datenkonsistente Backup- See Also:
-
RESTART_TIME_FILE_NAME
Name der Datei mit den Datenzeitinformationen für den Neustart- See Also:
-
-
Constructor Details
-
PersistenceManager
Erzeugt den Persistenz-Manager.- Parameters:
archMgr
- Archiv-Manager oder andere Implementierung vonTaskManagerInterface
(insb. für Tests)archPath
- Archivierungs-Verzeichnisdomain
- Klasse, die die Unterteilung der Persistenzverzeichnisse definiert
-
-
Method Details
-
setDeleteBrokenContainers
public static void setDeleteBrokenContainers(boolean deleteBrokenContainers) Setzt, ob defekte Containerdateien umbenannt werden sollen- Parameters:
deleteBrokenContainers
- Sollen defekte Containerdateien umbenannt werden?
-
shouldDeleteBrokenContainers
public boolean shouldDeleteBrokenContainers()Description copied from interface:DataIdentificationManager
Gibt zurück, ob bei Fehlern beim Lesen von Containerdateien die Datei umbenannt (und damit deaktiviert) werden soll.- Specified by:
shouldDeleteBrokenContainers
in interfaceDataIdentificationManager
- Returns:
- Defekte Container umbenennen/löschen?
-
getGapFilePath
Gibt den Dateipfad zurück, in dem Lückendateien gespeichert werden sollen- Parameters:
dataIdentification
- Datenidentifikation- Returns:
- Dateipfad
-
initialize
public void initialize() throws IOException, InterruptedException, PersistenceException, DirectoryIsLockedExceptionInitialisiert die vorhandenen Wochenverzeichnisse von der Festplatte- Throws:
IOException
- LesefehlerInterruptedException
- UnterbrochenPersistenceException
- LesefehlerDirectoryIsLockedException
- Das aktuelle Persistenzverzeichnis ist noch gesperrt (_isActive.flag-Datei existiert)
-
deleteSimVar
Diese Methode loescht das komplette Verzeichnis einesDataIdentNode
mit allen Unterverzeichnissen der Datensatzarten und aller darin befindlichen Datencontainern; damit werden alle archivierten Datensätze einer Simulationsvariante geloescht. DerDataIdentNode
muss in der Verwaltung aus demDataIdentTree
geloescht werden. Falls die Simulationsvariante gleich null ist, oder das Verzeichnis nicht geloescht werden konnte, wird einePersistenceException
geworfen.- Parameters:
syncKey
- Schlüssel für Zugriff auf Indexknoten- Throws:
PersistenceException
- Schreibfehler im Persistenzverzeichnis
-
deletePath
Löscht ein Verzeichnis inklusive enthaltener Dateien.- Parameters:
path
- Verzeichnis- Throws:
IOException
- Mögliche Exception
-
prepareShutdown
Die Methode prepareShutdown wird beim Herunterfahren des Archivsystems ausgeführt.- Throws:
InterruptedException
- Wenn der Thread beim Warten auf das Schließen der Indexdateien unterbrochen wurde
-
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 inInQueuesMgr.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 inprepareShutdown()
die Datei neu geschrieben. Daran kann das ArS beim nächsten Start erkennen, ob es ordnungsgemäß heruntergefahren wurde oder ob ein Wiederherstellungslauf erforderlich ist.- Parameters:
rebuildMode
- Wiederherstellungsmodus- Returns:
- Wahr, falls der Durchlauf des Persistenzverzeichnisses erfolgreich war und das Archivsystem starten kann, falsch sonst.
-
getStatistics
Gibt Statistiken von diesem PersistenceManager-Objekt zurück.- Returns:
- Statistiken (Typ Statistics)
-
nextContainerID
public long nextContainerID()Erhoeht nextContainerID um 1 und gibt den Wert zurück.- Specified by:
nextContainerID
in interfaceContainerCreator
- Returns:
- als nächste zu verwendende Container-ID
-
getCloseThreadCount
public int getCloseThreadCount()Description copied from interface:ContainerCreator
Gibt die Anzahl Threads zurück, die für das Schließen von Container- und Indexdateien benutzt werden sollen.- Specified by:
getCloseThreadCount
in interfaceContainerCreator
- Returns:
- Anzahl Threads (>= 1)
-
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 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.- Parameters:
didForUnsubscriptionTime
- Zu schreibende ZeitstempelunsubscriptionFile
- 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)- Parameters:
containerDirectory
- Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten (Datenidentifikation + ADK, unabhängig vom spezifischen Persistenzverzeichnis)- Returns:
- ContainerHeaders
- Throws:
IndexException
- wenn der Indexzugriff fehlschlägt
-
getLastDataSet
@Nullable public ContainerDataResult getLastDataSet(LockedContainerDirectory containerDirectory) throws IndexException, PersistenceException, SynchronizationFailedException Ermittelt den zuletzt archivierten Datensatz einer Datenidentifikation und Datenart- Parameters:
containerDirectory
- Referenz auf die gelockte Datenidentifikation und Datenart für den Zugriff auf Containerdaten (Datenidentifikation + ADK, unabhängig vom spezifischen Persistenzverzeichnis)- Returns:
- ContainerHeaders
- Throws:
IndexException
- wenn der Indexzugriff fehlschlägtSynchronizationFailedException
- Synchronisierung fehlgeschlagenPersistenceException
- Persistenzfehler
-
lockIndex
public SyncKey<IdDataIdentification> lockIndex(IdDataIdentification dataIdentification) throws SynchronizationFailedException Description copied from interface: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 einReentrantLock
, es ist also möglich, ein zweites Lock zu erhalten, wenn bereits ein Lock geholt wurde.- Specified by:
lockIndex
in interfaceDataIdentificationManager
- Parameters:
dataIdentification
- Datenidentifikation- Returns:
- Lock
- Throws:
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.- 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. -
getActivePersistenceDirectory
Gibt das aktive Persistenzverzeichnis (in das gerade aktiviert wird) zurück.- Parameters:
simVariant
- Simulationsvariante- Returns:
- 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 angegebenenSequenceSpecification
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.
- Parameters:
simVariant
- Simulationsvariante (oder 0 für "normale" Daten)sequenceSpecification
- Anfragebereich- Returns:
- Liste mit Persistenzverzeichnissen
-
getPersistenceDirectories
Gibt alle Persistenzverzeichnisse einer Simulationsvariante zurück.- Parameters:
simVariant
- Simulationsvariante (oder 0 für "normale" Daten)- Returns:
- 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- Parameters:
containerDirectory
- Gelocktes ContainerverzeichnisarchiveTimeSpecification
- Archivzeitspezifikation- Returns:
- Index-Ergebnis
- Throws:
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- Parameters:
containerDirectory
- Gelocktes ContainerverzeichnissequenceSpecification
- Abfragebereich- Returns:
- Index-Ergebnis
- Throws:
IndexException
- Fehler beim Index-Zugriff
-
createSequenceFromArchiveTimeSpecification
public SequenceSpecification createSequenceFromArchiveTimeSpecification(de.bsvrz.dav.daf.main.archive.ArchiveTimeSpecification ats, LockedContainerDirectory containerDirectory) throws IndexException Konvertiert eineArchiveTimeSpecification
(aus einer Anfrage) in eineSequenceSpecification
. Es werden nur absoluteArchiveTimeSpecification
-Objekte unterstützt.- Parameters:
ats
- ArchivzeitspezifikationcontainerDirectory
- Containerverzeichnis- Returns:
- SequenceSpecification
- Throws:
IndexException
- Fehler beim Index-Zugriff
-
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.- Parameters:
directory
- Persistenzverzeichnis der Simulation.- Throws:
PersistenceException
- Fehler beim Löschen
-
updateArchTime
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.- Parameters:
archTime
- Aktuelle Archivzeit- Throws:
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 nienull
zurückgegeben.- Parameters:
archTime
- Aktuelle ArchivzeitsimVariant
- Simulationsvariante- Returns:
- Persistenzverzeichnis für die angegebenen Dateninformationen.
- Throws:
PersistenceException
- Fehler beim Erstellen eines neuen Persistenzverzeichnisses
-
getRootPath
Gibt das Wurzelverzeichnis der Persistenz zurück.- Returns:
- Wurzelverzeichnis
-
getPersistenceDirectoryManager
Gibt die Verwaltung der einzelnen Unterverzeichnisse zurück.- Returns:
- Verwaltungsschicht für Verzeichnisse
-
getDataIdentTree
Description copied from interface:ContainerCreator
Gibt den DataIdentTree zurück, der zu Datenidentifikationen zusatzinformationen enthält.- Specified by:
getDataIdentTree
in interfaceContainerCreator
- Returns:
- den DataIdentTree
-
getIndexCacheMaxSize
public int getIndexCacheMaxSize()Description copied from interface:DataIdentificationManager
Gibt die maximale Größe für Index-Caches zurück- Specified by:
getIndexCacheMaxSize
in interfaceDataIdentificationManager
- Specified by:
getIndexCacheMaxSize
in interfaceTaskManagerInterface
- Returns:
- Maximale Größe in Bytes
-
formatObj
Die Methode formatObj gibt eine Objekt-ID als lesbaren String aus (z. B. ermitteln der Pid falls möglich)- Specified by:
formatObj
in interfaceDataIdentificationManager
- Parameters:
objId
- von Typ long- Returns:
- String
-
wasTerminated
public boolean wasTerminated()Description copied from interface:TaskManagerInterface
Gibttrue
zurück, wenn das System terminiert wurde.- Specified by:
wasTerminated
in interfaceTaskManagerInterface
- Returns:
true
, wenn das System terminiert wurde, sonstfalse
-
getNumCloseIndexThreads
public int getNumCloseIndexThreads()- Specified by:
getNumCloseIndexThreads
in interfaceTaskManagerInterface
-
getRuntimeControl
Description copied from interface:TaskManagerInterface
Gibt die aktuelle Laufzeitsteuerung zurück. Falls das System noch nicht voll initialisiert ist, wirdnull
zurückgegeben.- Specified by:
getRuntimeControl
in interfaceTaskManagerInterface
- Returns:
- die aktuelle Laufzeitsteuerung
-
suspendTaskIfNecessary
Description copied from interface:TaskManagerInterface
Die Methode blockiert und hält damit den aufrufenden Task an, wenn dies (z. B. wegen Überlastung) notwendig ist.- Specified by:
suspendTaskIfNecessary
in interfaceTaskManagerInterface
- Parameters:
task
- Task- Throws:
InterruptedException
- Unterbrochen beim Anhalten
-
countDataInQueues
public long countDataInQueues()- Specified by:
countDataInQueues
in interfaceTaskManagerInterface
-
estimateQueueMemoryUsage
public long estimateQueueMemoryUsage()- Specified by:
estimateQueueMemoryUsage
in interfaceTaskManagerInterface
-
getNumCheckPersistenceThreads
public int getNumCheckPersistenceThreads()- Specified by:
getNumCheckPersistenceThreads
in interfaceTaskManagerInterface
-
getPersistenceManager
Description copied from interface:TaskManager
Gibt den PersistenzManager zurück.- Specified by:
getPersistenceManager
in interfaceTaskManager
- Returns:
- den PersistenzManager
-