中止 VSS 操作
在以下任一情况下,可以在备份操作期间生成中止事件:
- 请求者通过调用 IVssBackupComponents::AbortBackup 显式生成中止事件。
- 编写器的 冻结 和 解冻 事件处理程序 (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 并生成 识别 事件来获取信息,则返回信息后,只需释放 IVSSBackupComponents 实例即可。
请求者在调用 IVssBackupComponents::D oSnapshotSet 时, (PrepareForSnapshot、Freeze、Thaw 和 PostSnapshot) 生成大量事件。 处理冻结和解冻事件时,编写器可能会失败,并且可以自行生成中止事件。 未能处理 PrepareForSnapshot 和 PostSnapshot 事件不会生成 Abort 事件。
当 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 中调用这些处理程序。