[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[PATCH] Implement finer grained migration control for Xen (was: Re: [libvirt] [PATCH] Finer grained migration control)



Anno domini 2009 Daniel Veillard scripsit:

> On Mon, Oct 12, 2009 at 01:32:26PM +0200, Chris Lalancette wrote:
> > Normally, when you migrate a domain from host A to host B,
> > the domain on host A remains defined but shutoff and the domain
> > on host B remains running but is a "transient".  Add a new
> > flag to virDomainMigrate() to allow the original domain to be
> > undefined on source host A, and a new flag to virDomainMigrate() to
> > allow the new domain to be persisted on the destination host B.

> > Signed-off-by: Chris Lalancette <clalance redhat com>

Thanks for the ground work!

Attached you can find a patch implementing the same flags for Xen:

 * src/xen/xen_driver.c: Add support for VIR_MIGRATE_PERSIST_DEST flag
 * src/xen/xend_internal.c: Add support for VIR_MIGRATE_UNDEFINE_SOURCE flag

I'm not totaly sure if there are better ways to handle all the error
cases. The current solution seemed to be a same one for me.

Ciao
Max
-- 
Eine Freie Meinung in einem Freien Kopf
für einen Freien Staat voll Freier Bürger.
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
index 5273a11..18882c0 100644
--- a/src/xen/xen_driver.c
+++ b/src/xen/xen_driver.c
@@ -1204,9 +1204,53 @@ xenUnifiedDomainMigrateFinish (virConnectPtr dconn,
                                const char *cookie ATTRIBUTE_UNUSED,
                                int cookielen ATTRIBUTE_UNUSED,
                                const char *uri ATTRIBUTE_UNUSED,
-                               unsigned long flags ATTRIBUTE_UNUSED)
+                               unsigned long flags)
 {
-    return xenUnifiedDomainLookupByName (dconn, dname);
+    virDomainPtr dom = NULL;
+    char *domain_xml = NULL;
+    virDomainPtr dom_new = NULL;
+
+    dom = xenUnifiedDomainLookupByName (dconn, dname);
+    if (! dom) {
+        return NULL;
+    }
+
+    if (flags & VIR_MIGRATE_PERSIST_DEST) {
+        domain_xml = xenDaemonDomainDumpXML (dom, 0, NULL);
+	if (! domain_xml) {
+            goto failure;
+        }
+
+        dom_new = xenDaemonDomainDefineXML (dconn, domain_xml);
+        if (! dom_new) {
+            /* Hmpf.  Migration was successful, but making it persistent
+             * was not.  If we report successful, then when this domain
+             * shuts down, management tools are in for a surprise.  On the
+             * other hand, if we report failure, then the management tools
+             * might try to restart the domain on the source side, even
+             * though the domain is actually running on the destination.
+             * Return a NULL dom pointer, and hope that this is a rare
+             * situation and management tools are smart.
+             */
+            goto failure;
+        }
+
+        /* Free additional reference added by Define */
+        virDomainFree (dom_new);
+    }
+
+    VIR_FREE (domain_xml);
+
+    return dom;
+
+
+failure:
+    virDomainFree (dom);
+
+    VIR_FREE (domain_xml);
+
+    return NULL;
+    
 }
 
 static int
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
index 27d215e..9fbb616 100644
--- a/src/xen/xend_internal.c
+++ b/src/xen/xend_internal.c
@@ -4386,6 +4386,8 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
     int ret;
     char *p, *hostname = NULL;
 
+    int undefined_source = 0;
+
     /* Xen doesn't support renaming domains during migration. */
     if (dname) {
         virXendError (conn, VIR_ERR_NO_SUPPORT,
@@ -4404,11 +4406,25 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
         return -1;
     }
 
-    /* Check the flags. */
+    /*
+     * Check the flags.
+     */
     if ((flags & VIR_MIGRATE_LIVE)) {
         strcpy (live, "1");
         flags &= ~VIR_MIGRATE_LIVE;
     }
+
+    /* Undefine the VM on the source host after migration ? */
+    if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) {
+       undefined_source = 1;
+       flags &= ~VIR_MIGRATE_UNDEFINE_SOURCE;
+    }
+
+    /* Ignore the persist_dest flag here */
+    if (flags & VIR_MIGRATE_PERSIST_DEST) {
+        flags &= ~VIR_MIGRATE_PERSIST_DEST;
+    }
+
     /* XXX we could easily do tunnelled & peer2peer migration too
        if we want to. support these... */
     if (flags != 0) {
@@ -4494,6 +4510,10 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
                    NULL);
     VIR_FREE (hostname);
 
+    if (ret == 0 && undefined_source) {
+        xenDaemonDomainUndefine (domain);
+    }
+
     DEBUG0("migration done");
 
     return ret;

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]