On Wed, Feb 25, 2009 at 02:30:35PM +0100, Chris Lalancette wrote:
All,
There was a logic error in the Qemu driver when doing a non-live migrate.
During a non-live migrate, on the source host during the Perform step, we
pause the domain; however, if there was ever a failure, we were forgetting
to unpause the domain, meaning that the domain was paused forever. Add a
flag to tell us when we should unpause the domain after a failure.
Princile sounds fine ... but
Signed-off-by: Chris Lalancette <clalance(a)redhat.com>
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index a8a2ae7..bcc4690 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -4331,6 +4331,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
char cmd[HOST_NAME_MAX+50];
char *info = NULL;
int ret = -1;
+ int paused = 0;
qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
@@ -4352,6 +4353,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
qemudMonitorCommand (vm, cmd, &info);
DEBUG ("stop reply: %s", info);
VIR_FREE(info);
+ paused = 1;
event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_SUSPENDED,
@@ -4407,6 +4409,21 @@ qemudDomainMigratePerform (virDomainPtr dom,
ret = 0;
cleanup:
+ if (ret != 0 && paused) {
+ /* we got here through some sort of failure; start the domain again */
+ snprintf(cmd, sizeof cmd, "%s", "cont");
sizeof without braces ?
+ qemudMonitorCommand (vm, cmd, &info);
and why not just doing
qemudMonitorCommand (vm, "cont", &info);
and avoiding this ?
and do we care about error handling there ?
+ DEBUG ("cont reply: %s", info);
+ VIR_FREE(info);
no need to do VIR_FREE(info) there since it's done below
+ event = virDomainEventNewFromObj(vm,
+ VIR_DOMAIN_EVENT_RESUMED,
+ VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
+ if (event)
+ qemuDomainEventQueue(driver, event);
+ event = NULL;
+ }
+
VIR_FREE(info);
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/