]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Don't report false error from MigrateFinish
authorJiri Denemark <jdenemar@redhat.com>
Thu, 2 Jul 2015 20:32:54 +0000 (22:32 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 10 Jul 2015 09:47:13 +0000 (11:47 +0200)
virDomainMigrateFinish* APIs were unfortunately designed to return the
pointer to the domain on destination and NULL on error. This looks OK in
normal cases but the same API is also called when we know migration
failed and thus we expect Finish to return NULL even if it actually did
all it was supposed to do without any error. The call is defined to
return nonnull domain pointer over RPC, which means returning NULL will
always result in an error being send. If this was not in fact an error,
the API itself wouldn't set anything to the thread local virError, which
makes the RPC layer come up with it's own "Library function returned
error but did not set virError" error.

This is quite confusing and also hard to detect by the caller. This
patch adds a special error code which can be used to check that Finish
successfully aborted migration.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
include/libvirt/virterror.h
src/qemu/qemu_migration.c
src/util/virerror.c

index 632503021a306413b03c659810570792c44513f9..f716cb97eae11735e288416ed36b387c77059959 100644 (file)
@@ -307,6 +307,7 @@ typedef enum {
     VIR_ERR_CPU_INCOMPATIBLE = 91,      /* given CPU is incompatible with host
                                            CPU*/
     VIR_ERR_XML_INVALID_SCHEMA = 92,    /* XML document doesn't validate against schema */
+    VIR_ERR_MIGRATE_FINISH_OK = 93,     /* Finish API succeeded but it is expected to return NULL */
 } virErrorNumber;
 
 /**
index 58874ee3017004d5880d46bb26fd1ad3737441ed..a9cbadaac5c656bfd713476051a85275bea639be 100644 (file)
@@ -5751,6 +5751,12 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
     }
     virObjectUnref(caps);
     virObjectUnref(cfg);
+
+    /* Set a special error if Finish is expected to return NULL as a result of
+     * successful call with retcode != 0
+     */
+    if (retcode != 0 && !dom && !virGetLastError())
+        virReportError(VIR_ERR_MIGRATE_FINISH_OK, NULL);
     return dom;
 }
 
index 60b2e793021b9533fd74baca42254213c80c4147..6dc05f48015d5ce40eb4421cf4ccae432c163eea 100644 (file)
@@ -1369,6 +1369,9 @@ virErrorMsg(virErrorNumber error, const char *info)
             else
                 errmsg = _("XML document failed to validate against schema: %s");
             break;
+        case VIR_ERR_MIGRATE_FINISH_OK:
+            errmsg = _("migration successfully aborted");
+            break;
     }
     return errmsg;
 }