[libvirt] [PATCH 2/2] snapshot: enforce REVERT_FORCE on qemu
Laine Stump
laine at laine.org
Tue Oct 4 19:26:44 UTC 2011
On 09/30/2011 02:52 PM, Eric Blake wrote:
> Implements the documentation for snapshot revert vs. force.
>
> Part of the patch tightens existing behavior (previously, reverting
> to an old snapshot without<domain> was blindly attempted, now it
> requires force), while part of it relaxes behavior (previously, it
> was not possible to revert an active domain to an ABI-incompatible
> active snapshot, now force allows this transition).
>
> * src/qemu/qemu_driver.c (qemuDomainRevertToSnapshot): Check for
> risky situations, and allow force to get past them.
> ---
> src/qemu/qemu_driver.c | 47 +++++++++++++++++++++++++++++++++++++----------
> 1 files changed, 37 insertions(+), 10 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 5110102..efd60a7 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -9753,7 +9753,8 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> * 7. paused -> inactive: EVENT_STOPPED
> * 8. paused -> running: EVENT_RESUMED
> * 9. paused -> paused: none
> - * Also, several transitions occur even if we fail partway through.
> + * Also, several transitions occur even if we fail partway through,
> + * and use of FORCE can cause multiple transitions.
> */
>
> qemuDriverLock(driver);
> @@ -9789,6 +9790,24 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> "yet"));
> goto cleanup;
> }
> + if (!(flags& VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) {
> + if (!snap->def->dom) {
> + qemuReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY,
> + _("snapshot lacks domain '%s' rollback details"),
> + snap->def->name);
> + goto cleanup;
> + }
> + if (virDomainObjIsActive(vm)&&
> + !(snap->def->state == VIR_DOMAIN_RUNNING
> + || snap->def->state == VIR_DOMAIN_PAUSED)&&
> + (flags& (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING |
> + VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED))) {
> + qemuReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY,
> + _("must respawn qemu to start inactive snapshot"));
> + goto cleanup;
> + }
> + }
> +
>
> if (vm->current_snapshot) {
> vm->current_snapshot->def->current = false;
> @@ -9818,11 +9837,6 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> VIR_FREE(xml);
> if (!config)
> goto cleanup;
> - } else {
> - /* XXX Fail if VIR_DOMAIN_REVERT_FORCE is not set, rather than
> - * blindly hoping for the best. */
> - VIR_WARN("snapshot is lacking rollback information for domain '%s'",
> - snap->def->name);
> }
>
> if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY)< 0)
> @@ -9843,10 +9857,22 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> /* Transitions 5, 6, 8, 9 */
> /* Check for ABI compatibility. */
> if (config&& !virDomainDefCheckABIStability(vm->def, config)) {
> - /* XXX Add VIR_DOMAIN_REVERT_FORCE to permit killing
> - * and restarting a new qemu, since loadvm monitor
> - * command won't work. */
> - goto endjob;
> + if (!(flags& VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) {
> + /* Alter existing error to give correct category. */
> + virErrorPtr err = virGetLastError();
> + err->code = VIR_ERR_SNAPSHOT_REVERT_RISKY;
> + goto endjob;
> + }
> + qemuProcessStop(driver, vm, 0,
> + VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT);
> + virDomainAuditStop(vm, "from-snapshot");
> + detail = VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT;
> + event = virDomainEventNewFromObj(vm,
> + VIR_DOMAIN_EVENT_STOPPED,
> + detail);
> + if (event)
> + qemuDomainEventQueue(driver, event);
> + goto load;
> }
>
> priv = vm->privateData;
> @@ -9882,6 +9908,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> virDomainObjAssignDef(vm, config, false);
> } else {
> /* Transitions 2, 3 */
> + load:
> was_stopped = true;
> if (config)
> virDomainObjAssignDef(vm, config, false);
ACK.
More information about the libvir-list
mailing list