de.bsvrz.ars.ars.mgmt.tasks
Class BackupTask

java.lang.Object
  extended by java.lang.Thread
      extended by de.bsvrz.ars.ars.mgmt.tasks.Task
          extended by de.bsvrz.ars.ars.mgmt.tasks.SingleTask
              extended by de.bsvrz.ars.ars.mgmt.tasks.SingleClientSenderTask
                  extended by de.bsvrz.ars.ars.mgmt.tasks.BackupTask
All Implemented Interfaces:
SuspendableTask, ClientSenderInterface, Runnable

public class BackupTask
extends SingleClientSenderTask

Task zur Durchführung eines Sicherungslaufs.

Author:
beck et al. projects GmbH, Alexander Schmidt

Nested Class Summary
static class BackupTask.BackupResultData
          Diese Klasse sieht aus wie ein ResultData, wird aber nur intern verwendet, um einen über den Scheduler angestoßenen Sicherungslauf von einem extern angestoßenen zu unterscheiden
private static class BackupTask.BackupResultDataHolder
          Holder-Objekt, dass eine statische BackupResultData-Instanz (threadsicher) bereitstellt
private static class BackupTask.ContainerEntry
          Immutable Klasse, die eine ContainerID mit der zugehörigen ContainerLocation, also dem Speicherort (der Datenidentifikation) verknüpft.
private  class BackupTask.ContainerLocation
          Immutable Klasse, die speichert, an welchem Ort sich eine bestimmte ContainerID befindet.
private  class BackupTask.DataIdentificationHelper
          Hilfsklasse, die zu einem Verzeichnis sowohl die passende DataIdentNode als auch die zugehörige BackupTask.ContainerLocation ermittelt.
 
Nested classes/interfaces inherited from class java.lang.Thread
Thread.State, Thread.UncaughtExceptionHandler
 
Field Summary
private static BackupModul _backupModul
          das verwendete Backupmodul
private static int _currentBackupMediumID
          die immer aktuell gehaltene backupMediumID
private  File _currentIndexFile
          Datei, in der die momentan auf dem Medium gesicherten Indexdaten abgelegt sind
private  File _indexFileDir
          Temporäres Verzeichnis in dem _currentIndexFile abgelegt ist
private  LongTermTaskStatePublisher.Task _longTermTaskStatePublisherTask
          Objekt, dem Informationen zum aktuellen Zustand der Task und dem Fortschritt von langwierigen Arbeiten übergeben werden.
private  File _tmpFile
          Temporäre Datei die zur Erzeugung des temporären Verzeichnisses +_indexFileDir benutzt wird.
static String INDEXFILE_NAME
          Name der Datei, in der alle Indexdaten des momentanen Mediums temporär abgelegt werden
 
Fields inherited from class de.bsvrz.ars.ars.mgmt.tasks.SingleClientSenderTask
atgQuery, ddResponse, deserializer, queryAppObj, queryIdx, SENDCONTROL_TIMEOUT, serializerVersion, syncObj
 
Fields inherited from class de.bsvrz.ars.ars.mgmt.tasks.Task
archMgr, didTree, INDEX_MEMORY_SIZE, isTerminated, logger, persMgr, ringOfDeathListener, taskStepListeners
 
Fields inherited from class java.lang.Thread
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY
 
Fields inherited from interface de.bsvrz.dav.daf.main.ClientSenderInterface
START_SENDING, STOP_SENDING, STOP_SENDING_NO_RIGHTS, STOP_SENDING_NOT_A_VALID_SUBSCRIPTION
 
Constructor Summary
BackupTask(ArchiveManager archiveMgr, RingOfDeathListener rodl, RingBuffer<ResultData> inputData, LongTermTaskStatePublisher longTermTaskStatePublisher)
          Erstellt einen neuen BackupTask
 
Method Summary
private  void backupContainerList(ArrayList<BackupTask.ContainerEntry> containerList, String backupRunID)
          Sichert alle angegebenen Container.
private  void clearCurrentIndexFile()
           
private  void closeBackup(ArrayList<BackupTask.ContainerEntry> containerList)
           
private  ArrayList<BackupTask.ContainerEntry> containerWalk()
          Laeuft rekursiv durch ein Verzeichnis und laedt die Container in den Index.
private  void deleteFile(File file)
          Löscht eine Datei un gibt eine Warnung aus, wenn das Löschen fehlschlägt
private  void disposeIndices()
          Löscht die Indexdateien und sonstige temporäre Dateien und Verzeichnisse
 int estimateIndexSize(int countSavedContainers)
          Schätzt die Indexgröße für eine angegebene Zahl Einträge.
static BackupModul getBackupModul()
          Gibt das verwendete Backupmodul zurück
static BackupTask.BackupResultData getBackupResultData()
          Gibt einen BackupTask.BackupResultData-Dummy zurück
private  List<Long> getContainerIDsToBackup(File didDir)
          Ermittelt, welche Container in einem Verzeichnis gesichert werden sollen.
static List<Long> getContainerIDsToBackupStatic(File didDir, PersistenceManager persistenceManager, Task task)
          Ermittelt, welche Container in einem Verzeichnis gesichert werden sollen.
static int getLastUsedMediumID()
          Gibt die zuletzt verwendete MedienID zurück
private  void increaseMediumID()
          Erhöht die MedienID um 1
private  void initIndices()
          Erstellt das temporäre Verzeichnis für die Indexdatei und erstellt eine leere Indexdatei
private  void markContainer(long containerId, BackupTask.ContainerLocation containerLocation, boolean toBeMarkedAsSaved)
          Markiert einen Container als gesichert bzw.
private  void requestBackupMedium(int backupMediumID, String backupRunID)
          Mit dieser Methode wird der Operator aufgefordert, ein bestimmtes Medium einzulegen.
private  void rollbackChanges(ArrayList<BackupTask.ContainerEntry> containerList)
           
 void run()
           
 void runBackup()
          Startet den Sicherungslauf
static void setBackupModul(String propertiesFile)
          Setzt das zu verwendende Backup-Modul.
static void setLastUsedMediumID(int mediumID)
          Setzt die zuletzt verwendete MedienID.
private  void tryRequestBackupMedium(String backupRunID)
           
protected  void work(ResultData resultData)
          Diese Methode ist zu ueberschreiben, um die konkrete Aufgabe der Task zu implementieren.
 
Methods inherited from class de.bsvrz.ars.ars.mgmt.tasks.SingleClientSenderTask
dataRequest, getObjectsFromDAV, init, isRequestSupported, parseArchiveDataSpec, sendErrorResponse, sendErrorResponse, sendSuccessResponse, sendSuccessResponse, subscribeSender, unsubscribeSender
 
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

_backupModul

private static BackupModul _backupModul
das verwendete Backupmodul


INDEXFILE_NAME

public static final String INDEXFILE_NAME
Name der Datei, in der alle Indexdaten des momentanen Mediums temporär abgelegt werden

See Also:
Constant Field Values

_currentBackupMediumID

private static int _currentBackupMediumID
die immer aktuell gehaltene backupMediumID


_currentIndexFile

private File _currentIndexFile
Datei, in der die momentan auf dem Medium gesicherten Indexdaten abgelegt sind


_indexFileDir

private File _indexFileDir
Temporäres Verzeichnis in dem _currentIndexFile abgelegt ist


_tmpFile

private File _tmpFile
Temporäre Datei die zur Erzeugung des temporären Verzeichnisses +_indexFileDir benutzt wird.


_longTermTaskStatePublisherTask

private final LongTermTaskStatePublisher.Task _longTermTaskStatePublisherTask
Objekt, dem Informationen zum aktuellen Zustand der Task und dem Fortschritt von langwierigen Arbeiten übergeben werden.

Constructor Detail

BackupTask

public BackupTask(ArchiveManager archiveMgr,
                  RingOfDeathListener rodl,
                  RingBuffer<ResultData> inputData,
                  LongTermTaskStatePublisher longTermTaskStatePublisher)
Erstellt einen neuen BackupTask

Parameters:
archiveMgr - Archivmanager
rodl - RingOfDeathListener
inputData - Eingangswarteschlange
longTermTaskStatePublisher - siehe LongTermTaskStatePublisher
Method Detail

run

public void run()
Specified by:
run in interface Runnable
Overrides:
run in class SingleTask
See Also:
Runnable.run()

work

protected void work(ResultData resultData)
Description copied from class: SingleTask
Diese Methode ist zu ueberschreiben, um die konkrete Aufgabe der Task zu implementieren. In der Methode soll keine weitere Warteschlangen-Synchronisation stattfinden.

Specified by:
work in class SingleTask
Parameters:
resultData - Zu verarbeitender Datensatz aus der Eingangswarteschlange

runBackup

public void runBackup()
               throws BackupException
Startet den Sicherungslauf

Throws:
BackupException - Fehler beim Backup

tryRequestBackupMedium

private void tryRequestBackupMedium(String backupRunID)
                             throws BackupException
Throws:
BackupException

containerWalk

private ArrayList<BackupTask.ContainerEntry> containerWalk()
                                                    throws PersistenceException
Laeuft rekursiv durch ein Verzeichnis und laedt die Container in den Index.

Returns:
Liste mit den gefundenen Containern
Throws:
PersistenceException - Fehler in der Persistenz

getContainerIDsToBackup

private List<Long> getContainerIDsToBackup(File didDir)
                                    throws PersistenceException
Ermittelt, welche Container in einem Verzeichnis gesichert werden sollen. Diese Funktion wird nur benutzt, wenn der schnelle Weg über ContainerBackupIndex nicht funktioniert.

Parameters:
didDir - Verzeichnis, welches geprüft wird
Returns:
Liste mit ContainerIDs
Throws:
PersistenceException - Fehler in der Persistenz

getContainerIDsToBackupStatic

public static List<Long> getContainerIDsToBackupStatic(File didDir,
                                                       PersistenceManager persistenceManager,
                                                       Task task)
                                                throws PersistenceException
Ermittelt, welche Container in einem Verzeichnis gesichert werden sollen. Wird statisch bereitgestellt, da auch an anderen Stellen gebraucht

Parameters:
didDir - Verzeichnis, welches geprüft wird
persistenceManager - PersistenceManager
task - Task
Returns:
Liste mit ContainerIDs
Throws:
PersistenceException - Fehler in der Persistenz

backupContainerList

private void backupContainerList(ArrayList<BackupTask.ContainerEntry> containerList,
                                 String backupRunID)
                          throws BackupException
Sichert alle angegebenen Container.

Parameters:
containerList - Liste mit Containern, welche gesichert werden sollen
backupRunID - ID des Backuplaufes
Throws:
BackupException - Fehler beim Backup

closeBackup

private void closeBackup(ArrayList<BackupTask.ContainerEntry> containerList)
                  throws BackupException
Throws:
BackupException

clearCurrentIndexFile

private void clearCurrentIndexFile()
                            throws BackupException
Throws:
BackupException

rollbackChanges

private void rollbackChanges(ArrayList<BackupTask.ContainerEntry> containerList)
                      throws BackupException
Throws:
BackupException

requestBackupMedium

private void requestBackupMedium(int backupMediumID,
                                 String backupRunID)
                          throws BackupException
Mit dieser Methode wird der Operator aufgefordert, ein bestimmtes Medium einzulegen. Die Methode blockiert bis der Operator das Einlegen bestätigt oder abgebrochen hat.

Parameters:
backupMediumID - MediumID
backupRunID - ID des Backupvorgangs
Throws:
BackupException - Medium nicht verfügbar

markContainer

private void markContainer(long containerId,
                           BackupTask.ContainerLocation containerLocation,
                           boolean toBeMarkedAsSaved)
                    throws BackupException
Markiert einen Container als gesichert bzw. ungesichert und aktualisiert den Index entsprechend.

Parameters:
containerId - ContainerID
containerLocation - Speicherort des Containers
toBeMarkedAsSaved - falls true, wird der Container als saved markiert, ansonsten als unsaved
Throws:
BackupException - Fehler bei der Durchführung des Auftrags

initIndices

private void initIndices()
                  throws IOException
Erstellt das temporäre Verzeichnis für die Indexdatei und erstellt eine leere Indexdatei

Throws:
IOException - IO-Fehler beim Vorgang

disposeIndices

private void disposeIndices()
Löscht die Indexdateien und sonstige temporäre Dateien und Verzeichnisse


deleteFile

private void deleteFile(File file)
Löscht eine Datei un gibt eine Warnung aus, wenn das Löschen fehlschlägt

Parameters:
file - Datei die gelöscht werden soll

estimateIndexSize

public int estimateIndexSize(int countSavedContainers)
Schätzt die Indexgröße für eine angegebene Zahl Einträge. Wird gebraucht um festzustellen, ob noch genug Platz für einen Container + Index auf einem Medium ist

Parameters:
countSavedContainers - Anzahl der Container
Returns:
Byte-Anzahl die der Index maximal brauchen wird.

increaseMediumID

private void increaseMediumID()
Erhöht die MedienID um 1


setBackupModul

public static void setBackupModul(String propertiesFile)
                           throws BackupException
Setzt das zu verwendende Backup-Modul.

Parameters:
propertiesFile - Datei in dem das zu verwendende Modul gespeichert ist.
Throws:
BackupException - Fehler beim Vorgang

getBackupModul

public static BackupModul getBackupModul()
Gibt das verwendete Backupmodul zurück

Returns:
das verwendete Backupmodul

getLastUsedMediumID

public static int getLastUsedMediumID()
Gibt die zuletzt verwendete MedienID zurück

Returns:
zuletzt verwendete MedienID

setLastUsedMediumID

public static void setLastUsedMediumID(int mediumID)
Setzt die zuletzt verwendete MedienID. Für nach nächste Backup wird der um 1 inkrementierte Wert verwendet

Parameters:
mediumID - zuletzt verwendete MedienID

getBackupResultData

public static BackupTask.BackupResultData getBackupResultData()
Gibt einen BackupTask.BackupResultData-Dummy zurück

Returns:
eine leere BackupResultData-Klasse die von ResultData erbt.