[PATCHv2 16/26] snapshot: cache qemu-img location

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

 



As more clients start to want to know this information, doing
a PATH stat walk and malloc for every client adds up.

* src/qemu/qemu_conf.h (qemud_driver): Add member.
* src/qemu/qemu_driver.c (qemudShutdown): Cleanup.
(qemuFindQemuImgBinary): Add an argument, and cache result.
(qemuDomainSnapshotDiscard, qemuDomainSnapshotCreateInactive)
(qemuDomainSnapshotRevertInactive, qemuDomainSnapshotCreateXML)
(qemuDomainRevertToSnapshot): Update callers.
---
 src/qemu/qemu_conf.h   |    1 +
 src/qemu/qemu_driver.c |   42 +++++++++++++++++++++---------------------
 2 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 0a60d32..5469a63 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -82,6 +82,7 @@ struct qemud_driver {
     char *cacheDir;
     char *saveDir;
     char *snapshotDir;
+    char *qemuImgBinary;
     unsigned int vncAutoUnixSocket : 1;
     unsigned int vncTLS : 1;
     unsigned int vncTLSx509verify : 1;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 3977135..f4a4786 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -774,6 +774,7 @@ qemudShutdown(void) {
     VIR_FREE(qemu_driver->cacheDir);
     VIR_FREE(qemu_driver->saveDir);
     VIR_FREE(qemu_driver->snapshotDir);
+    VIR_FREE(qemu_driver->qemuImgBinary);
     VIR_FREE(qemu_driver->autoDumpPath);
     VIR_FREE(qemu_driver->vncTLSx509certdir);
     VIR_FREE(qemu_driver->vncListen);
@@ -1588,19 +1589,19 @@ struct snap_remove {
 };

 /* Locate an appropriate 'qemu-img' binary.  */
-static char *
-qemuFindQemuImgBinary(void)
+static const char *
+qemuFindQemuImgBinary(struct qemud_driver *driver)
 {
-    char *ret;
-
-    ret = virFindFileInPath("kvm-img");
-    if (ret == NULL)
-        ret = virFindFileInPath("qemu-img");
-    if (ret == NULL)
-        qemuReportError(VIR_ERR_INTERNAL_ERROR,
-                        "%s", _("unable to find kvm-img or qemu-img"));
+    if (!driver->qemuImgBinary) {
+        driver->qemuImgBinary = virFindFileInPath("kvm-img");
+        if (!driver->qemuImgBinary)
+            driver->qemuImgBinary = virFindFileInPath("qemu-img");
+        if (!driver->qemuImgBinary)
+            qemuReportError(VIR_ERR_INTERNAL_ERROR,
+                            "%s", _("unable to find kvm-img or qemu-img"));
+    }

-    return ret;
+    return driver->qemuImgBinary;
 }

 static int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
@@ -1673,7 +1674,7 @@ qemuDomainSnapshotDiscard(struct qemud_driver *driver,

     if (!metadata_only) {
         if (!virDomainObjIsActive(vm)) {
-            qemuimgarg[0] = qemuFindQemuImgBinary();
+            qemuimgarg[0] = qemuFindQemuImgBinary(driver);
             if (qemuimgarg[0] == NULL)
                 /* qemuFindQemuImgBinary set the error */
                 goto cleanup;
@@ -1745,7 +1746,6 @@ qemuDomainSnapshotDiscard(struct qemud_driver *driver,

 cleanup:
     VIR_FREE(snapFile);
-    VIR_FREE(qemuimgarg[0]);

     return ret;
 }
@@ -8488,14 +8488,15 @@ static int qemuDomainSnapshotIsAllowed(virDomainObjPtr vm)

 /* The domain is expected to be locked and inactive. */
 static int
-qemuDomainSnapshotCreateInactive(virDomainObjPtr vm,
+qemuDomainSnapshotCreateInactive(struct qemud_driver *driver,
+                                 virDomainObjPtr vm,
                                  virDomainSnapshotObjPtr snap)
 {
     const char *qemuimgarg[] = { NULL, "snapshot", "-c", NULL, NULL, NULL };
     int ret = -1;
     int i;

-    qemuimgarg[0] = qemuFindQemuImgBinary();
+    qemuimgarg[0] = qemuFindQemuImgBinary(driver);
     if (qemuimgarg[0] == NULL) {
         /* qemuFindQemuImgBinary set the error */
         goto cleanup;
@@ -8528,7 +8529,6 @@ qemuDomainSnapshotCreateInactive(virDomainObjPtr vm,
     ret = 0;

 cleanup:
-    VIR_FREE(qemuimgarg[0]);
     return ret;
 }

@@ -8639,7 +8639,7 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,

     /* actually do the snapshot */
     if (!virDomainObjIsActive(vm)) {
-        if (qemuDomainSnapshotCreateInactive(vm, snap) < 0)
+        if (qemuDomainSnapshotCreateInactive(driver, vm, snap) < 0)
             goto cleanup;
     } else {
         if (qemuDomainSnapshotCreateActive(domain->conn, driver,
@@ -8873,14 +8873,15 @@ cleanup:

 /* The domain is expected to be locked and inactive. */
 static int
-qemuDomainSnapshotRevertInactive(virDomainObjPtr vm,
+qemuDomainSnapshotRevertInactive(struct qemud_driver *driver,
+                                 virDomainObjPtr vm,
                                  virDomainSnapshotObjPtr snap)
 {
     const char *qemuimgarg[] = { NULL, "snapshot", "-a", NULL, NULL, NULL };
     int ret = -1;
     int i;

-    qemuimgarg[0] = qemuFindQemuImgBinary();
+    qemuimgarg[0] = qemuFindQemuImgBinary(driver);
     if (qemuimgarg[0] == NULL) {
         /* qemuFindQemuImgBinary set the error */
         goto cleanup;
@@ -8913,7 +8914,6 @@ qemuDomainSnapshotRevertInactive(virDomainObjPtr vm,
     ret = 0;

 cleanup:
-    VIR_FREE(qemuimgarg[0]);
     return ret;
 }

@@ -9053,7 +9053,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
             }
         }

-        if (qemuDomainSnapshotRevertInactive(vm, snap) < 0)
+        if (qemuDomainSnapshotRevertInactive(driver, vm, snap) < 0)
             goto endjob;
     }

-- 
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]