[libvirt] [PATCH v4 0/9] Selective block device migration implementation

Michal Privoznik mprivozn at redhat.com
Tue Jun 16 15:47:35 UTC 2015


On 16.06.2015 00:42, Pavel Boldin wrote:
> Behold of the fourth re-roll of the selective block device migration patch.
> In this patch we don't only fix the issue with NBD migration format auto-
> detection but also introduce the patches that do enhance the NBD migration
> triggered by `drive-mirror` QEMU command with ability for the user to select
> what disks are to be migrated based on the target name.
> 
> First two patches fix some nitpicks, third one fixes the issue with NBD format
> auto-detection.
> 
> Middle ones introduce a necessary API to keep a list of block devices to
> migrate in the virTypedParameter array and to work with this list.
> 
> Of the two last patches first introduces the `migrate_disks' qemuMigration*
> parameter and pushes it down the call stack making the code to consult it when
> there is a decision to be made whether the block device is to be migrated to
> the new host. When there is no `migrate_disks' parameter given then the old
> scheme is used: only non-shared non-readonly disks with a source are migrated.
> 
> The last patch promotes this ability up to the virsh utility and documents
> it as appropriate.
> 
> Michal Privoznik (3):
>   virDomainDiskGetSource: Mark passed disk as 'const'
>   qemuMigrationBeginPhase: Fix function header indentation
>   qemuMigrationDriveMirror: Force raw format for NBD
> 
> Pavel Boldin (6):
>   util: multi-value virTypedParameter
>   util: multi-value parameters in virTypedParamsAdd*
>   util: virTypedParams{Filter,GetAllStrings}
>   util: add virTypedParamsAddStringList
>   qemu: migration: selective block device migration
>   virsh: selective block device migration
> 
>  include/libvirt/libvirt-domain.h |   9 ++
>  include/libvirt/libvirt-host.h   |  11 ++
>  src/conf/domain_conf.c           |   2 +-
>  src/conf/domain_conf.h           |   2 +-
>  src/libvirt_public.syms          |   6 +
>  src/qemu/qemu_driver.c           |  78 ++++++++---
>  src/qemu/qemu_migration.c        | 264 +++++++++++++++++++++++++----------
>  src/qemu/qemu_migration.h        |  24 ++--
>  src/util/virtypedparam.c         | 259 +++++++++++++++++++++++++++-------
>  src/util/virtypedparam.h         |  19 +++
>  tests/Makefile.am                |   6 +
>  tests/virtypedparamtest.c        | 295 +++++++++++++++++++++++++++++++++++++++
>  tools/virsh-domain.c             |  23 +++
>  tools/virsh.pod                  |  21 +--
>  14 files changed, 854 insertions(+), 165 deletions(-)
>  create mode 100644 tests/virtypedparamtest.c
> 

Basically, this is the diff of the all nits I've pointed out:

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index f7373af..6c41e89 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2272,6 +2272,8 @@ virTypedParameterTypeFromString;
 virTypedParameterTypeToString;
 virTypedParamsCheck;
 virTypedParamsCopy;
+virTypedParamsFilter;
+virTypedParamsGetAllStrings;
 virTypedParamsReplaceString;
 virTypedParamsValidate;
 
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index ccc7532..59d8c12 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -717,7 +717,6 @@ LIBVIRT_1.2.16 {
 
 LIBVIRT_1.3.0 {
     global:
-        virTypedParamsGetAllStrings;
         virTypedParamsAddStringList;
 } LIBVIRT_1.2.16;
 
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index d56579b..4c6b530 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12351,7 +12351,7 @@ qemuDomainMigrateBegin3(virDomainPtr domain,
     }
 
     return qemuMigrationBegin(domain->conn, vm, xmlin, dname,
-                              cookieout, cookieoutlen, flags, 0, NULL);
+                              cookieout, cookieoutlen, 0, NULL, flags);
 }
 
 static char *
@@ -12381,9 +12381,9 @@ qemuDomainMigrateBegin3Params(virDomainPtr domain,
                                 &dname) < 0)
         goto cleanup;
 
-    nmigrate_disks = virTypedParamsGetAllStrings(
-                params, nparams, VIR_MIGRATE_PARAM_MIGRATE_DISKS,
-                &migrate_disks);
+    nmigrate_disks = virTypedParamsGetAllStrings(params, nparams,
+                                                 VIR_MIGRATE_PARAM_MIGRATE_DISKS,
+                                                 &migrate_disks);
 
     if (nmigrate_disks < 0)
         goto cleanup;
@@ -12397,8 +12397,8 @@ qemuDomainMigrateBegin3Params(virDomainPtr domain,
     }
 
     ret = qemuMigrationBegin(domain->conn, vm, xmlin, dname,
-                             cookieout, cookieoutlen, flags,
-                             nmigrate_disks, migrate_disks);
+                             cookieout, cookieoutlen,
+                             nmigrate_disks, migrate_disks, flags);
 
  cleanup:
     VIR_FREE(migrate_disks);
@@ -12495,9 +12495,9 @@ qemuDomainMigratePrepare3Params(virConnectPtr dconn,
                                 &listenAddress) < 0)
         goto cleanup;
 
-    nmigrate_disks = virTypedParamsGetAllStrings(
-                params, nparams, VIR_MIGRATE_PARAM_MIGRATE_DISKS,
-                &migrate_disks);
+    nmigrate_disks = virTypedParamsGetAllStrings(params, nparams,
+                                                 VIR_MIGRATE_PARAM_MIGRATE_DISKS,
+                                                 &migrate_disks);
 
     if (nmigrate_disks < 0)
         goto cleanup;
@@ -12688,7 +12688,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
 
     virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
     if (virTypedParamsValidate(params, nparams, QEMU_MIGRATION_PARAMETERS) < 0)
-        return -1;
+        return ret;
 
     if (virTypedParamsGetString(params, nparams,
                                 VIR_MIGRATE_PARAM_DEST_XML,
@@ -12710,9 +12710,9 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
                                 &listenAddress) < 0)
         goto cleanup;
 
-    nmigrate_disks = virTypedParamsGetAllStrings(
-                params, nparams, VIR_MIGRATE_PARAM_MIGRATE_DISKS,
-                &migrate_disks);
+    nmigrate_disks = virTypedParamsGetAllStrings(params, nparams,
+                                                 VIR_MIGRATE_PARAM_MIGRATE_DISKS,
+                                                 &migrate_disks);
 
     if (nmigrate_disks < 0)
         goto cleanup;
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 275d416..7fae75b 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1584,6 +1584,7 @@ qemuMigrateDisk(virDomainDiskDef const *disk,
                 size_t nmigrate_disks, const char **migrate_disks)
 {
     size_t i;
+
     /* Check if the disk alias is in the list */
     if (nmigrate_disks) {
         for (i = 0; i < nmigrate_disks; i++) {
@@ -2871,9 +2872,9 @@ qemuMigrationBegin(virConnectPtr conn,
                    const char *dname,
                    char **cookieout,
                    int *cookieoutlen,
-                   unsigned long flags,
                    size_t nmigrate_disks,
-                   const char **migrate_disks)
+                   const char **migrate_disks,
+                   unsigned long flags)
 {
     virQEMUDriverPtr driver = conn->privateData;
     char *xml = NULL;
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index 2a942c0..030b32f 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -101,9 +101,9 @@ char *qemuMigrationBegin(virConnectPtr conn,
                          const char *dname,
                          char **cookieout,
                          int *cookieoutlen,
-                         unsigned long flags,
                          size_t nmigrate_disks,
-                         const char **migrate_disks);
+                         const char **migrate_disks,
+                         unsigned long flags);
 
 virDomainDefPtr qemuMigrationPrepareDef(virQEMUDriverPtr driver,
                                         const char *dom_xml,
diff --git a/src/util/virtypedparam.h b/src/util/virtypedparam.h
index ac7f3a1..bc84096 100644
--- a/src/util/virtypedparam.h
+++ b/src/util/virtypedparam.h
@@ -29,7 +29,7 @@
 /**
  * VIR_TYPED_PARAM_MULTIPLE:
  *
- * Flag indiciating that the params has multiple occurences of the parameter.
+ * Flag indicating that the params has multiple occurrences of the parameter.
  * Only used as a flag for @type argument of the virTypedParamsValidate.
  */
 # define VIR_TYPED_PARAM_MULTIPLE (1 << 31)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5d10999..77de8c0 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1236,7 +1236,7 @@ objecteventtest_LDADD = $(LDADDS)
 
 virtypedparamtest_SOURCES = \
        virtypedparamtest.c testutils.h testutils.c
-virtypedparamtest_LDADD = $(LDADDS) ../src/libvirt_util.la $(GNULIB_LIBS)
+virtypedparamtest_LDADD = $(LDADDS)
 
 
 if WITH_LINUX
diff --git a/tests/virtypedparamtest.c b/tests/virtypedparamtest.c
index 2869535..b362b9b 100644
--- a/tests/virtypedparamtest.c
+++ b/tests/virtypedparamtest.c
@@ -153,7 +153,8 @@ testTypedParamsAddStringList(const void *opaque ATTRIBUTE_UNUSED)
 static int
 testTypedParamsGetAllStrings(const void *opaque ATTRIBUTE_UNUSED)
 {
-    int i, picked;
+    size_t i;
+    int picked;
     int rv = -1;
     char l = '1';
     const char **strings = NULL;



I have it squashed into the corresponding commits. So with this - you have my ACK, although it feels a bit weird to ACK my own patches. Therefore, I'm giving others some time before merging this to express their feelings.

Michal




More information about the libvir-list mailing list