public class ContainerRescue
extends java.lang.Object
Hilfsprogramm, mit dem es möglich ist, Container-Dateien des Archivsystems, in denen bestimmte Defekte vorliegen zu identifizieren und zu korrigieren. Das Programm durchsucht in einem vorgegebenen Verzeichnis und auf Wunsch auch rekursiv in allen Unterverzeichnisse nach Container-Dateien und führt Prüfungen auf bestimmte Defekte durch, die durch Fehler in älteren Versionen des Archivsystems ausgelöst wurden. Defekte Containerdateien werden durch eine entsprechende Ausgabe identifiziert und auf Wunsch wenn möglich auch korrigiert.
Das Programm unterstützt folgende Aufrufparameter: -verzeichnis=… -rekursiv=ja|nein -reparieren=nein|ja -index=nein|ja -container=nein|ja
Mit -verzeichnis=…
kann ein beliebiges Verzeichnis angegeben werden, in dem Containerdateien gesucht werden. Defaultwert ist das aktuelle Arbeitsverzeichnis in dem das Programm gestartet wurde.
Mit -rekursiv=ja|nein
kann spezifiziert werden, ob auch Unterverzeichnisse des Ausgangsverzeichnisses rekursiv durchsucht werden sollen oder nicht. Ohne Angabe dieses Arguments werden auch Unterverzeichnisse rekursiv durchsucht.
Mit -reparieren=nein|ja
kann spezifiziert werden, ob fehlerhafte Dateien nur identifiziert werden sollen oder ob sie auch repariert werden sollen.
Mit -index=ja|nein
kann spezifiziert werden, ob Indexdateien überprüft werden sollen.
Mit -container=ja|nein
kann spezifiziert werden, ob Containerdateien überprüft werden sollen.
Modifier and Type | Class and Description |
---|---|
private static class |
ContainerRescue.Defect |
Constructor and Description |
---|
ContainerRescue(ArgumentList arguments) |
Modifier and Type | Method and Description |
---|---|
private ContainerRescue.Defect |
checkBackupIndexFile(java.io.RandomAccessFile raf,
java.io.File indexFile,
java.util.HashSet<java.lang.Long> containerIDs) |
private void |
checkContainerFile(java.io.File containerFile) |
private ContainerRescue.Defect |
checkDataIndexFile(java.io.RandomAccessFile raf,
java.io.File fileName,
java.util.HashSet<java.lang.Long> containerIDs)
Prüft Indexdateien der Klasse
DataIndexIndex . |
private ContainerRescue.Defect |
checkDataTimeIndexFile(java.io.RandomAccessFile raf,
java.io.File fileName,
java.util.HashSet<java.lang.Long> containerIDs)
Prüft Indexdateien der Klasse
DataTimeIndex . |
private ContainerRescue.Defect |
checkDIDIndexFile(java.io.RandomAccessFile raf,
java.io.File fileName,
java.util.HashSet<java.lang.Long> containerIDs)
Prüft Indexdateien der Klasse
ATimeMonotoneIndex . |
private void |
checkIndexFile(java.io.File indexFile,
java.util.HashSet<java.lang.Long> containerIDs) |
private java.util.HashSet<java.lang.Long> |
fileListToIdList(java.util.List<java.io.File> containerFiles) |
private void |
fixBadContainerFileEnd(ContainerRescue.Defect defect) |
private static void |
fixBadIndexFileDefect(ContainerRescue.Defect badIndexFileDefect) |
private void |
fixBadRangeEndDefect(ContainerRescue.Defect defect)
Beim Löschen eines Containers, in dem als erster Datensatz ein Potentielle-Lücke-Datensatz enthalten ist, wird die optimierte Aufzählung der enthaltenen Datensatzindizes mit falschem Endwert (-9223372036854775808) des ersten Bereichs erzeugt.
|
private void |
fixOneByteShortDefect(ContainerRescue.Defect defect)
Beim Löschen eines Containers mit der Methode ContainerFile.deleteContainerData() werden die in der Container-Datei enthaltenen Datensätze ersetzt durch eine optimierte Aufzählung der verwendeten Datensatzindizes.
|
private ContainerRescue.Defect |
inspectContainerFile(java.io.File containerFile) |
private ContainerRescue.Defect |
inspectIndexFile(java.io.File indexFile,
java.util.HashSet<java.lang.Long> containerIDs) |
static void |
main(java.lang.String[] args) |
private static long |
read5(java.io.RandomAccessFile raf) |
private static long |
read6(java.io.RandomAccessFile raf) |
private static void |
rebuildIndexFile(java.io.File indexFile) |
private static void |
rebuildIndexFile(java.io.File fileName,
java.lang.String indexKind) |
private void |
rebuildIndexFiles(java.io.File parentFile) |
private void |
scan(java.io.File directory) |
private void |
start() |
private java.io.File _startDirectory
private boolean _recursiveScan
private boolean _fixDefects
private boolean _checkContainerFiles
private boolean _checkIndexFiles
private final java.io.FilenameFilter _containerFilenameFilter
private java.util.regex.Pattern _containerFilenamePattern
private final java.io.FilenameFilter _indexFilenameFilter
private java.util.regex.Pattern _indexFilenamePattern
private java.io.FileFilter _directoryFileFilter
private java.util.List<ContainerRescue.Defect> _cantFix
private java.util.List<ContainerRescue.Defect> _oneByteShortDefects
private long _validContainerFileCount
private long _checkedContainerFileCount
private long _defectContainerFileCount
private long _validIndexFileCount
private long _checkedIndexFileCount
private long _defectIndexFileCount
private java.util.List<ContainerRescue.Defect> _badRangeEndDefects
private java.util.List<ContainerRescue.Defect> _badContainerFileEnd
private java.util.List<ContainerRescue.Defect> _badIndexFiles
private long _correctedDefectCount
public ContainerRescue(ArgumentList arguments)
public static void main(java.lang.String[] args)
private void start()
private void scan(java.io.File directory)
private java.util.HashSet<java.lang.Long> fileListToIdList(java.util.List<java.io.File> containerFiles)
private void checkIndexFile(java.io.File indexFile, java.util.HashSet<java.lang.Long> containerIDs)
private ContainerRescue.Defect inspectIndexFile(java.io.File indexFile, java.util.HashSet<java.lang.Long> containerIDs)
private ContainerRescue.Defect checkBackupIndexFile(java.io.RandomAccessFile raf, java.io.File indexFile, java.util.HashSet<java.lang.Long> containerIDs)
private ContainerRescue.Defect checkDIDIndexFile(java.io.RandomAccessFile raf, java.io.File fileName, java.util.HashSet<java.lang.Long> containerIDs) throws java.io.IOException
Prüft Indexdateien der Klasse ATimeMonotoneIndex
. In dieser Klasse ist gefordert, dass die Archivzeit monoton und die ContainerID streng monoton ueber alle Eintraege hinweg steigend sind.
raf
- Geöffnete DateifileName
- DateicontainerIDs
- hashSet mit ContainerIDs, die in der IndexDatei vorkommen müssen.java.io.IOException
- Eingabe-Ausgabe-Fehlerprivate ContainerRescue.Defect checkDataTimeIndexFile(java.io.RandomAccessFile raf, java.io.File fileName, java.util.HashSet<java.lang.Long> containerIDs) throws java.io.IOException
Prüft Indexdateien der Klasse DataTimeIndex
. In dieser Klasse ist gefordert, dass die Einträge nach der minimalen Datenzeit sortiert sind
raf
- Geöffente DateifileName
- DateicontainerIDs
- hashSet mit ContainerIDs, die in der IndexDatei vorkommen müssen.java.io.IOException
- Eingabe-Ausgabe-Fehlerprivate ContainerRescue.Defect checkDataIndexFile(java.io.RandomAccessFile raf, java.io.File fileName, java.util.HashSet<java.lang.Long> containerIDs) throws java.io.IOException
Prüft Indexdateien der Klasse DataIndexIndex
. In dieser Klasse ist gefordert, dass die Einträge nach der minimalen Datenzeit sortiert sind
raf
- Geöffente DateifileName
- DateicontainerIDs
- hashSet mit ContainerIDs, die in der IndexDatei vorkommen müssen.java.io.IOException
- Eingabe-Ausgabe-Fehlerprivate static long read5(java.io.RandomAccessFile raf) throws java.io.IOException
java.io.IOException
private static long read6(java.io.RandomAccessFile raf) throws java.io.IOException
java.io.IOException
private static void fixBadIndexFileDefect(ContainerRescue.Defect badIndexFileDefect)
private static void rebuildIndexFile(java.io.File indexFile) throws java.io.IOException, IndexException, PersistenceException
java.io.IOException
IndexException
PersistenceException
private static void rebuildIndexFile(java.io.File fileName, java.lang.String indexKind) throws java.io.IOException, IndexException, PersistenceException
java.io.IOException
IndexException
PersistenceException
private void checkContainerFile(java.io.File containerFile)
private ContainerRescue.Defect inspectContainerFile(java.io.File containerFile)
private void fixOneByteShortDefect(ContainerRescue.Defect defect)
Beim Löschen eines Containers mit der Methode ContainerFile.deleteContainerData() werden die in der Container-Datei enthaltenen Datensätze ersetzt durch eine optimierte Aufzählung der verwendeten Datensatzindizes. Dabei wird die Methode createDataIndexBuffer() verwendet, die diese optimierte Aufzählung erzeugt. Diese Methode gibt i.A. ein Byte zuviel zurück. Die deleteContainerData() Methode schreibt die von createDataIndexBuffer() zurückgelieferten Bytes und verkürzt anschließend die Datei um grundsätzlich ein Byte. In bestimmten Fällen, z.B., wenn in der Container-Datei nur ein Datensatz enthalten ist oder nur Datensätze mit Sprüngen im Datensatzindex enthalten sind, liefert die Methode createDataIndexBuffer() allerdings die korrekte Anzahl Bytes zurück, sodass durch das anschließende Verkürzen der Datei um ein Byte ein Informationsverlust in der Datei entsteht. Eine Reparatur der fehlerhaften Container-Dateien wird mit dieser Methode durchgeführt, indem mit Hilfe des maximalen Datensatz-Index, der im Datei-Header gespeichert ist, das fehlende Byte berechnet und die defekte Datei damit korrigiert wird.
defect
- Identifizierter Defekt einer Containerdateiprivate void fixBadRangeEndDefect(ContainerRescue.Defect defect)
Beim Löschen eines Containers, in dem als erster Datensatz ein Potentielle-Lücke-Datensatz enthalten ist, wird die optimierte Aufzählung der enthaltenen Datensatzindizes mit falschem Endwert (-9223372036854775808) des ersten Bereichs erzeugt. Eine Reparatur der fehlerhaften Container-Dateien wird durch diese Methode durchgeführt, indem der fehlerhafte Endwert -9223372036854775808, durch den entsprechenden Startwert ersetzt wird.
defect
- Identifizierter Defekt einer Containerdateiprivate void fixBadContainerFileEnd(ContainerRescue.Defect defect)
private void rebuildIndexFiles(java.io.File parentFile) throws IndexException, java.io.IOException, PersistenceException
IndexException
java.io.IOException
PersistenceException