]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix bugs in virDomainMigrate v2 code.
authorChris Lalancette <clalance@redhat.com>
Tue, 25 Aug 2009 15:23:12 +0000 (17:23 +0200)
committerChris Lalancette <clalance@redhat.com>
Wed, 2 Sep 2009 15:23:06 +0000 (17:23 +0200)
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 <clalance@redhat.com>
src/libvirt.c
src/qemu_driver.c

index d8ea252ee57b265e7cbc6fd0798f0815d659c246..397792820fb0adf53ea7cacdb5f211d307b92dbb 100644 (file)
@@ -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,
index c095a2966db8a1955dfbd78bcfec617a5a345145..b921b71f268121bdda276e742522b93dff2cf620 100644 (file)
@@ -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;