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

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





On 17.03.2016 19:12, 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_DEST_PERSIST_XML param

Wrong param name in commit message...

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
+ * 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_driver.c b/src/qemu/qemu_driver.c
index ff01012..e9a16b1 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12066,7 +12066,7 @@ qemuDomainMigratePerform(virDomainPtr dom,
       *
       * Consume any cookie we were able to decode though
       */
-    ret = qemuMigrationPerform(driver, dom->conn, vm,
+    ret = qemuMigrationPerform(driver, dom->conn, vm, NULL,
                                 NULL, dconnuri, uri, NULL, NULL, 0, NULL, 0,
                                 cookie, cookielen,
                                 NULL, NULL, /* No output cookies in v2 */
@@ -12455,7 +12455,7 @@ qemuDomainMigratePerform3(virDomainPtr dom,
          return -1;
      }

-    return qemuMigrationPerform(driver, dom->conn, vm, xmlin,
+    return qemuMigrationPerform(driver, dom->conn, vm, xmlin, NULL,
                                  dconnuri, uri, NULL, NULL, 0, NULL, 0,
                                  cookiein, cookieinlen,
                                  cookieout, cookieoutlen,
@@ -12476,6 +12476,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
      virQEMUDriverPtr driver = dom->conn->privateData;
      virDomainObjPtr vm;
      const char *dom_xml = NULL;
+    const char *persist_xml = NULL;
      const char *dname = NULL;
      const char *uri = NULL;
      const char *graphicsuri = NULL;
@@ -12510,7 +12511,10 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
                                  &listenAddress) < 0 ||
          virTypedParamsGetInt(params, nparams,
                               VIR_MIGRATE_PARAM_DISKS_PORT,
-                             &nbdPort) < 0)
+                             &nbdPort) < 0 ||
+        virTypedParamsGetString(params, nparams,
+                                VIR_MIGRATE_PARAM_PERSIST_XML,
+                                &persist_xml) < 0)
          goto cleanup;

      nmigrate_disks = virTypedParamsGetStringList(params, nparams,
@@ -12528,7 +12532,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
          goto cleanup;
      }

-    ret = qemuMigrationPerform(driver, dom->conn, vm, dom_xml,
+    ret = qemuMigrationPerform(driver, dom->conn, vm, dom_xml, persist_xml,
                                 dconnuri, uri, graphicsuri, listenAddress,
                                 nmigrate_disks, migrate_disks, nbdPort,
                                 cookiein, cookieinlen, cookieout, cookieoutlen,
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
@@ -4301,6 +4301,7 @@ qemuMigrationConnect(virQEMUDriverPtr driver,
  static int
  qemuMigrationRun(virQEMUDriverPtr driver,
                   virDomainObjPtr vm,
+                 const char *persist_xml,
                   const char *cookiein,
                   int cookieinlen,
                   char **cookieout,
@@ -4315,6 +4316,7 @@ 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;
@@ -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;
+
      if (ret == 0 &&
          (((flags & VIR_MIGRATE_PERSIST_DEST &&
-           qemuMigrationCookieAddPersistent(mig, vm->newDef) < 0)) ||
+           qemuMigrationCookieAddPersistent(mig,
+                                            def ? def : vm->newDef) < 0)) ||
            qemuMigrationBakeCookie(mig, driver, vm, cookieout,
                                    cookieoutlen, cookieFlags) < 0)) {
          VIR_WARN("Unable to encode migration cookie");
      }

+    virDomainDefFree(def);
      qemuMigrationCookieFree(mig);

      if (events)
@@ -4608,6 +4616,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
   */
  static int doNativeMigrate(virQEMUDriverPtr driver,
                             virDomainObjPtr vm,
+                           const char *persist_xml,
                             const char *uri,
                             const char *cookiein,
                             int cookieinlen,
@@ -4666,7 +4675,7 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
      spec.dest.host.port = uribits->port;
      spec.fwdType = MIGRATION_FWD_DIRECT;

-    ret = qemuMigrationRun(driver, vm, cookiein, cookieinlen, cookieout,
+    ret = qemuMigrationRun(driver, vm, persist_xml, cookiein, cookieinlen, cookieout,
                             cookieoutlen, flags, resource, &spec, dconn,
                             graphicsuri, nmigrate_disks, migrate_disks);

@@ -4683,6 +4692,7 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
  static int doTunnelMigrate(virQEMUDriverPtr driver,
                             virDomainObjPtr vm,
                             virStreamPtr st,
+                           const char *xml_persist,
                             const char *cookiein,
                             int cookieinlen,
                             char **cookieout,
@@ -4727,7 +4737,7 @@ static int doTunnelMigrate(virQEMUDriverPtr driver,
          goto cleanup;
      }

-    ret = qemuMigrationRun(driver, vm, cookiein, cookieinlen, cookieout,
+    ret = qemuMigrationRun(driver, vm, xml_persist, cookiein, cookieinlen, cookieout,
                             cookieoutlen, flags, resource, &spec, dconn,
                             graphicsuri, nmigrate_disks, migrate_disks);

@@ -4837,12 +4847,12 @@ static int doPeer2PeerMigrate2(virQEMUDriverPtr driver,
      VIR_DEBUG("Perform %p", sconn);
      qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_PERFORM2);
      if (flags & VIR_MIGRATE_TUNNELLED)
-        ret = doTunnelMigrate(driver, vm, st,
+        ret = doTunnelMigrate(driver, vm, st, NULL,
                                NULL, 0, NULL, NULL,
                                flags, resource, dconn,
                                NULL, 0, NULL);
      else
-        ret = doNativeMigrate(driver, vm, uri_out,
+        ret = doNativeMigrate(driver, vm, NULL, uri_out,
                                cookie, cookielen,
                                NULL, NULL, /* No out cookie with v2 migration */
                                flags, resource, dconn, NULL, 0, NULL);
@@ -4903,6 +4913,7 @@ doPeer2PeerMigrate3(virQEMUDriverPtr driver,
                      const char *dconnuri,
                      virDomainObjPtr vm,
                      const char *xmlin,
+                    const char *persist_xml,
                      const char *dname,
                      const char *uri,
                      const char *graphicsuri,
@@ -5073,13 +5084,13 @@ doPeer2PeerMigrate3(virQEMUDriverPtr driver,
      cookieout = NULL;
      cookieoutlen = 0;
      if (flags & VIR_MIGRATE_TUNNELLED) {
-        ret = doTunnelMigrate(driver, vm, st,
+        ret = doTunnelMigrate(driver, vm, st, persist_xml,
                                cookiein, cookieinlen,
                                &cookieout, &cookieoutlen,
                                flags, bandwidth, dconn, graphicsuri,
                                nmigrate_disks, migrate_disks);
      } else {
-        ret = doNativeMigrate(driver, vm, uri,
+        ret = doNativeMigrate(driver, vm, persist_xml, uri,
                                cookiein, cookieinlen,
                                &cookieout, &cookieoutlen,
                                flags, bandwidth, dconn, graphicsuri,
@@ -5252,6 +5263,7 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
                                virConnectPtr sconn,
                                virDomainObjPtr vm,
                                const char *xmlin,
+                              const char *persist_xml,
                                const char *dconnuri,
                                const char *uri,
                                const char *graphicsuri,
@@ -5380,9 +5392,9 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,

      if (*v3proto) {
          ret = doPeer2PeerMigrate3(driver, sconn, dconn, dconnuri, vm, xmlin,
-                                  dname, uri, graphicsuri, listenAddress,
-                                  nmigrate_disks, migrate_disks, nbdPort,
-                                  resource, useParams, flags);
+                                  persist_xml, dname, uri, graphicsuri,
+                                  listenAddress, nmigrate_disks, migrate_disks,
+                                  nbdPort, resource, useParams, flags);
      } else {
          ret = doPeer2PeerMigrate2(driver, sconn, dconn, vm,
                                    dconnuri, flags, dname, resource);
@@ -5413,6 +5425,7 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver,
                          virConnectPtr conn,
                          virDomainObjPtr vm,
                          const char *xmlin,
+                        const char *persist_xml,
                          const char *dconnuri,
                          const char *uri,
                          const char *graphicsuri,
@@ -5453,13 +5466,13 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver,
      qemuMigrationStoreDomainState(vm);

      if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
-        ret = doPeer2PeerMigrate(driver, conn, vm, xmlin,
+        ret = doPeer2PeerMigrate(driver, conn, vm, xmlin, persist_xml,
                                   dconnuri, uri, graphicsuri, listenAddress,
                                   nmigrate_disks, migrate_disks, nbdPort,
                                   flags, dname, resource, &v3proto);
      } else {
          qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_PERFORM2);
-        ret = doNativeMigrate(driver, vm, uri, cookiein, cookieinlen,
+        ret = doNativeMigrate(driver, vm, persist_xml, uri, cookiein, cookieinlen,
                                cookieout, cookieoutlen,
                                flags, resource, NULL, NULL, 0, NULL);
      }
@@ -5518,6 +5531,7 @@ static int
  qemuMigrationPerformPhase(virQEMUDriverPtr driver,
                            virConnectPtr conn,
                            virDomainObjPtr vm,
+                          const char *persist_xml,
                            const char *uri,
                            const char *graphicsuri,
                            size_t nmigrate_disks,
@@ -5544,7 +5558,7 @@ qemuMigrationPerformPhase(virQEMUDriverPtr driver,
      virCloseCallbacksUnset(driver->closeCallbacks, vm,
                             qemuMigrationCleanup);

-    ret = doNativeMigrate(driver, vm, uri, cookiein, cookieinlen,
+    ret = doNativeMigrate(driver, vm, persist_xml, uri, cookiein, cookieinlen,
                            cookieout, cookieoutlen,
                            flags, resource, NULL, graphicsuri,
                            nmigrate_disks, migrate_disks);
@@ -5583,6 +5597,7 @@ qemuMigrationPerform(virQEMUDriverPtr driver,
                       virConnectPtr conn,
                       virDomainObjPtr vm,
                       const char *xmlin,
+                     const char *persist_xml,
                       const char *dconnuri,
                       const char *uri,
                       const char *graphicsuri,
@@ -5617,7 +5632,7 @@ qemuMigrationPerform(virQEMUDriverPtr driver,
              return -1;
          }

-        return qemuMigrationPerformJob(driver, conn, vm, xmlin, dconnuri, uri,
+        return qemuMigrationPerformJob(driver, conn, vm, xmlin, persist_xml, dconnuri, uri,
                                         graphicsuri, listenAddress,
                                         nmigrate_disks, migrate_disks, nbdPort,
                                         cookiein, cookieinlen,
@@ -5631,14 +5646,14 @@ qemuMigrationPerform(virQEMUDriverPtr driver,
          }

          if (v3proto) {
-            return qemuMigrationPerformPhase(driver, conn, vm, uri,
+            return qemuMigrationPerformPhase(driver, conn, vm, persist_xml, uri,
                                               graphicsuri,
                                               nmigrate_disks, migrate_disks,
                                               cookiein, cookieinlen,
                                               cookieout, cookieoutlen,
                                               flags, resource);
          } else {
-            return qemuMigrationPerformJob(driver, conn, vm, xmlin, NULL,
+            return qemuMigrationPerformJob(driver, conn, vm, xmlin, persist_xml, NULL,
                                             uri, graphicsuri, listenAddress,
                                             nmigrate_disks, migrate_disks, nbdPort,
                                             cookiein, cookieinlen,
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index d279da4..3270d5b 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -54,6 +54,7 @@
      VIR_MIGRATE_PARAM_MIGRATE_DISKS,    VIR_TYPED_PARAM_STRING |  \
                                          VIR_TYPED_PARAM_MULTIPLE, \
      VIR_MIGRATE_PARAM_DISKS_PORT,       VIR_TYPED_PARAM_INT,      \
+    VIR_MIGRATE_PARAM_PERSIST_XML,      VIR_TYPED_PARAM_STRING,   \
      NULL


@@ -142,6 +143,7 @@ int qemuMigrationPerform(virQEMUDriverPtr driver,
                           virConnectPtr conn,
                           virDomainObjPtr vm,
                           const char *xmlin,
+                         const char *persist_xml,
                           const char *dconnuri,
                           const char *uri,
                           const char *graphicsuri,



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