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

Dmitry Andreev dandreev at virtuozzo.com
Thu Mar 17 16:32:56 UTC 2016



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,
>




More information about the libvir-list mailing list