[libvirt] [PATCH v4 2/2] qemu: migration: new migration param for persistent destination XML

Jiri Denemark jdenemar at redhat.com
Fri Apr 15 18:12:45 UTC 2016


On Thu, Mar 17, 2016 at 19:31:45 +0300, Dmitry Andreev wrote:
> Migration API allows to specify a destination domain configuration.
> Offline domain has only inactive XML and it is replaced by configuration
> specified using VIR_MIGRATE_PARAM_DEST_XML param. In case of live
> migration VIR_MIGRATE_PARAM_DEST_XML param is applied for active XML.
> 
> This commit introduces the new VIR_MIGRATE_PARAM_PERSIST_XML param
> that can be used within live migration to replace persistent/inactive
> configuration.
> 
> Required for: https://bugzilla.redhat.com/show_bug.cgi?id=835300
> ---
>  include/libvirt/libvirt-domain.h | 15 +++++++++++++
>  src/qemu/qemu_driver.c           | 12 ++++++----
>  src/qemu/qemu_migration.c        | 47 ++++++++++++++++++++++++++--------------
>  src/qemu/qemu_migration.h        |  2 ++
>  4 files changed, 56 insertions(+), 20 deletions(-)
> 
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index 4ac29cd..f9dae22 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -723,6 +723,21 @@ typedef enum {
>  # define VIR_MIGRATE_PARAM_DEST_XML          "destination_xml"
>  
>  /**
> + * VIR_MIGRATE_PARAM_PERSIST_XML:
> + *
> + * virDomainMigrate* params field: the new persistant configuration to be used

s/persistant/persistent/

> + * for the domain on the destination host as VIR_TYPED_PARAM_STRING.
> + * This field cannot be used to rename the domain during migration (use
> + * VIR_MIGRATE_PARAM_DEST_NAME field for that purpose). Domain name in the
> + * destination XML must match the original domain name.
> + *
> + * Omitting this parameter keeps the original domain persistent configuration.
> + * Using this field with hypervisors that do not support changing domain
> + * configuration during migration will result in a failure.
> + */
> +# define VIR_MIGRATE_PARAM_PERSIST_XML  "persistent_xml"
> +
> +/**
>   * VIR_MIGRATE_PARAM_BANDWIDTH:
>   *
>   * virDomainMigrate* params field: the maximum bandwidth (in MiB/s) that will
...
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index f723a52..5624633 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
...
> @@ -4566,14 +4568,20 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>      cookieFlags |= QEMU_MIGRATION_COOKIE_NETWORK |
>                     QEMU_MIGRATION_COOKIE_STATS;
>  
> +    if (flags & VIR_MIGRATE_PERSIST_DEST && persist_xml &&
> +        !(def = qemuMigrationPrepareDef(driver, persist_xml, NULL, NULL)))
> +        ret = -1;
> +

I think this should be done before we start migration.

>      if (ret == 0 &&
>          (((flags & VIR_MIGRATE_PERSIST_DEST &&
> -           qemuMigrationCookieAddPersistent(mig, vm->newDef) < 0)) ||
> +           qemuMigrationCookieAddPersistent(mig,
> +                                            def ? def : vm->newDef) < 0)) ||

And we can use a single variable for both vm->newDef and def depending
on persist_xml.

>            qemuMigrationBakeCookie(mig, driver, vm, cookieout,
>                                    cookieoutlen, cookieFlags) < 0)) {
>          VIR_WARN("Unable to encode migration cookie");
>      }
>  
> +    virDomainDefFree(def);
>      qemuMigrationCookieFree(mig);
>  
>      if (events)
...
> @@ -4683,6 +4692,7 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
>  static int doTunnelMigrate(virQEMUDriverPtr driver,
>                             virDomainObjPtr vm,
>                             virStreamPtr st,
> +                           const char *xml_persist,

s/xml_persist/persist_xml/ to keep the name consistent accros the file.

>                             const char *cookiein,
>                             int cookieinlen,
>                             char **cookieout,
...

To avoid sending another version of this patch for review, which already
took too long (this is my fault, sorry for that), I suggest squashing
the following patch in and pushing the result.

Jirka

diff --git i/include/libvirt/libvirt-domain.h w/include/libvirt/libvirt-domain.h
index 697670f..9936cb2 100644
--- i/include/libvirt/libvirt-domain.h
+++ w/include/libvirt/libvirt-domain.h
@@ -729,7 +729,7 @@ typedef enum {
 /**
  * VIR_MIGRATE_PARAM_PERSIST_XML:
  *
- * virDomainMigrate* params field: the new persistant configuration to be used
+ * virDomainMigrate* params field: the new persistent configuration to be used
  * for the domain on the destination host as VIR_TYPED_PARAM_STRING.
  * This field cannot be used to rename the domain during migration (use
  * VIR_MIGRATE_PARAM_DEST_NAME field for that purpose). Domain name in the
diff --git i/src/qemu/qemu_migration.c w/src/qemu/qemu_migration.c
index eee8ec2..680c9ba 100644
--- i/src/qemu/qemu_migration.c
+++ w/src/qemu/qemu_migration.c
@@ -4504,7 +4504,6 @@ qemuMigrationRun(virQEMUDriverPtr driver,
 {
     int ret = -1;
     unsigned int migrate_flags = QEMU_MONITOR_MIGRATE_BACKGROUND;
-    virDomainDefPtr def = NULL;
     qemuDomainObjPrivatePtr priv = vm->privateData;
     qemuMigrationCookiePtr mig = NULL;
     qemuMigrationIOThreadPtr iothread = NULL;
@@ -4516,6 +4515,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
     bool events = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT);
     bool inPostCopy = false;
     unsigned int waitFlags;
+    virDomainDefPtr persistDef = NULL;
     int rc;
 
     VIR_DEBUG("driver=%p, vm=%p, cookiein=%s, cookieinlen=%d, "
@@ -4549,6 +4549,17 @@ qemuMigrationRun(virQEMUDriverPtr driver,
     if (events)
         priv->signalIOError = abort_on_error;
 
+    if (flags & VIR_MIGRATE_PERSIST_DEST) {
+        if (persist_xml) {
+            persistDef = qemuMigrationPrepareDef(driver, persist_xml,
+                                                 NULL, NULL);
+            if (!persistDef)
+                goto cleanup;
+        } else {
+            persistDef = vm->newDef;
+        }
+    }
+
     mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,
                                  cookieFlags | QEMU_MIGRATION_COOKIE_GRAPHICS);
     if (!mig)
@@ -4769,20 +4780,15 @@ qemuMigrationRun(virQEMUDriverPtr driver,
     cookieFlags |= QEMU_MIGRATION_COOKIE_NETWORK |
                    QEMU_MIGRATION_COOKIE_STATS;
 
-    if (flags & VIR_MIGRATE_PERSIST_DEST && persist_xml &&
-        !(def = qemuMigrationPrepareDef(driver, persist_xml, NULL, NULL)))
-        ret = -1;
-
     if (ret == 0 &&
-        (((flags & VIR_MIGRATE_PERSIST_DEST &&
-           qemuMigrationCookieAddPersistent(mig,
-                                            def ? def : vm->newDef) < 0)) ||
-          qemuMigrationBakeCookie(mig, driver, vm, cookieout,
-                                  cookieoutlen, cookieFlags) < 0)) {
+        (qemuMigrationCookieAddPersistent(mig, persistDef) < 0 ||
+         qemuMigrationBakeCookie(mig, driver, vm, cookieout,
+                                 cookieoutlen, cookieFlags) < 0)) {
         VIR_WARN("Unable to encode migration cookie");
     }
 
-    virDomainDefFree(def);
+    if (persistDef != vm->newDef)
+        virDomainDefFree(persistDef);
     qemuMigrationCookieFree(mig);
 
     if (events)
@@ -4902,7 +4908,7 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
 static int doTunnelMigrate(virQEMUDriverPtr driver,
                            virDomainObjPtr vm,
                            virStreamPtr st,
-                           const char *xml_persist,
+                           const char *persist_xml,
                            const char *cookiein,
                            int cookieinlen,
                            char **cookieout,
@@ -4948,9 +4954,9 @@ static int doTunnelMigrate(virQEMUDriverPtr driver,
         goto cleanup;
     }
 
-    ret = qemuMigrationRun(driver, vm, xml_persist, cookiein, cookieinlen, cookieout,
-                           cookieoutlen, flags, resource, &spec, dconn,
-                           graphicsuri, nmigrate_disks, migrate_disks,
+    ret = qemuMigrationRun(driver, vm, persist_xml, cookiein, cookieinlen,
+                           cookieout, cookieoutlen, flags, resource, &spec,
+                           dconn, graphicsuri, nmigrate_disks, migrate_disks,
                            compression);
 
  cleanup:




More information about the libvir-list mailing list