在以下任一情况下,可以在备份操作期间生成 Abort 事件:
- 通过调用 IVssBackupComponents::AbortBackup,请求者可显式生成 Abort 事件。
- 编写器的 Freeze 和 Thaw 事件处理程序(CVssWriter::OnFreeze 和 CVssWriter::OnThaw)返回 false,或者无法在 CVssWriter::Initialize 中指定的窗口内完成。
- 在 PrepareForSnapshot 事件之后创建卷影副本期间,提供程序或 VSS 会发生任何故障。
还原操作不支持中止。
Abort 事件的请求者处理和创建
IVSSBackupComponents 接口的实例只能用于一个备份,因此,如果处理备份时出错,最好释放当前实例并重新开始。
仅在实际备份准备、涉及编写器或创建卷影副本之后,请求者才应显式指明它正在中止备份作(使用 IVssBackupComponents::AbortBackup)。
实际上,这意味着每当请求者通过调用 IVssBackupComponents::PrepareForBackup生成 PrepareForBackup 事件后,需要停止备份操作时,应调用 IVssBackupComponents::AbortBackup,并在释放当前 IVSSBackupComponents 实例之前等待其返回。
例如,如果编写器否决了备份作,则请求者应使用 IVssBackupComponents::AbortBackup 来通知所有其他编写器备份作不会完成。
在调用 PrepareForBackup之前,或者调用 PrepareForBackup 失败,则请求者可以释放 IVSSBackupComponents 接口的当前实例,而无需生成中止事件。
例如,如果 IVSSBackupComponents 的当前实例仅用于通过调用 IVssBackupComponents::GatherWriterMetadata 获取信息并生成一个 Identify 事件,一旦返回信息,则只需释放 IVSSBackupComponents 实例。
当请求方调用 IVssBackupComponents::D oSnapshotSet时,请求者将生成许多事件(PrepareForSnapshot、冻结、解冻和 PostSnapshot)。 处理 Freeze 和 Thaw 事件时,编写器可能会失败,并且可能会自行生成 Abort 事件。 未能处理 PrepareForSnapshot 和 PostSnapshot 事件不会生成中止事件。
当 IVssBackupComponents::DoSnapshotSet 指示失败时,请求者并不总是能够知道是否生成了 Abort 事件。 因此,若请求者因 IVssBackupComponents::DoSnapshotSet 状态指明问题而需要终止备份操作,请求者仍应调用 IVssBackupComponents::AbortBackup。
如果请求者已调用 IVssBackupComponents::AbortBackup,则无需在发布 IVSSBackupComponents实例之前调用 IVssBackupComponents::BackupComplete。
Abort 事件的编写器处理和创建
如前所述,编写器可以从请求方接收中止事件,也可以由提供程序自行触发中止事件。 此外,在某些情况下,编写器可能会收到多个 Abort 事件。 编写器开发人员应根据这一点编码 CVssWriter::OnAbort 的任何实现。
在处理 Abort 事件时,编写器应尝试将自身管理的任何进程还原到其正常运行状态,以及执行任何错误处理和日志记录。
这可能意味着 CVssWriter::OnAbort 的实现可能需要执行许多任务,如果不是全部,则可能需要执行与 Thaw 事件处理程序(CVssWriter::OnThaw)和 PostSnapshot 事件处理程序(CVssWriter::OnPostSnapshot)相同的任务,而这些处理程序可以在 CVssWriter::OnAbort的实现中调用。