[PATCHv2 11/7] snapshot: optimize vbox snapshot name lookup

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Older VBox provided snapshotGet, which looks up by UUID (and
where NULL looked up the root) and snapshotFind, which looks up
by name.  VBox 4.0 consolidated into snapshotFind that looks up
by UUID or name (and NULL still looks up the root).  But since
name lookup has always been present, we don't need to recurse
through the snapshot tree ourselves.

* src/vbox/vbox_tmpl.c (vboxDomainSnapshotGet): Use name lookup,
rather than crawling through entire hierarchy.
---

v2: Use snapshotFind for all versions, dropping all cruft that
attempted snapshotGet, based on Matthias' review.

It would be nice if someone could test this on VBox 2.2 prior to
pushing...

 src/vbox/vbox_tmpl.c |   45 ++++++++++-----------------------------------
 1 files changed, 10 insertions(+), 35 deletions(-)

diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 8c53f1f..c74d2cf 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -5586,50 +5586,25 @@ vboxDomainSnapshotGet(vboxGlobalData *data,
                       IMachine *machine,
                       const char *name)
 {
-    ISnapshot **snapshots = NULL;
     ISnapshot *snapshot = NULL;
     nsresult rc;
-    int count = 0;
-    int i;
-
-    if ((count = vboxDomainSnapshotGetAll(dom, machine, &snapshots)) < 0)
-        goto cleanup;
-
-    for (i = 0; i < count; i++) {
-        PRUnichar *nameUtf16;
-        char *nameUtf8;
-
-        rc = snapshots[i]->vtbl->GetName(snapshots[i], &nameUtf16);
-        if (NS_FAILED(rc) || !nameUtf16) {
-            vboxError(VIR_ERR_INTERNAL_ERROR,
-                      "%s", _("could not get snapshot name"));
-            goto cleanup;
-        }
-        VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8);
-        VBOX_UTF16_FREE(nameUtf16);
-        if (STREQ(name, nameUtf8))
-            snapshot = snapshots[i];
-        VBOX_UTF8_FREE(nameUtf8);
+    PRUnichar *nameUtf16 = NULL;

-        if (snapshot)
-            break;
+    VBOX_UTF8_TO_UTF16(name, &nameUtf16);
+    if (!nameUtf16) {
+        virReportOOMError();
+        return NULL;
     }

-    if (!snapshot) {
-        vboxError(VIR_ERR_OPERATION_INVALID,
+    rc = machine->vtbl->FindSnapshot(machine, nameUtf16, &snapshot);
+    VBOX_UTF16_FREE(nameUtf16);
+    if (NS_FAILED(rc) || !snapshot) {
+        vboxError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
                   _("domain %s has no snapshots with name %s"),
                   dom->name, name);
-        goto cleanup;
+        return NULL;
     }

-cleanup:
-    if (count > 0) {
-        for (i = 0; i < count; i++) {
-            if (snapshots[i] != snapshot)
-                VBOX_RELEASE(snapshots[i]);
-        }
-    }
-    VIR_FREE(snapshots);
     return snapshot;
 }

-- 
1.7.4.4

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]