[libvirt] [PATCH] qemu: Fix migration with dname

Jiri Denemark jdenemar at redhat.com
Tue Oct 4 10:06:10 UTC 2011


Destination libvirtd remembers the original name in the prepare phase
and clears it in the finish phase. The original name is used when
comparing domain name in migration cookie.
---
Notes:
    Originally, I wanted to transfer the new name in migration cookie but
    that appeared to be much more complicated and it would require adding
    new Confirm API since the current version does not have 'dname'
    parameter.

 src/qemu/qemu_domain.c    |    1 +
 src/qemu/qemu_domain.h    |    1 +
 src/qemu/qemu_migration.c |   19 ++++++++++++++++---
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d3ad192..65f721a 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -231,6 +231,7 @@ static void qemuDomainObjPrivateFree(void *data)
     qemuDomainObjFreeJob(priv);
     VIR_FREE(priv->vcpupids);
     VIR_FREE(priv->lockState);
+    VIR_FREE(priv->origname);
 
     /* This should never be non-NULL if we get here, but just in case... */
     if (priv->mon) {
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index cdf1375..d9f323c 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -126,6 +126,7 @@ struct _qemuDomainObjPrivate {
     int jobs_queued;
 
     unsigned long migMaxBandwidth;
+    char *origname;
 };
 
 struct qemuDomainWatchdogEvent
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 1122dab..4516231 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -254,12 +254,18 @@ error:
 static qemuMigrationCookiePtr
 qemuMigrationCookieNew(virDomainObjPtr dom)
 {
+    qemuDomainObjPrivatePtr priv = dom->privateData;
     qemuMigrationCookiePtr mig = NULL;
+    const char *name;
 
     if (VIR_ALLOC(mig) < 0)
         goto no_memory;
 
-    if (!(mig->name = strdup(dom->def->name)))
+    if (priv->origname)
+        name = priv->origname;
+    else
+        name = dom->def->name;
+    if (!(mig->name = strdup(name)))
         goto no_memory;
     memcpy(mig->uuid, dom->def->uuid, VIR_UUID_BUFLEN);
 
@@ -1064,6 +1070,7 @@ qemuMigrationPrepareAny(struct qemud_driver *driver,
     unsigned long long now;
     qemuMigrationCookiePtr mig = NULL;
     bool tunnel = !!st;
+    char *origname = NULL;
 
     if (virTimeMs(&now) < 0)
         return -1;
@@ -1078,7 +1085,7 @@ qemuMigrationPrepareAny(struct qemud_driver *driver,
 
     /* Target domain name, maybe renamed. */
     if (dname) {
-        VIR_FREE(def->name);
+        origname = def->name;
         def->name = strdup(dname);
         if (def->name == NULL)
             goto cleanup;
@@ -1095,6 +1102,8 @@ qemuMigrationPrepareAny(struct qemud_driver *driver,
     }
     def = NULL;
     priv = vm->privateData;
+    priv->origname = origname;
+    origname = NULL;
 
     if (!(mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,
                                        QEMU_MIGRATION_COOKIE_LOCKSTATE)))
@@ -1175,6 +1184,7 @@ qemuMigrationPrepareAny(struct qemud_driver *driver,
     ret = 0;
 
 cleanup:
+    VIR_FREE(origname);
     virDomainDefFree(def);
     VIR_FORCE_CLOSE(dataFD[0]);
     VIR_FORCE_CLOSE(dataFD[1]);
@@ -2542,6 +2552,7 @@ qemuMigrationFinish(struct qemud_driver *driver,
     qemuMigrationCookiePtr mig = NULL;
     virErrorPtr orig_err = NULL;
     int cookie_flags = 0;
+    qemuDomainObjPrivatePtr priv = vm->privateData;
 
     VIR_DEBUG("driver=%p, dconn=%p, vm=%p, cookiein=%s, cookieinlen=%d, "
               "cookieout=%p, cookieoutlen=%p, flags=%lx, retcode=%d",
@@ -2695,8 +2706,10 @@ endjob:
     }
 
 cleanup:
-    if (vm)
+    if (vm) {
+        VIR_FREE(priv->origname);
         virDomainObjUnlock(vm);
+    }
     if (event)
         qemuDomainEventQueue(driver, event);
     qemuMigrationCookieFree(mig);
-- 
1.7.7




More information about the libvir-list mailing list