de.bsvrz.ars.ars.persistence
Class RestorePersDirTsk

java.lang.Object
  extended by java.lang.Thread
      extended by de.bsvrz.ars.ars.mgmt.tasks.Task
          extended by de.bsvrz.ars.ars.persistence.RestorePersDirTsk
All Implemented Interfaces:
SuspendableTask, Runnable

public class RestorePersDirTsk
extends Task

Diese Klasse teilt das Persistenzverzeichnis in disjunkte Teilbaeume auf und stellt alle Verwaltungsinformationen wieder her.

Author:
beck et al. projects GmbH, Alexander Schmidt
See Also:
PersistenceManager.REBUILDINDEX_FILE_FLAG_NAME, PersistenceManager.rebuildIndex(Task, byte[], long, long, long, int, ArchiveDataKind)

Nested Class Summary
 
Nested classes/interfaces inherited from class java.lang.Thread
Thread.State, Thread.UncaughtExceptionHandler
 
Field Summary
private  int _errorCount
          Zähler für unerwartete RuntimeExceptions
private  int badDID
           
private  boolean done
           
private  int goodDID
           
private  long maxArchiveTime
           
private  long maxContID
           
private  int maxMedienID
           
private  PersistenceManager persMgr
           
private static int RESTORE_TEMP_MEM
           
private static RestorePersDirTsk[] restoreTasks
           
private  List<File> startDirs
           
private static long startTime
           
static int test_badDID
           
static int test_frebuilt
           
static int test_goodDID
           
static int test_totalDID
           
static int test_viscont
           
private  byte[] tmpMem
           
private  int[] total_cont_rebuilt
           
private  int totalDID
           
 
Fields inherited from class de.bsvrz.ars.ars.mgmt.tasks.Task
archMgr, didTree, INDEX_MEMORY_SIZE, isTerminated, logger, ringOfDeathListener, taskStepListeners
 
Fields inherited from class java.lang.Thread
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY
 
Constructor Summary
private RestorePersDirTsk(PersistenceManager pMgr, List<File> startDirectories, int tmpMemSize)
           
 
Method Summary
private  boolean anyIndexFileMissing(File didDir)
          Prueft, ob im genannten Verzeichnis einer DId und Datenart mindestens eine Indexdatei fehlt.
private static List<List<File>> calcPartitions(String persDir, int numOfPartitions)
          Teilt das uebergebene Verzeichnis in eine Liste (mit numOfPartitions Elementen) von Listen von Verzeichnissen ein.
static void cleanUp()
          Gibt den benutzten Speicher frei (insbes.
private  ContainerBackupIndex createContainerBackupIndex(File didDir)
          Erstellt einen ContainerBackupIndex mit den zu sichernden ContainerIDs in einem Verzeichnis
static int getBadDID()
           
static int getErrorCount()
           
static int getFullyRebuiltCont()
           
static int getGoodDID()
           
static long getMaxArchiveTime()
           
private  long[] getMaxArchiveTimeMedID(File didDir, long[] containerIds)
          Gibt die maximale Archivzeit und MedienID aus einem Verzeichnis mit Containerdateien zurück.
static long getMaxContID()
           
static int getMaxMedienID()
           
static int getTotalDID()
           
static int getVisitedCont()
           
static boolean restoreDone()
           
 void run()
          Durchlaueft mit Hilfe eines ContainerDataIterator jedes Verzeichnis aus startDirs und stellt die Verwaltungsinformation wieder her.
private static boolean splitDirs(List<List<File>> dirs, int pos)
          Die uebergebene Liste enthaelt einen vollstaendigen Querschnitt durch die Verzeichnishierarchie.
static void startRestore(PersistenceManager pMgr, int numOfPartitions)
          Zerlegt das Persistenzverzeichnis in eine Anzahl disjunkter Teile, erzeugt ebenso viele Wiederherstellungstasks und startet sie.
static String status()
           
private static void stepDown(List<File> dirs)
          Steigt solange die Verzeichnishierarchie hinab (maximal bis zur sv-Ebene), wie stets nur ein Verzeichnis auf dem Pfad liegt.
static boolean success()
           
static String summary()
           
static void terminateRestore()
          Bricht den Wiederherstellungslauf ab
 
Methods inherited from class de.bsvrz.ars.ars.mgmt.tasks.Task
addTaskStepListener, getArchMgr, isTaskTerminated, removeTaskStepListener, suspendTaskIfNecessary, terminateTask
 
Methods inherited from class java.lang.Thread
activeCount, checkAccess, clone, countStackFrames, currentThread, destroy, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, stop, suspend, toString, yield
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

RESTORE_TEMP_MEM

private static int RESTORE_TEMP_MEM

restoreTasks

private static RestorePersDirTsk[] restoreTasks

startTime

private static long startTime

test_totalDID

public static int test_totalDID

test_badDID

public static int test_badDID

test_goodDID

public static int test_goodDID

test_viscont

public static int test_viscont

test_frebuilt

public static int test_frebuilt

persMgr

private PersistenceManager persMgr

startDirs

private List<File> startDirs

tmpMem

private byte[] tmpMem

done

private boolean done

maxArchiveTime

private long maxArchiveTime

maxContID

private long maxContID

maxMedienID

private int maxMedienID

totalDID

private int totalDID

badDID

private int badDID

goodDID

private int goodDID

_errorCount

private int _errorCount
Zähler für unerwartete RuntimeExceptions


total_cont_rebuilt

private int[] total_cont_rebuilt
Constructor Detail

RestorePersDirTsk

private RestorePersDirTsk(PersistenceManager pMgr,
                          List<File> startDirectories,
                          int tmpMemSize)
Method Detail

startRestore

public static void startRestore(PersistenceManager pMgr,
                                int numOfPartitions)
Zerlegt das Persistenzverzeichnis in eine Anzahl disjunkter Teile, erzeugt ebenso viele Wiederherstellungstasks und startet sie. Zum Wiederherstellen gehoert:

Parameters:
pMgr - Aufrufender PersistenceManager
numOfPartitions - gewuenschte maximale Anzahl disjunkter Teile

restoreDone

public static boolean restoreDone()
Returns:
Wahr, falls alle Tasks fertig sind, falsch sonst

terminateRestore

public static void terminateRestore()
Bricht den Wiederherstellungslauf ab


cleanUp

public static void cleanUp()
Gibt den benutzten Speicher frei (insbes. den von den einzelnen Tasks zum Wiederherstellen der Indexe benoetigten Speicher)


getMaxArchiveTime

public static long getMaxArchiveTime()
Returns:
Maximum der von allen Threads gefundenen Archivzeit

getMaxContID

public static long getMaxContID()
Returns:
Maximum der von allen Threads gefundenen Container-ID

getMaxMedienID

public static int getMaxMedienID()
Returns:
Maximum der von allen Threads gefundenen Medien-ID

getTotalDID

public static int getTotalDID()
Returns:
Summe der von allen Threads besuchten DID-Verzeichnisse

getGoodDID

public static int getGoodDID()
Returns:
Summe der von allen Threads besuchten DID-Verzeichnisse, in denen die Wiederherstellung erfolgreich abgeschlossen wurde.

getBadDID

public static int getBadDID()
Returns:
Summe der von allen Threads besuchten DID-Verzeichnisse, in denen die Wiederherstellung nicht erfolgreich abgeschlossen wurde.

getErrorCount

public static int getErrorCount()
Returns:
Summe der in allen Threads aufgetretenen RuntimeExceptions während der Wiederherstellung.

getVisitedCont

public static int getVisitedCont()
Returns:
Zahl der bisher besuchten Container

getFullyRebuiltCont

public static int getFullyRebuiltCont()
Returns:
Zahl der bisher besuchten Container, bei denen alle Datensaetze zur Wiederherstellung gelesen werden mussten

success

public static boolean success()
Returns:
Wahr, falls kein Verzeichnis nicht wiederhergestellt werden konnte, falsch sonst

summary

public static String summary()
Returns:
Zusammenfassung des Wiederherstellungslaufes

status

public static String status()
Returns:
Zwischenstand des Wiederherstellungslaufes

run

public void run()
Durchlaueft mit Hilfe eines ContainerDataIterator jedes Verzeichnis aus startDirs und stellt die Verwaltungsinformation wieder her.

Specified by:
run in interface Runnable
Overrides:
run in class Thread

anyIndexFileMissing

private boolean anyIndexFileMissing(File didDir)
Prueft, ob im genannten Verzeichnis einer DId und Datenart mindestens eine Indexdatei fehlt.

Parameters:
didDir - Verzeichnis das geprüft werden soll
Returns:
Wahr wenn ein Index fehlt, falsch sonst

getMaxArchiveTimeMedID

private long[] getMaxArchiveTimeMedID(File didDir,
                                      long[] containerIds)
Gibt die maximale Archivzeit und MedienID aus einem Verzeichnis mit Containerdateien zurück. Die Archivzeit wird aus dem Header oder den Archivdaten der jüngsten Containerdatei gelesen. Da der letzte Container häufig nicht abgeschlossen ist, werden zur Ermittlung der maximalen MedienID auch die Header der älteren Containerdateien geprüft.

Parameters:
didDir - Verzeichnis mit den Containerdateien
containerIds - Aufsteigend sortiertes Array mit den ContainerIDs der in diesem Verzeichnis enthaltenen Container (kann über PersistenceManager.getSortedContainerIDs(String) ermittelt werden}
Returns:
Long-Array mit 2 Einträgen, wobei der erste die Archivzeit und der zweite die MedienID darstellt. {-1, -1} wird zurückgeliefert, wenn ein leeres Array übergeben wurde oder ein Fehler auftrat. Wenn nur die MedienID nicht ermittelt werden konnte, enthält das Array entsprechend {Archivzeit, -1}.

createContainerBackupIndex

private ContainerBackupIndex createContainerBackupIndex(File didDir)
Erstellt einen ContainerBackupIndex mit den zu sichernden ContainerIDs in einem Verzeichnis

Parameters:
didDir - Verzeichnis
Returns:
ContainerBackupIndex

calcPartitions

private static List<List<File>> calcPartitions(String persDir,
                                               int numOfPartitions)
Teilt das uebergebene Verzeichnis in eine Liste (mit numOfPartitions Elementen) von Listen von Verzeichnissen ein. Diese Liste repraesentiert das vollstaendige Verzeichnis. Jedes Element kann von einem eigenen Thread bearbeitet werden.

Parameters:
persDir -
numOfPartitions -
Returns:

stepDown

private static void stepDown(List<File> dirs)
Steigt solange die Verzeichnishierarchie hinab (maximal bis zur sv-Ebene), wie stets nur ein Verzeichnis auf dem Pfad liegt. Das unterste einzelne Verzeichnis wird dann durch die enthaltenen Unterverzeichnisse ersetzt.

Parameters:
dirs - Verzeichnisse eines Verzeichnisses

splitDirs

private static boolean splitDirs(List<List<File>> dirs,
                                 int pos)
Die uebergebene Liste enthaelt einen vollstaendigen Querschnitt durch die Verzeichnishierarchie. Diese Methode teilt die Liste von Verzeichnissen an Position pos in zwei Haelften und fuegt die zweite Haelfte hinter pos ein.

Parameters:
dirs - Liste von Listen von Verzeichnissen
pos - Position
Returns:
Wahr, falls die Verzeichnisliste geteilt wurde.