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(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org