[libvirt] [PATCHv2 04/13] snapshot: merge domain and snapshot computation

Eric Blake eblake at redhat.com
Fri Jun 15 04:18:29 UTC 2012


Now that domain listing is a thin wrapper around child listing,
it's easier to have a common entry point.  This restores the
hashForEach optimization lost in the previous patch when there
are no snapshots being filtered out of the entire list.

* src/conf/domain_conf.h (virDomainSnapshotObjListGetNames)
(virDomainSnapshotObjListNum): Add parameter.
(virDomainSnapshotObjListGetNamesFrom)
(virDomainSnapshotObjListNumFrom): Delete.
* src/libvirt_private.syms (domain_conf.h): Drop deleted functions.
* src/conf/domain_conf.c (virDomainSnapshotObjListGetNames):
Merge, and (re)add an optimization.
* src/qemu/qemu_driver.c (qemuDomainUndefineFlags)
(qemuDomainSnapshotListNames, qemuDomainSnapshotNum)
(qemuDomainSnapshotListChildrenNames)
(qemuDomainSnapshotNumChildren): Update callers.
* src/qemu/qemu_migration.c (qemuMigrationIsAllowed): Likewise.
* src/conf/virdomainlist.c (virDomainListPopulate): Likewise.
---

v2: fix logic on when to optimize, rebase earlier in series

 src/conf/domain_conf.c    |   76 ++++++++++++++++++++++++---------------------
 src/conf/domain_conf.h    |    7 ++---
 src/conf/virdomainlist.c  |    2 +-
 src/libvirt_private.syms  |    2 --
 src/qemu/qemu_driver.c    |   11 ++++---
 src/qemu/qemu_migration.c |    3 +-
 6 files changed, 52 insertions(+), 49 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c7437af..adc3b3c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -14285,31 +14285,34 @@ static void virDomainSnapshotObjListCopyNames(void *payload,
     }
 }

-int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots,
-                                     char **const names, int maxnames,
-                                     unsigned int flags)
-{
-    flags ^= VIR_DOMAIN_SNAPSHOT_LIST_ROOTS;
-    return virDomainSnapshotObjListGetNamesFrom(&snapshots->metaroot, names,
-                                                maxnames, flags);
-}
-
-int virDomainSnapshotObjListGetNamesFrom(virDomainSnapshotObjPtr snapshot,
-                                         char **const names, int maxnames,
-                                         unsigned int flags)
+int
+virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots,
+                                 virDomainSnapshotObjPtr from,
+                                 char **const names, int maxnames,
+                                 unsigned int flags)
 {
     struct virDomainSnapshotNameData data = { 0, 0, maxnames, names, 0 };
     int i;

+    if (!from) {
+        flags ^= VIR_DOMAIN_SNAPSHOT_LIST_ROOTS;
+        from = &snapshots->metaroot;
+    }
+
     data.flags = flags & ~VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS;

-    if (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS)
-        virDomainSnapshotForEachDescendant(snapshot,
-                                           virDomainSnapshotObjListCopyNames,
-                                           &data);
-    else
-        virDomainSnapshotForEachChild(snapshot,
+    if (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) {
+        if (from->def)
+            virDomainSnapshotForEachDescendant(from,
+                                               virDomainSnapshotObjListCopyNames,
+                                               &data);
+        else
+            virHashForEach(snapshots->objs, virDomainSnapshotObjListCopyNames,
+                           &data);
+    } else {
+        virDomainSnapshotForEachChild(from,
                                       virDomainSnapshotObjListCopyNames, &data);
+    }

     if (data.oom) {
         virReportOOMError();
@@ -14343,30 +14346,33 @@ static void virDomainSnapshotObjListCount(void *payload,
     data->count++;
 }

-int virDomainSnapshotObjListNum(virDomainSnapshotObjListPtr snapshots,
-                                unsigned int flags)
-{
-    flags ^= VIR_DOMAIN_SNAPSHOT_LIST_ROOTS;
-    return virDomainSnapshotObjListNumFrom(&snapshots->metaroot, flags);
-}
-
 int
-virDomainSnapshotObjListNumFrom(virDomainSnapshotObjPtr snapshot,
-                                unsigned int flags)
+virDomainSnapshotObjListNum(virDomainSnapshotObjListPtr snapshots,
+                            virDomainSnapshotObjPtr from,
+                            unsigned int flags)
 {
     struct virDomainSnapshotNumData data = { 0, 0 };

+    if (!from) {
+        flags ^= VIR_DOMAIN_SNAPSHOT_LIST_ROOTS;
+        from = &snapshots->metaroot;
+    }
+
     data.flags = flags & ~VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS;

-    if (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS)
-        virDomainSnapshotForEachDescendant(snapshot,
-                                           virDomainSnapshotObjListCount,
-                                           &data);
-    else if (data.flags)
-        virDomainSnapshotForEachChild(snapshot,
+    if (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) {
+        if (data.flags || from->def)
+            virDomainSnapshotForEachDescendant(from,
+                                               virDomainSnapshotObjListCount,
+                                               &data);
+        else
+            data.count = virHashSize(snapshots->objs);
+    } else if (data.flags) {
+        virDomainSnapshotForEachChild(from,
                                       virDomainSnapshotObjListCount, &data);
-    else
-        data.count = snapshot->nchildren;
+    } else {
+        data.count = from->nchildren;
+    }

     return data.count;
 }
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index e3a3679..86c1e63 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1769,15 +1769,12 @@ virDomainSnapshotObjPtr virDomainSnapshotAssignDef(virDomainSnapshotObjListPtr s

 int virDomainSnapshotObjListInit(virDomainSnapshotObjListPtr objs);
 int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots,
+                                     virDomainSnapshotObjPtr from,
                                      char **const names, int maxnames,
                                      unsigned int flags);
 int virDomainSnapshotObjListNum(virDomainSnapshotObjListPtr snapshots,
+                                virDomainSnapshotObjPtr from,
                                 unsigned int flags);
-int virDomainSnapshotObjListGetNamesFrom(virDomainSnapshotObjPtr snapshot,
-                                         char **const names, int maxnames,
-                                         unsigned int flags);
-int virDomainSnapshotObjListNumFrom(virDomainSnapshotObjPtr snapshot,
-                                    unsigned int flags);
 virDomainSnapshotObjPtr virDomainSnapshotFindByName(const virDomainSnapshotObjListPtr snapshots,
                                                     const char *name);
 void virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots,
diff --git a/src/conf/virdomainlist.c b/src/conf/virdomainlist.c
index 8889fee..246b838 100644
--- a/src/conf/virdomainlist.c
+++ b/src/conf/virdomainlist.c
@@ -106,7 +106,7 @@ virDomainListPopulate(void *payload,

     /* filter by snapshot existence */
     if (MATCH(VIR_CONNECT_LIST_FILTERS_SNAPSHOT)) {
-        int nsnap = virDomainSnapshotObjListNum(&vm->snapshots, 0);
+        int nsnap = virDomainSnapshotObjListNum(&vm->snapshots, NULL, 0);
         if (!((MATCH(VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT) && nsnap > 0) ||
               (MATCH(VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHOT) && nsnap <= 0)))
             goto cleanup;
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 5a94b8b..b37fe68 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -457,9 +457,7 @@ virDomainSnapshotFindByName;
 virDomainSnapshotForEachChild;
 virDomainSnapshotForEachDescendant;
 virDomainSnapshotObjListGetNames;
-virDomainSnapshotObjListGetNamesFrom;
 virDomainSnapshotObjListNum;
-virDomainSnapshotObjListNumFrom;
 virDomainSnapshotObjListRemove;
 virDomainSnapshotStateTypeFromString;
 virDomainSnapshotStateTypeToString;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 7038a4c..ce90ddf 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5105,7 +5105,7 @@ qemuDomainUndefineFlags(virDomainPtr dom,
     }

     if (!virDomainObjIsActive(vm) &&
-        (nsnapshots = virDomainSnapshotObjListNum(&vm->snapshots, 0))) {
+        (nsnapshots = virDomainSnapshotObjListNum(&vm->snapshots, NULL, 0))) {
         if (!(flags & VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA)) {
             qemuReportError(VIR_ERR_OPERATION_INVALID,
                             _("cannot delete inactive domain with %d "
@@ -10629,7 +10629,7 @@ static int qemuDomainSnapshotListNames(virDomainPtr domain, char **names,
         goto cleanup;
     }

-    n = virDomainSnapshotObjListGetNames(&vm->snapshots, names, nameslen,
+    n = virDomainSnapshotObjListGetNames(&vm->snapshots, NULL, names, nameslen,
                                          flags);

 cleanup:
@@ -10664,7 +10664,7 @@ static int qemuDomainSnapshotNum(virDomainPtr domain,
      * VIR_DOMAIN_SNAPSHOT_LIST_METADATA makes no difference to our
      * answer.  */

-    n = virDomainSnapshotObjListNum(&vm->snapshots, flags);
+    n = virDomainSnapshotObjListNum(&vm->snapshots, NULL, flags);

 cleanup:
     if (vm)
@@ -10706,7 +10706,8 @@ qemuDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot,
         goto cleanup;
     }

-    n = virDomainSnapshotObjListGetNamesFrom(snap, names, nameslen, flags);
+    n = virDomainSnapshotObjListGetNames(&vm->snapshots, snap, names, nameslen,
+                                         flags);

 cleanup:
     if (vm)
@@ -10750,7 +10751,7 @@ qemuDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot,
      * VIR_DOMAIN_SNAPSHOT_LIST_METADATA makes no difference to our
      * answer.  */

-    n = virDomainSnapshotObjListNumFrom(snap, flags);
+    n = virDomainSnapshotObjListNum(&vm->snapshots, snap, flags);

 cleanup:
     if (vm)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index b893fd5..48369d6 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -807,7 +807,8 @@ qemuMigrationIsAllowed(struct qemud_driver *driver, virDomainObjPtr vm,
                             "%s", _("domain is marked for auto destroy"));
             return false;
         }
-        if ((nsnapshots = virDomainSnapshotObjListNum(&vm->snapshots, 0))) {
+        if ((nsnapshots = virDomainSnapshotObjListNum(&vm->snapshots, NULL,
+                                                      0))) {
             qemuReportError(VIR_ERR_OPERATION_INVALID,
                             _("cannot migrate domain with %d snapshots"),
                             nsnapshots);
-- 
1.7.10.2




More information about the libvir-list mailing list