Abbrechen von VSS-Vorgängen
Abbruchereignisse können während eines Sicherungsvorgangs in einem der folgenden Fälle generiert werden:
- Ein Anforderer generiert explizit ein Abort-Ereignis , indem er IVssBackupComponents::AbortBackup aufruft.
- Die Freeze - und Thaw-Ereignishandler eines Writers (CVssWriter::OnFreeze und CVssWriter::OnThaw) geben false zurück oder können im in CVssWriter::Initialize angegebenen Zeitfenster nicht abgeschlossen werden.
- Bei der Erstellung einer Schattenkopie nach dem PrepareForSnapshot-Ereignis tritt ein Fehler des Anbieters oder des VSS auf.
Abbrüche werden für Wiederherstellungsvorgänge nicht unterstützt.
Behandeln und Erstellen von Abbruchereignissen
Ein instance der IVSSBackupComponents-Schnittstelle kann nur für eine Sicherung verwendet werden. Wenn also bei der Verarbeitung einer Sicherung ein Fehler auftritt, ist es im Allgemeinen am besten, die aktuelle instance freizugeben und von vorne zu beginnen.
Ein Anforderer sollte explizit signalisieren, dass er einen Sicherungsvorgang (mithilfe von IVssBackupComponents::AbortBackup) abbricht, nachdem die eigentliche Vorbereitung für eine Sicherung, die Einbindung von Autoren oder die Erstellung einer Schattenkopie erfolgt ist.
Dies bedeutet effektiv, dass ein Anforderer nach dem Generieren eines PrepareForBackup-Ereignisses durch Aufrufen von IVssBackupComponents::P repareForBackup jederzeit einen Sicherungsvorgang beenden muss, IVssBackupComponents::AbortBackup aufrufen und dessen Rückgabe abwarten sollte, bevor die aktuelle IVSSBackupComponents-instance freigegeben wird.
Wenn beispielsweise ein Writer ein Veto gegen einen Sicherungsvorgang einlegt, sollte ein Anforderer IVssBackupComponents::AbortBackup verwenden, um alle anderen Autoren darüber zu informieren, dass der Sicherungsvorgang nicht abgeschlossen wird.
Vor dem Aufrufen von PrepareForBackup oder wenn der Aufruf von PrepareForBackup fehlschlägt, kann ein Anforderer die aktuelle instance der IVSSBackupComponents-Schnittstelle freigeben, ohne ein Abort-Ereignis generieren zu müssen.
Wenn beispielsweise der aktuelle instance von IVSSBackupComponents nur zum Abrufen von Informationen durch Aufrufen von IVssBackupComponents::GatherWriterMetadata und generieren eines Identify-Ereignisses verwendet wird, kann nach der Rückgabe von Informationen die instance von IVSSBackupComponents einfach freigegeben werden.
Ein Anforderer generiert eine Reihe von Ereignissen (PrepareForSnapshot, Freeze, Thaw und PostSnapshot), wenn er IVssBackupComponents::D oSnapshotSet aufruft. Beim Behandeln der Freeze- und Thaw-Ereignisse schlägt ein Writer möglicherweise fehl und kann selbst ein Abortereignis generieren. Fehler beim Behandeln von PrepareForSnapshot- und PostSnapshot-Ereignissen generiert kein Abortereignis.
Es ist nicht immer möglich, dass ein Anforderer weiß, ob ein Abort-Ereignis generiert wurde, wenn IVssBackupComponents::D oSnapshotSet auf einen Fehler hinweist. Daher weist ein Anforderer, der einen Sicherungsvorgang beenden muss, da die status von IVssBackupComponents::D oSnapshotSet darauf hindeutet, dass ein Problem weiterhin IVssBackupComponents::AbortBackup aufrufen sollte.
Wenn ein Anforderer IVssBackupComponents::AbortBackup aufgerufen hat, ist es nicht erforderlich, IVssBackupComponents::BackupComplete aufzurufen, bevor eine instance von IVSSBackupComponents veröffentlicht wird.
Schreibverarbeitung und Erstellung von Abbruchereignissen
Wie bereits erwähnt, kann ein Writer ein Abbruchereignis von einem Anforderer empfangen, oder der Anbieter kann ein Ereignis selbst auslösen. Außerdem ist es für einen Writer möglich, unter bestimmten Umständen mehrere Abbruchereignisse zu empfangen. Writer-Entwickler sollten jede Implementierung von CVssWriter::OnAbort in diesem Sinne programmieren.
Bei der Behandlung eines Abort-Ereignisses sollte ein Writer versuchen, den von ihm verwalteten Prozess in seinen normalen Ausführungszustand wiederherzustellen, sowie fehlerbehandlung und -protokollierung durchzuführen.
Dies kann bedeuten, dass eine Implementierung von CVssWriter::OnAbort möglicherweise viele, wenn nicht alle der gleichen Aufgaben wie der Thaw-Ereignishandler (CVssWriter::OnThaw) und der PostSnapshot-Ereignishandler (CVssWriter::OnPostSnapshot) ausführen muss, und diese Handler können innerhalb von CVssWriter::OnAbort aufgerufen werden.