[libvirt] [PATCHv4 06/51] snapshot: improve reverting to qemu paused snapshots

Eric Blake eblake at redhat.com
Fri Sep 2 18:03:38 UTC 2011


On 09/01/2011 10:24 PM, Eric Blake wrote:
> If you take a checkpoint snapshot of a running domain, then pause
> qemu, then restore the snapshot, the result should be a running
> domain, but the code was leaving things paused.  Furthermore, if
> you take a checkpoint of a paused domain, then run, then restore,
> there was a brief but non-deterministic window of time where the
> domain was running rather than paused.  Fix both of these
> discrepancies by always pausing before restoring.
>
> Also, check that the VM is active every time lock is dropped
> between two monitor calls.
>
> Finally, straighten out the events that get emitted on each
> transition.
>
> * src/qemu/qemu_driver.c (qemuDomainRevertToSnapshot): Always
> pause before reversion, and improve events.

> -        } else {
> -            virDomainObjSetState(vm, VIR_DOMAIN_RUNNING,
> -                                 VIR_DOMAIN_RUNNING_FROM_SNAPSHOT);
> +            virDomainEventFree(event);
> +            if (was_stopped) {
> +                /* Transition 2 */
> +                detail = VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT;
> +                event = virDomainEventNewFromObj(vm,
> +                                                 VIR_DOMAIN_EVENT_STARTED,
> +                                                 detail);
> +            } else if (was_running) {
> +                /* Transition 8 */
> +                detail = VIR_DOMAIN_EVENT_RESUMED;
> +                event = virDomainEventNewFromObj(vm,
> +                                                 VIR_DOMAIN_EVENT_RESUMED,
> +                                                 detail);
> +            }
>           }

Transition 5 leaks a freed event pointer to the rest of the function 
(never a good idea).  I'm squashing this in before pushing the portion 
of series that includes this patch.

diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c
index 10357e4..e45b29e 100644
--- i/src/qemu/qemu_driver.c
+++ w/src/qemu/qemu_driver.c
@@ -9011,6 +9011,7 @@ static int 
qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
              if (rc < 0)
                  goto endjob;
              virDomainEventFree(event);
+            event = NULL;
              if (was_stopped) {
                  /* Transition 2 */
                  detail = VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT;


-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list