[libvirt] [PATCH v1 06/11] qemu_migration: Introduce qemuMigrationStartNBDServer

li guang lig.fnst at cn.fujitsu.com
Wed Nov 28 03:03:24 UTC 2012


在 2012-11-27二的 19:50 +0100,Michal Privoznik写道:
> This is a stub internal API just for now. Its purpose
> in life is to start NBD server and feed it with all
> domain disks. When adding a disk to NBD server, it
> is addressed via its alias (id= param on qemu command line).
> ---
>  src/qemu/qemu_driver.c    |    8 +++---
>  src/qemu/qemu_migration.c |   59 +++++++++++++++++++++++++++++++++++---------
>  src/qemu/qemu_migration.h |    6 +++-
>  3 files changed, 55 insertions(+), 18 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index d4cafcc..493fbb9 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -9625,7 +9625,7 @@ qemudDomainMigratePrepareTunnel(virConnectPtr dconn,
>  
>      ret = qemuMigrationPrepareTunnel(driver, dconn,
>                                       NULL, 0, NULL, NULL, /* No cookies in v2 */
> -                                     st, dname, dom_xml);
> +                                     st, dname, dom_xml, flags);
>  
>  cleanup:
>      qemuDriverUnlock(driver);
> @@ -9685,7 +9685,7 @@ qemudDomainMigratePrepare2(virConnectPtr dconn,
>      ret = qemuMigrationPrepareDirect(driver, dconn,
>                                       NULL, 0, NULL, NULL, /* No cookies */
>                                       uri_in, uri_out,
> -                                     dname, dom_xml);
> +                                     dname, dom_xml, flags);
>  
>  cleanup:
>      qemuDriverUnlock(driver);
> @@ -9922,7 +9922,7 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
>                                       cookiein, cookieinlen,
>                                       cookieout, cookieoutlen,
>                                       uri_in, uri_out,
> -                                     dname, dom_xml);
> +                                     dname, dom_xml, flags);
>  
>  cleanup:
>      qemuDriverUnlock(driver);
> @@ -9967,7 +9967,7 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn,
>      ret = qemuMigrationPrepareTunnel(driver, dconn,
>                                       cookiein, cookieinlen,
>                                       cookieout, cookieoutlen,
> -                                     st, dname, dom_xml);
> +                                     st, dname, dom_xml, flags);
>      qemuDriverUnlock(driver);
>  
>  cleanup:
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index cd59eda..7e86c33 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -1074,6 +1074,29 @@ error:
>      return NULL;
>  }
>  
> +/**
> + * qemuMigrationStartNBDServer:
> + * @driver: qemu driver
> + * @vm: domain
> + * @nbdPort: which port is NBD server listening to
> + *
> + * Starts NBD server. This is a newer method to copy
> + * storage during migration than using 'blk' and 'inc'
> + * arguments in 'migrate' monitor command.
> + * Error is reported here.
> + *
> + * Returns 0 on success, -1 otherwise.
> + */
> +static int
> +qemuMigrationStartNBDServer(struct qemud_driver *driver ATTRIBUTE_UNUSED,
> +                            virDomainObjPtr vm ATTRIBUTE_UNUSED,
> +                            int *nbdPort ATTRIBUTE_UNUSED)
> +{
> +    /* do nothing for now */
> +    return 0;
> +}
> +
> +
>  /* Validate whether the domain is safe to migrate.  If vm is NULL,
>   * then this is being run in the v2 Prepare stage on the destination
>   * (where we only have the target xml); if vm is provided, then this
> @@ -1575,7 +1598,8 @@ qemuMigrationPrepareAny(struct qemud_driver *driver,
>                          const char *dname,
>                          const char *dom_xml,
>                          const char *migrateFrom,
> -                        virStreamPtr st)
> +                        virStreamPtr st,
> +                        unsigned long flags)
>  {
>      virDomainDefPtr def = NULL;
>      virDomainObjPtr vm = NULL;
> @@ -1719,9 +1743,17 @@ qemuMigrationPrepareAny(struct qemud_driver *driver,
>          VIR_DEBUG("Received no lockstate");
>      }
>  
> -    /* dummy place holder for real work */
> -    nbdPort = 0;
> -    cookie_flags |= QEMU_MIGRATION_COOKIE_NBD;
> +    if ((flags & VIR_MIGRATE_NON_SHARED_INC ||
> +         flags & VIR_MIGRATE_NON_SHARED_DISK) &&
> +        mig->nbd && qemuCapsGet(priv->caps, QEMU_CAPS_NBD_SERVER)) {
> +        /* both source and destination qemus support nbd-server-*
> +         * commands and user requested disk copy. Use the new ones */
> +        if (qemuMigrationStartNBDServer(driver, vm, &nbdPort) < 0) {

so, nbdPort is generated by qemuMigrationNextPort() (08/11) not by
cookie element 'nbd/port' (02/11), as a result, seems the previous
cookie baking is rather needless. 

> +            /* error already reported */
> +            goto endjob;
> +        }
> +        cookie_flags |= QEMU_MIGRATION_COOKIE_NBD;
> +    }
>  
>      if (qemuMigrationBakeCookie(mig, driver, vm, nbdPort,
>                                  cookieout, cookieoutlen, cookie_flags) < 0) {
> @@ -1791,21 +1823,23 @@ qemuMigrationPrepareTunnel(struct qemud_driver *driver,
>                             int *cookieoutlen,
>                             virStreamPtr st,
>                             const char *dname,
> -                           const char *dom_xml)
> +                           const char *dom_xml,
> +                           unsigned long flags)
>  {
>      int ret;
>  
>      VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, "
> -              "cookieout=%p, cookieoutlen=%p, st=%p, dname=%s, dom_xml=%s",
> +              "cookieout=%p, cookieoutlen=%p, st=%p, dname=%s, dom_xml=%s "
> +              "flags=%lx",
>                driver, dconn, NULLSTR(cookiein), cookieinlen,
> -              cookieout, cookieoutlen, st, NULLSTR(dname), dom_xml);
> +              cookieout, cookieoutlen, st, NULLSTR(dname), dom_xml, flags);
>  
>      /* QEMU will be started with -incoming stdio (which qemu_command might
>       * convert to exec:cat or fd:n)
>       */
>      ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen,
>                                    cookieout, cookieoutlen, dname, dom_xml,
> -                                  "stdio", st);
> +                                  "stdio", st, flags);
>      return ret;
>  }
>  
> @@ -1820,7 +1854,8 @@ qemuMigrationPrepareDirect(struct qemud_driver *driver,
>                             const char *uri_in,
>                             char **uri_out,
>                             const char *dname,
> -                           const char *dom_xml)
> +                           const char *dom_xml,
> +                           unsigned long flags)
>  {
>      static int port = 0;
>      int this_port;
> @@ -1831,10 +1866,10 @@ qemuMigrationPrepareDirect(struct qemud_driver *driver,
>  
>      VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, "
>                "cookieout=%p, cookieoutlen=%p, uri_in=%s, uri_out=%p, "
> -              "dname=%s, dom_xml=%s",
> +              "dname=%s, dom_xml=%s flags=%lx",
>                driver, dconn, NULLSTR(cookiein), cookieinlen,
>                cookieout, cookieoutlen, NULLSTR(uri_in), uri_out,
> -              NULLSTR(dname), dom_xml);
> +              NULLSTR(dname), dom_xml, flags);
>  
>      /* The URI passed in may be NULL or a string "tcp://somehostname:port".
>       *
> @@ -1916,7 +1951,7 @@ qemuMigrationPrepareDirect(struct qemud_driver *driver,
>  
>      ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen,
>                                    cookieout, cookieoutlen, dname, dom_xml,
> -                                  migrateFrom, NULL);
> +                                  migrateFrom, NULL, flags);
>  cleanup:
>      VIR_FREE(hostname);
>      if (ret != 0)
> diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
> index 7a2269a..8e411ef 100644
> --- a/src/qemu/qemu_migration.h
> +++ b/src/qemu/qemu_migration.h
> @@ -97,7 +97,8 @@ int qemuMigrationPrepareTunnel(struct qemud_driver *driver,
>                                 int *cookieoutlen,
>                                 virStreamPtr st,
>                                 const char *dname,
> -                               const char *dom_xml);
> +                               const char *dom_xml,
> +                               unsigned long flags);
>  
>  int qemuMigrationPrepareDirect(struct qemud_driver *driver,
>                                 virConnectPtr dconn,
> @@ -108,7 +109,8 @@ int qemuMigrationPrepareDirect(struct qemud_driver *driver,
>                                 const char *uri_in,
>                                 char **uri_out,
>                                 const char *dname,
> -                               const char *dom_xml);
> +                               const char *dom_xml,
> +                               unsigned long flags);
>  
>  int qemuMigrationPerform(struct qemud_driver *driver,
>                           virConnectPtr conn,

-- 
regards!
li guang                  
linux kernel team at FNST, china

thinking with brain but heart
living with heart but brain





More information about the libvir-list mailing list