[libvirt] [PATCH] snapshot: fix state after external snapshot of S3 domain

Osier Yang jyang at redhat.com
Thu Jan 24 03:28:00 UTC 2013


On 2013年01月24日 07:27, Eric Blake wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=876829 complains that
> if a guest is put into S3 state (such as via virsh dompmsuspend)
> and then an external snapshot is taken, qemu forcefully transitions
> the domain to paused, but libvirt doesn't reflect that change
> internally.  Thus, a user has to use 'virsh suspend' to get libvirt
> back in sync with qemu state, and if the user doesn't know this
> trick, then the guest appears hung.
>
> * src/qemu/qemu_driver.c (qemuDomainSnapshotCreateActiveExternal):
> Track fact that qemu wakes up a suspended domain on migration.
> ---
>   src/qemu/qemu_driver.c | 19 +++++++++++++++++--
>   1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 6d4c1e9..da30dcb 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1,7 +1,7 @@
>   /*
>    * qemu_driver.c: core driver methods for managing qemu guests
>    *
> - * Copyright (C) 2006-2012 Red Hat, Inc.
> + * Copyright (C) 2006-2013 Red Hat, Inc.
>    * Copyright (C) 2006 Daniel P. Berrange
>    *
>    * This library is free software; you can redistribute it and/or
> @@ -11124,6 +11124,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
>       bool atomic = !!(flags&  VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC);
>       bool transaction = qemuCapsGet(priv->caps, QEMU_CAPS_TRANSACTION);
>       int thaw = 0; /* 1 if freeze succeeded, -1 if freeze failed */
> +    bool pmsuspended = false;
>
>       if (qemuDomainObjBeginAsyncJobWithDriver(driver, vm,
>                                                QEMU_ASYNC_JOB_SNAPSHOT)<  0)
> @@ -11144,7 +11145,9 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
>       }
>
>       /* we need to resume the guest only if it was previously running */

As you changed the codes, the comment needs to be changed too.

> -    if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
> +    if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PMSUSPENDED) {
> +        pmsuspended = true;
> +    } else if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
>           resume = true;
>
>           /* For external checkpoints (those with memory), the guest
> @@ -11226,6 +11229,18 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
>           vm = NULL;
>           if (event)
>               qemuDomainEventQueue(driver, event);
> +    } else if (memory&&  pmsuspended) {
> +        /* qemu 1.3 is unable to save a domain in pm-suspended (S3)
> +         * state; so we must emit an event stating that it was
> +         * converted to paused.  */
> +        virDomainEventPtr event;
> +
> +        virDomainObjSetState(vm, VIR_DOMAIN_PAUSED,
> +                             VIR_DOMAIN_PAUSED_FROM_SNAPSHOT);
> +        event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_SUSPENDED,
> +                                         VIR_DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT);
> +        if (event)
> +            qemuDomainEventQueue(driver, event);
>       }
>
>       ret = 0;

ACK with the comment fixed.




More information about the libvir-list mailing list