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.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic interface
Funktionales Interface für Container-Aktionen -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static final de.bsvrz.sys.funclib.debug.Debug
protected final IndexTree
Baum zur Verwaltung der Indexeprotected final ConcurrentSkipListSet<IdContainerFileDir>
Menge von Datenidentifikationen, in denen sehr viele Containerdateien enthalten sind (für Warnmeldung) -
Constructor Summary
ConstructorsConstructorDescriptionPersistenceDirectory
(DataIdentificationManager dataIdentificationManager, PersistenceDirectoryLayoutInstance layoutInstance) Erstellt ein neues PersistenceDirectory. -
Method Summary
Modifier and TypeMethodDescriptionaccessContainer
(LockedContainerDirectory containerDirectory, long containerId) Greift auf einen Container zuprotected DataRange
computeDataRange
(LockedContainerDirectory directory) static Path
Liefert ein File für das angegebene Verzeichnis.void
deleteIndexes
(LockedContainerDirectory containerDirectory, RebuildResult rebuildResult) Die Methode deleteIndexes löscht alle Indexdateien in einem Verzeichnis.long
estimate()
Schätzt eine Anzahlprotected void
executeOnContainer
(Path contFile, PersistenceDirectory.ContainerCall action) Führt eine Aktion auf einem Container auf und benennt den Container um, falls die Aktion einePersistenceException
geworfen hat und der BenutzerPersistenceManager.shouldDeleteBrokenContainers()
gesetzt hat.final Path
Gibt das Verzeichnis auf dem Datenträger zurück.getContainerHeaders
(LockedContainerDirectory containerDirectory) Gibt die Header von allen Containern eines Verzeichnisses zurück.getContainerHeaders
(LockedContainerDirectory containerDirectory, long containerID) Gibt die Header eines Containers zurück.abstract DataRange
getDataRange
(LockedContainerDirectory directory) Ermittelt zu einem Containerverzeichnis den gesamten (ggf. in diesem Wochenverzeichnis) vorliegenden Datenbereich.getIndexResult
(LockedContainerDirectory containerDirectory, SequenceSpecification sequenceSpecification) Die Methode getIndexResult führt eine Index-Abfrage durch (für Archivanfragen und ähnliche Operationen)Gibt die Verwaltung der Indexe zurückGibt ein Set zurück, dass alle bekannten Containerverzeichnisse enthält, die "übermäßig viel" Daten enthalten.getLastContainerHeaders
(LockedContainerDirectory containerDirectory) Die Methode getLastContainerHeaders ermittelt die Header vom letzten Container (vom Container mit der größten ID)Gibt den Pfad der Lockdatei zurück (unabhängig davon, ob diese gerade vorhanden ist).getPath
(ContainerDirectory containerDirectory) Gibt zu einem ContainerDirectory das zugehörige Verzeichnis zurück.getPath
(IdDataIdentification dataIdentification) Gibt zu einer Datenidentifikation das zugehörige Verzeichnis zurück.int
Gibt die Simulationsvariante dieses Verzeichnisses zurück.protected void
handleUnclosedContainer
(ContainerManagementIndex managementIndex, LockedContainerDirectory containerDirectory, long contId, BaseIndex<IndexValues> index) boolean
hasError
(IndexResult<ContainerManagementInformation> contents, int i, HashSet<Long> knownMinDataIndexes, Map<Long, Long> contIdToMinDataIndex, boolean checkIndexMonotonic) Bestimmt, ob ein Eintrag im Verwaltungsdatenindex fehlerhaft istiterator
(de.bsvrz.dav.daf.main.archive.ArchiveDataKind adk, long containerId, IdDataIdentification dataIdentification) Erstellt einen Iterator über die Daten eines Containers.long
maxContainerId
(LockedContainerDirectory containerDirectory) Ermittelt maximale Container-ID in einem Verzeichnis.openDeletedContainerFile
(LockedContainerDirectory containerDirectory) Die Methode openDeletedContainerFile öffnet die Datei mit den Informationen zu den gelöschten Containernvoid
rebuildContainerHeaderIndex
(IdContainerFileDir containerFileDir, ContainerManagementIndex containerHeaderIndex, RebuildResult rebuildResult) Erzeugt einen neuen ContainerHeaderIndex basierend aus den Containerdateien in einem Verzeichnisvoid
rebuildIndexes
(LockedContainerDirectory containerDirectory, RebuildResult rebuildResult) Die Methode rebuildIndexes baut die Indexe in einem Verzeichnis erneut auf.final void
rebuildStandardIndex
(ContainerManagementIndex managementIndex, BaseIndex<IndexValues> index, LockedContainerDirectory containerDirectory) Die Methode rebuildStandardIndex erstellt einen Standard-Index aus dem Verwaltungsdatenindexvoid
removeContainerFromIndex
(LockedContainerDirectory containerDirectory, long containerId) Die Methode removeContainerFromIndex löscht einen Container aus den Indexenprotected void
renameContainerFile
(Path contFile) void
setCount
(long actualCount) Wird aufgerufen, wenn die richtige Anzahl (einmalig als Schnappschuss) ermittelt wurde.toString()
void
warnAboutHugeContainerDirectory
(IdContainerFileDir location, long numEntries) Die Methode warnAboutHugeContainerDirectory warnt den Benutzer, wenn zu viele Container in einem Containerverzeichnis gespeichert wurden.void
warnAboutSlowRestore
(IdContainerFileDir location, long currentEntries, Duration currentDuration) Die Methode warnAboutSlowRestore warnt den Benutzer, wenn die Wiederherstellung eines Verzeichnisses sehr lange dauert.
-
Field Details
-
debug
protected static final de.bsvrz.sys.funclib.debug.Debug debug -
indexTree
Baum zur Verwaltung der Indexe -
largeDataIdentifications
Menge von Datenidentifikationen, in denen sehr viele Containerdateien enthalten sind (für Warnmeldung)
-
-
Constructor Details
-
PersistenceDirectory
public PersistenceDirectory(@NotNull DataIdentificationManager dataIdentificationManager, @NotNull PersistenceDirectoryLayoutInstance layoutInstance) Erstellt ein neues PersistenceDirectory.- Parameters:
dataIdentificationManager
- Klasse zum Zugriff auf Indexe (Im Normalbetrieb derPersistenceManager
)layoutInstance
- Instanz eines Verzeichnis-Layouts
-
-
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 einePersistenceException
geworfen hat und der BenutzerPersistenceManager.shouldDeleteBrokenContainers()
gesetzt hat.- Parameters:
contFile
- Containerdateiaction
- Aktion- Throws:
PersistenceException
- Beliebiger GrundSynchronizationFailedException
-
renameContainerFile
- 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-VerzeichniscontainerID
- 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 ContainerverzeichniscontainerId
- Id des Containers- Returns:
- Container-Handle
- Throws:
PersistenceException
- Lesefehler
-
getBasePath
Gibt das Verzeichnis auf dem Datenträger zurück.- Returns:
- das Verzeichnis auf dem Datenträger
-
createDirectoriesIfAbsent
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
- Verwaltungsdatenindexindex
- 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 ContainerverzeichnissescontainerHeaderIndex
- 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
- Indexinhaltei
- Zu prüfende Zeile im IndexknownMinDataIndexes
- 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-IDcheckIndexMonotonic
- 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 IdContainerFileDircurrentEntries
- von Typ longcurrentDuration
- von Typ Duration
-
getLayoutInstance
-
getPath
Gibt zu einer Datenidentifikation das zugehörige Verzeichnis zurück. Die Simulationsvariante der Datenidentifikation muss mitgetSimulationVariant()
übereinstimmen.- Parameters:
dataIdentification
- Datenidentifikation- Returns:
- Verzeichnis
-
getPath
Gibt zu einem ContainerDirectory das zugehörige Verzeichnis zurück. Die Simulationsvariante der Datenidentifikation muss mitgetSimulationVariant()
übereinstimmen.- Parameters:
containerDirectory
- Datenidentifikation und Archivdatenart, die das Containerverzeichnis identifizieren- Returns:
- Verzeichnis
-
getIndexTree
Gibt die Verwaltung der Indexe zurück- Returns:
- Klasse zum zugriff auf Indexdateien in diesem Verzeichnis
-
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
Gibt den Pfad der Lockdatei zurück (unabhängig davon, ob diese gerade vorhanden ist).- Returns:
- Potenzieller Pfad der Lockdatei
-
warnAboutHugeContainerDirectory
Die Methode warnAboutHugeContainerDirectory warnt den Benutzer, wenn zu viele Container in einem Containerverzeichnis gespeichert wurden.- Parameters:
location
- von Typ IdContainerFileDirnumEntries
- 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
- LesefehlerSynchronizationFailedException
- 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
- ArchivdatenartcontainerId
- Container-IDdataIdentification
- 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-VerzeichniscontainerId
- 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-VerzeichnissequenceSpecification
- der gewünschte Datenbereich, sieheSequenceSpecification
- Returns:
- IndexResult<IndexValues>
- Throws:
IndexException
- wenn ein Problem beim Zugriff auf den Index auftrittSynchronizationFailedException
- 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 sollenrebuildResult
- 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 sollenrebuildResult
- Ergebnis für Statistiken- Throws:
IndexException
- wenn ein Problem beim Zugriff auf den Index auftritt
-
maxContainerId
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
-
estimate
public long estimate()Description copied from interface:CountEstimator
Schätzt eine Anzahl- Specified by:
estimate
in interfaceCountEstimator
- 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 interfaceCountEstimator
- Parameters:
actualCount
- Momentanwert der tatsächlichen Anzahl
-
getDataRange
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, einValidDataRange
sonst. - Throws:
IndexException
-
computeDataRange
-