中止 VSS 作業
在 下列任一情況下,可以在備份作業期間產生中止事件:
- 要求者藉由呼叫IVssBackupComponents::AbortBackup明確產生Abort 事件。
- 寫入器的 Freeze 和 Thaw 事件處理常式 (CVssWriter::OnFreeze 和 CVssWriter::OnThaw) 傳回 false,或無法在 CVssWriter::Initialize中指定的時間範圍中完成。
- 在 PrepareForSnapshot 事件之後建立陰影複製期間,提供者或 VSS 發生任何失敗。
還原作業不支援中止。
要求者處理和建立中止事件
IVSSBackupComponents介面的實例只能用於一個備份,因此如果處理備份時發生錯誤,通常最好釋放目前的實例並重新開始。
要求者應該明確表示它正在中止備份作業, (使用 IVssBackupComponents::AbortBackup) 只有在實際準備備份、涉及寫入器或建立陰影複製時才會發生。
實際上,這表示每當要求者透過呼叫IVssBackupComponents::P repareForBackup來產生PrepareForBackup事件之後,它都應該呼叫IVssBackupComponents::AbortBackup並等候其傳回,再釋放目前的IVSSBackupComponents實例。
例如,如果寫入器已經執行備份作業,要求者應該使用 IVssBackupComponents::AbortBackup 來通知所有其他寫入器,備份作業將不會完成。
在呼叫 PrepareForBackup之前,或呼叫 PrepareForBackup 失敗之前,要求者可以釋放 IVSSBackupComponents 介面的目前實例,而不需要產生中止事件。
例如,如果目前的 IVSSBackupComponents 實例只用來透過呼叫 IVssBackupComponents::GatherWriterMetadata 並產生 Identify 事件來取得資訊,一旦資訊傳回 IVSSBackupComponents 的 實例即可直接釋放。
要求者會在呼叫IVssBackupComponents::D oSnapshotSet時產生一些事件 (PrepareForSnapshot、Freeze、Thaw和PostSnapshot) 。 處理凍結和解除凍結事件時,寫入器可能會失敗,而且可以自行產生中止事件。 無法處理 PrepareForSnapshot 和 PostSnapshot 事件不會產生中止事件。
當 IVssBackupComponents::D oSnapshotSet 指出失敗時,要求者不一定會知道是否產生中止事件。 因此,需要終止備份作業的要求者,因為 IVssBackupComponents::D oSnapshotSet 的狀態表示問題仍應呼叫 IVssBackupComponents::AbortBackup。
如果要求者已呼叫IVssBackupComponents::AbortBackup,則不需要在釋放IVSSBackupComponents實例之前呼叫IVssBackupComponents::BackupComplete。
寫入器處理和建立中止事件
如先前所述,寫入器可以從要求者接收中止事件,或者提供者可以觸發一個本身。 此外,寫入器在某些情況下可能會接收多個中止事件。 寫入器開發人員應該以下列方式撰寫 CVssWriter::OnAbort 的任何實作程式碼。
在處理中止事件時,寫入器應該嘗試將它所管理的任何進程還原到其正常執行狀態,以及執行任何錯誤處理和記錄。
這可能表示 CVssWriter::OnAbort 的實作可能必須執行許多, 如果不是全部,則與 Thaw 事件處理常式相同的工作 (CVssWriter::OnThaw) 和 PostSnapshot 事件處理常式 (CVssWriter::OnPostSnapshot) ,而且可以從 CVssWriter::OnAbort內呼叫這些處理常式。