Class ActivePersistenceDirectory
java.lang.Object
de.bsvrz.ars.ars.persistence.directories.PersistenceDirectory
de.bsvrz.ars.ars.persistence.directories.ActivePersistenceDirectory
- All Implemented Interfaces:
CountEstimator
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.-
Nested Class Summary
Nested classes/interfaces inherited from class de.bsvrz.ars.ars.persistence.directories.PersistenceDirectory
PersistenceDirectory.ContainerCall
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final String
Eine Datei dieses Namens wird pro Verzeichnis einer Datenidentifikation/Datensatzart angelegt, wenn ein neuer Datensatz archiviert wurde und der Index möglicherweise (wg.Fields inherited from class de.bsvrz.ars.ars.persistence.directories.PersistenceDirectory
debug, indexTree, largeDataIdentifications
-
Constructor Summary
ConstructorsConstructorDescriptionActivePersistenceDirectory
(ContainerCreator containerCreator, PersistenceDirectoryLayoutInstance layoutInstance) Erstellt ein neues ActivePersistenceDirectory. -
Method Summary
Modifier and TypeMethodDescriptionaccessOpenContainer
(ContainerDirectory containerDirectory, long openContID) Greift auf den offenen Container zu.void
addIndexEntries
(LockedContainerDirectory containerDirectory, long dataIdx, long arsTime, long dataTime, long openContID) Die Methode addIndexEntries fügt einem Index Werte hinzu.void
closeIndexes
(int numThreads) Schließt/Flusht alle Indexdateien und wartet bis alle Indexe geschlossen wurdenvoid
closeOpenContainer
(LockedContainerDirectory containerDirectory) Schließt den offenen Container in einem Verzeichnis ab.void
Schließt dieses Persistenz-Wochenverzeichnis dauerhaft ab, schließt also alle Container und Indexe.void
createRebuildIxdFlagFile
(ContainerDirectory directory) Legt im Verzeichnis der Datenidentifikation ein FLAG-Datei an.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.long
estimate()
Schätzt eine Anzahlvoid
flushIndexes
(LockedContainerDirectory containerDirectory) Schreibt den aktuellen Stand der Indexe auf die FestplattegetDataRange
(LockedContainerDirectory directory) Ermittelt zu einem Containerverzeichnis den gesamten (ggf. in diesem Wochenverzeichnis) vorliegenden Datenbereich.long
getIndexResult
(LockedContainerDirectory containerDirectory, SequenceSpecification sequenceSpecification) Die Methode getIndexResult führt eine Index-Abfrage durch (für Archivanfragen) und aktualisiert dabei die Daten vom offenen Container im IndexgetLoadedContainerData
(ContainerDirectory containerDirectory) Entspricht etwagetOpenContainerData()
, gibt die Daten aber nur zurück, wenn sie bereits bekannt sind, d.h. es wird nicht im letzten Container nachgesehen.getOpenContainerData
(ContainerDirectory containerFileDir) Die Methode getOpenContainerData die zwischengespeicherten Daten für den offenen Container zurück.getOpenContainerData
(LockedContainerDirectory containerDirectory, ContainerManagementIndex containerManagementIndex) Die Methode getOpenContainerData ermittelt die Daten vom offenen Container.long
getOpenContID
(ContainerDirectory containerDirectory) Die Methode getOpenContID gibt die ID des offenen Containers für eine Datenidentifikation zurückgetRebuildIdxFile
(ContainerDirectory directory) Die Methode getRebuildIdxFile ermittelt den Speicherort für die _rebuildIndex.flagprotected void
handleUnclosedContainer
(ContainerManagementIndex managementIndex, LockedContainerDirectory containerDirectory, long contId, BaseIndex<IndexValues> index) protected OpenContainerData
initOpenContainerData
(LockedContainerDirectory containerDirectory, ContainerManagementIndex headerIndex) Die Methode initOpenContainerData initialisiert die Daten eines geöffneten Containers.void
markAsClean
(ContainerDirectory directory) Entfernt die Kennzeichen-Datei, ob die Indexe verändert wurden, um nach einem Absturz den Wiederanlauf zu beschleunigen.void
markAsDirty
(ContainerDirectory directory) Erzeugt die Kennzeichen-Datei, ob die Indexe verändert wurden, um nach einem Absturz den Wiederanlauf zu beschleunigen.long
maxATime
(ContainerDirectory containerDirectory) Die Methode maxATime gibt die maximale Archivzeit einer Datenidentifikation zurücklong
Gibt die Anzahl der Einträge inopenContainerData
zurück.void
removeOpenContainerData
(ContainerDirectory containerDirectory) Setzt, dass es aktuell für eine Datenidentifikation keinen offenen Container mehr gibt.void
setOpenContainerData
(LockedContainerDirectory containerDirectory, StandardOpenContainerData data) Setzt die Daten eines offenen Containers.protected static void
updateContainerIndex
(ContainerManagementData containerFile, ContainerManagementIndex index) Die Methode updateContainerIndex aktualisiert den Verwaltungsdatenindexvoid
updateContainerIndex
(ContainerManagementData managementData, LockedContainerDirectory containerDirectory) Die Methode updateContainerIndex aktualisiert den Verwaltungsdatenindexvoid
updateMaxValues
(ContainerDirectory containerDirectory, long dataIdx, long arsTime, long dataTime) Die Methode speichert imOpenContainerData
neue Maximal-Werte für den offenen Container (Maximal-Datenindex usw.)void
updateStandardIndexes
(LockedContainerDirectory containerDirectory) Die Methode updateStandardIndexes aktualisiert die Indexe mit dem zuletzt gesichertenOpenContainerData
.void
updateStandardIndexes
(LockedContainerDirectory containerDirectory, StandardOpenContainerData data) Die Methode updateStandardIndexes fügt einem Index Werte hinzu oder aktualisiert die vorhandenen Werte.Methods inherited from class de.bsvrz.ars.ars.persistence.directories.PersistenceDirectory
accessContainer, computeDataRange, createDirectoriesIfAbsent, deleteIndexes, executeOnContainer, getBasePath, getContainerHeaders, getContainerHeaders, getIndexTree, getLargeDataIdentifications, getLastContainerHeaders, getLayoutInstance, getLockFile, getPath, getPath, getSimulationVariant, hasError, iterator, maxContainerId, openDeletedContainerFile, rebuildContainerHeaderIndex, rebuildIndexes, rebuildStandardIndex, removeContainerFromIndex, renameContainerFile, setCount, toString, warnAboutHugeContainerDirectory, warnAboutSlowRestore
-
Field Details
-
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 ContainernlayoutInstance
- 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 classPersistenceDirectory
- 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 ContainersopenContID
- 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 auftrittIndexException
- 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 ohneContainerManagementIndex
-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 auftrittSynchronizationFailedException
- 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 vongetOpenContainerData(ContainerDirectory)
wenn derContainerManagementIndex
bereits geladen wurde.- Parameters:
containerDirectory
- Datenidentifikation/Verzeichnis des ContainerscontainerManagementIndex
- von Typ ContainerManagementIndex- Returns:
- StandardOpenContainerData
-
getLoadedContainerData
Entspricht etwagetOpenContainerData()
, 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 ContainerdatenverzeichnisheaderIndex
- 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 Containersdata
- Neue Daten
-
removeOpenContainerData
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üsseladk
- Archivdatenart
-
openContainerDataSize
public long openContainerDataSize()Gibt die Anzahl der Einträge inopenContainerData
zurück.- Returns:
- die Anzahl der Einträge in
openContainerData
-
getRebuildIdxFile
Die Methode getRebuildIdxFile ermittelt den Speicherort für die _rebuildIndex.flag- Parameters:
directory
- Datenidentifikation/Verzeichnis der Flag-Datei- Returns:
- Path
-
createRebuildIxdFlagFile
Legt im Verzeichnis der Datenidentifikation ein FLAG-Datei an.- Parameters:
directory
- Datenidentifikation/Verzeichnis der Flag-Datei- Throws:
PersistenceException
- Lesefehler im Persistenzverzeichnis
-
markAsDirty
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
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
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 auftrittSynchronizationFailedException
- 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 auftrittSynchronizationFailedException
- 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 classPersistenceDirectory
- Parameters:
sequenceSpecification
- von Typ ArchiveTimeSpecificationcontainerDirectory
- 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 auftrittSynchronizationFailedException
- 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 interfaceCountEstimator
- Overrides:
estimate
in classPersistenceDirectory
- Returns:
- geschätzte Anzahl. Der Wert muss größer-gleich 0 sein und sollte der realen Anzahl möglichst gut entsprechen.
-
getDataRange
Description copied from class:PersistenceDirectory
Ermittelt zu einem Containerverzeichnis den gesamten (ggf. in diesem Wochenverzeichnis) vorliegenden Datenbereich.- Specified by:
getDataRange
in classPersistenceDirectory
- Parameters:
directory
- Containerdatenidentifikation- Returns:
- Datenbereich, insbesondere
NoData.Instance
wenn gar keine Daten vorliegen, einValidDataRange
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 sollendataIdx
- von Typ longarsTime
- von Typ longdataTime
- von Typ longopenContID
- 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 gesichertenOpenContainerData
.- 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 sollendata
- 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 imOpenContainerData
neue Maximal-Werte für den offenen Container (Maximal-Datenindex usw.)- Parameters:
containerDirectory
- ContainerverzeichnisdataIdx
- DatenindexarsTime
- ArchivzeitdataTime
- Datenzeit- Throws:
IndexException
- wenn ein Problem beim Zugriff auf den Index auftrittSynchronizationFailedException
- Synchronisierung auf Indexe fehlgeschlagen
-
closeIndexes
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 IndexeSynchronizationFailedException
- Fehler beim Synchronisieren auf die Indexe der Datenidentifikation
-
closePermanently
Schließt dieses Persistenz-Wochenverzeichnis dauerhaft ab, schließt also alle Container und Indexe.- Throws:
InterruptedException
- Unterbrochen beim Warten auf Beendigung des AbschließensPersistenceException
- Schreibfehler beim Container schließen
-
getDirtyDirectoriesSize
public long getDirtyDirectoriesSize()
-