de.bsvrz.ars.ars.repair
Class ContainerRescue

java.lang.Object
  extended by de.bsvrz.ars.ars.repair.ContainerRescue

public class ContainerRescue
extends 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.

Author:
Kappich Systemberatung

Nested Class Summary
private static class ContainerRescue.Defect
           
 
Field Summary
private  List<ContainerRescue.Defect> _badIndexFiles
           
private  List<ContainerRescue.Defect> _badRangeEndDefects
           
private  List<ContainerRescue.Defect> _cantFix
           
private  boolean _checkContainerFiles
           
private  long _checkedContainerFileCount
           
private  long _checkedIndexFileCount
           
private  boolean _checkIndexFiles
           
private  FilenameFilter _containerFilenameFilter
           
private  Pattern _containerFilenamePattern
           
private  long _correctedDefectCount
           
private  long _defectContainerFileCount
           
private  long _defectIndexFileCount
           
private  FileFilter _directoryFileFilter
           
private  boolean _fixDefects
           
private  FilenameFilter _indexFilenameFilter
           
private  Pattern _indexFilenamePattern
           
private  List<ContainerRescue.Defect> _oneByteShortDefects
           
private  boolean _recursiveScan
           
private  File _startDirectory
           
private  long _validContainerFileCount
           
private  long _validIndexFileCount
           
 
Constructor Summary
ContainerRescue(ArgumentList arguments)
           
 
Method Summary
private  void checkContainerFile(File containerFile)
           
private  ContainerRescue.Defect checkDataIndexFile(RandomAccessFile raf, File fileName, HashSet<Long> containerIDs)
          Prüft Indexdateien der Klasse DataIndexIndex.
private  ContainerRescue.Defect checkDataTimeIndexFile(RandomAccessFile raf, File fileName, HashSet<Long> containerIDs)
          Prüft Indexdateien der Klasse DataTimeIndex.
private  ContainerRescue.Defect checkDIDIndexFile(RandomAccessFile raf, File fileName, HashSet<Long> containerIDs)
          Prüft Indexdateien der Klasse ATimeMonotoneIndex.
private  void checkIndexFile(File indexFile, HashSet<Long> containerIDs)
           
private  HashSet<Long> fileListToIdList(List<File> containerFiles)
           
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(File containerFile)
           
private  ContainerRescue.Defect inspectIndexFile(File indexFile, HashSet<Long> containerIDs)
           
static void main(String[] args)
           
private static long read5(RandomAccessFile raf)
           
private static long read6(RandomAccessFile raf)
           
private static void rebuildIndexFile(File fileName, String indexKind)
           
private  void scan(File directory)
           
private  void start()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_startDirectory

private File _startDirectory

_recursiveScan

private boolean _recursiveScan

_fixDefects

private boolean _fixDefects

_checkContainerFiles

private boolean _checkContainerFiles

_checkIndexFiles

private boolean _checkIndexFiles

_containerFilenameFilter

private final FilenameFilter _containerFilenameFilter

_containerFilenamePattern

private Pattern _containerFilenamePattern

_indexFilenameFilter

private final FilenameFilter _indexFilenameFilter

_indexFilenamePattern

private Pattern _indexFilenamePattern

_directoryFileFilter

private FileFilter _directoryFileFilter

_cantFix

private List<ContainerRescue.Defect> _cantFix

_oneByteShortDefects

private List<ContainerRescue.Defect> _oneByteShortDefects

_validContainerFileCount

private long _validContainerFileCount

_checkedContainerFileCount

private long _checkedContainerFileCount

_defectContainerFileCount

private long _defectContainerFileCount

_validIndexFileCount

private long _validIndexFileCount

_checkedIndexFileCount

private long _checkedIndexFileCount

_defectIndexFileCount

private long _defectIndexFileCount

_badRangeEndDefects

private List<ContainerRescue.Defect> _badRangeEndDefects

_badIndexFiles

private List<ContainerRescue.Defect> _badIndexFiles

_correctedDefectCount

private long _correctedDefectCount
Constructor Detail

ContainerRescue

public ContainerRescue(ArgumentList arguments)
Method Detail

main

public static void main(String[] args)

start

private void start()

scan

private void scan(File directory)

fileListToIdList

private HashSet<Long> fileListToIdList(List<File> containerFiles)

checkIndexFile

private void checkIndexFile(File indexFile,
                            HashSet<Long> containerIDs)

inspectIndexFile

private ContainerRescue.Defect inspectIndexFile(File indexFile,
                                                HashSet<Long> containerIDs)

checkDIDIndexFile

private ContainerRescue.Defect checkDIDIndexFile(RandomAccessFile raf,
                                                 File fileName,
                                                 HashSet<Long> containerIDs)
                                          throws 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.

Parameters:
raf - Geöffnete Datei
fileName - Datei
containerIDs - hashSet mit ContainerIDs, die in der IndexDatei vorkommen müssen.
Returns:
Ein Defect, falls die Datei Defekt ist, sonst null
Throws:
IOException - Eingabe-Ausgabe-Fehler

checkDataTimeIndexFile

private ContainerRescue.Defect checkDataTimeIndexFile(RandomAccessFile raf,
                                                      File fileName,
                                                      HashSet<Long> containerIDs)
                                               throws IOException
Prüft Indexdateien der Klasse DataTimeIndex. In dieser Klasse ist gefordert, dass die Einträge nach der minimalen Datenzeit sortiert sind

Parameters:
raf - Geöffente Datei
fileName - Datei
containerIDs - hashSet mit ContainerIDs, die in der IndexDatei vorkommen müssen.
Returns:
Ein Defect, falls die Datei Defekt ist, sonst null
Throws:
IOException - Eingabe-Ausgabe-Fehler

checkDataIndexFile

private ContainerRescue.Defect checkDataIndexFile(RandomAccessFile raf,
                                                  File fileName,
                                                  HashSet<Long> containerIDs)
                                           throws IOException
Prüft Indexdateien der Klasse DataIndexIndex. In dieser Klasse ist gefordert, dass die Einträge nach der minimalen Datenzeit sortiert sind

Parameters:
raf - Geöffente Datei
fileName - Datei
containerIDs - hashSet mit ContainerIDs, die in der IndexDatei vorkommen müssen.
Returns:
Ein Defect, falls die Datei Defekt ist, sonst null
Throws:
IOException - Eingabe-Ausgabe-Fehler

read5

private static long read5(RandomAccessFile raf)
                   throws IOException
Throws:
IOException

read6

private static long read6(RandomAccessFile raf)
                   throws IOException
Throws:
IOException

fixBadIndexFileDefect

private static void fixBadIndexFileDefect(ContainerRescue.Defect badIndexFileDefect)

rebuildIndexFile

private static void rebuildIndexFile(File fileName,
                                     String indexKind)
                              throws IOException,
                                     IndexException,
                                     PersistenceException
Throws:
IOException
IndexException
PersistenceException

checkContainerFile

private void checkContainerFile(File containerFile)

inspectContainerFile

private ContainerRescue.Defect inspectContainerFile(File containerFile)

fixOneByteShortDefect

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.

Parameters:
defect - Identifizierter Defekt einer Containerdatei

fixBadRangeEndDefect

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. Eine Reparatur der fehlerhaften Container-Dateien wird durch diese Methode durchgeführt, indem der fehlerhafte Endwert -9223372036854775808, durch den entsprechenden Startwert ersetzt wird.

Parameters:
defect - Identifizierter Defekt einer Containerdatei