[libvirt] [PATCH v2.1 06/11] qemu_migration: Introduce qemuMigrationStartNBDServer

Michal Privoznik mprivozn at redhat.com
Tue Dec 18 14:36:49 UTC 2012


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_migration.c | 46 +++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 39 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 7d61ec7..81a48a4 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1078,6 +1078,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(virQEMUDriverPtr 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
@@ -1790,9 +1813,17 @@ done:
     else
         cookieFlags = QEMU_MIGRATION_COOKIE_GRAPHICS;
 
-    /* dummy place holder for real work */
-    nbdPort = 0;
-    cookieFlags |= 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) {
+            /* error already reported */
+            goto endjob;
+        }
+        cookieFlags |= QEMU_MIGRATION_COOKIE_NBD;
+    }
 
     if (qemuMigrationBakeCookie(mig, driver, vm, nbdPort,
                                 cookieout, cookieoutlen, cookieFlags) < 0) {
@@ -1870,9 +1901,10 @@ qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
     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)
@@ -1906,10 +1938,10 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr 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".
      *
-- 
1.8.0.2




More information about the libvir-list mailing list