From 6dfc042c2117f63bf1b8fe5488eebb6a2c714bd4 Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Tue, 25 Aug 2009 17:23:12 +0200 Subject: [PATCH] Fix bugs in virDomainMigrate v2 code. Paolo Bonzini points out that in my refactoring of the code for virDomainMigrate(), I added a check for the return value from virDomainMigratePerform(). The problem is that we don't want to exit if we fail, we actually want to go on and do virDomainMigrateFinish2() with a non-0 return code to clean things up. Remove the check. While reproducing this issue, I also noticed that we wouldn't always properly propagate an error message. In particular, I found that if you blocked off the migration ports (with iptables) and then tried the migration, it would actually fail but we would get no failure output from Qemu. Therefore, we would think we succeeded, and leave a huge mess behind us. Execute the monitor command "info migrate", and look for a failure string in there as well. Signed-off-by: Chris Lalancette --- src/libvirt.c | 2 -- src/qemu_driver.c | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/libvirt.c b/src/libvirt.c index d8ea252ee5..397792820f 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -3040,8 +3040,6 @@ virDomainMigrateVersion2 (virDomainPtr domain, */ ret = domain->conn->driver->domainMigratePerform (domain, cookie, cookielen, uri, flags, dname, bandwidth); - if (ret == -1) - goto done; /* In version 2 of the migration protocol, we pass the * status code from the sender to the destination host, diff --git a/src/qemu_driver.c b/src/qemu_driver.c index c095a2966d..b921b71f26 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -7031,6 +7031,21 @@ qemudDomainMigratePerform (virDomainPtr dom, goto cleanup; } + /* it is also possible that the migrate didn't fail initially, but + * rather failed later on. Check the output of "info migrate" + */ + VIR_FREE(info); + if (qemudMonitorCommand(vm, "info migrate", &info) < 0) { + qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED, + "%s", _("could not get info about migration")); + goto cleanup; + } + if (strstr(info, "fail") != NULL) { + qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED, + _("migrate failed: %s"), info); + goto cleanup; + } + /* Clean up the source domain. */ qemudShutdownVMDaemon (dom->conn, driver, vm); paused = 0;