[libvirt] [PATCH 07/12] getstats: report block sizes for offline domains

Eric Blake eblake at redhat.com
Sat Dec 6 08:14:15 UTC 2014


The prior refactoring can now be put to use. With the same domain
as the previous commit (one qcow2 disk and an empty cdrom drive):
$ virsh domstats --block foo
Domain: 'foo'
  block.count=2
  block.0.name=hda
  block.0.allocation=200704
  block.0.capacity=42949672960
  block.0.physical=200704
  block.1.name=hdc

* src/qemu/qemu_driver.c (qemuStorageLimitsRefresh): Tweak
semantics of helper function.
(qemuDomainGetStatsBlock): Use it to report offline statistics.

Signed-off-by: Eric Blake <eblake at redhat.com>
---
 src/qemu/qemu_driver.c | 60 +++++++++++++++++++++++++++++++++++---------------
 1 file changed, 42 insertions(+), 18 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 404decd..723391b 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -10983,7 +10983,9 @@ qemuDomainMemoryPeek(virDomainPtr dom,

 /* Refresh the capacity and allocation limits of a given storage
  * source.  Assumes that the caller has already obtained a domain job.
- * Set *activeFail to true if data cannot be obtained because a
+ * Pass NULL for path to skip any errors about an empty drive.
+ * Pass NULL for activeFail to skip any monitor attempt, otherwise,
+ * set *activeFail to true if data cannot be obtained because a
  * transient guest is no longer active.  */
 static int
 qemuStorageLimitsRefresh(virQEMUDriverPtr driver, virQEMUDriverConfigPtr cfg,
@@ -11000,6 +11002,12 @@ qemuStorageLimitsRefresh(virQEMUDriverPtr driver, virQEMUDriverConfigPtr cfg,
     char *buf = NULL;
     ssize_t len;

+    if (!path) {
+        if (virStorageSourceIsEmpty(src))
+            return 0;
+        path = src->path;
+    }
+
     /* FIXME: For an offline domain, we always want to check current
      * on-disk statistics (as users have been known to change offline
      * images behind our backs).  For a running domain, however, it
@@ -11116,23 +11124,27 @@ qemuStorageLimitsRefresh(virQEMUDriverPtr driver, virQEMUDriverConfigPtr cfg,
     if (virStorageSourceGetActualType(src) == VIR_STORAGE_TYPE_BLOCK &&
         format != VIR_STORAGE_FILE_RAW &&
         S_ISBLK(sb.st_mode)) {
-        qemuDomainObjPrivatePtr priv = vm->privateData;
-
-        /* If the guest is not running, then success/failure return
-         * depends on whether domain is persistent
-         */
-        if (!virDomainObjIsActive(vm)) {
-            *activeFail = true;
+        if (!activeFail) {
+            disk->src->allocation = 0;
             ret = 0;
-            goto cleanup;
+        } else {
+            qemuDomainObjPrivatePtr priv = vm->privateData;
+
+            /* If the guest is not running, then success/failure return
+             * depends on whether domain is persistent
+             */
+            if (!virDomainObjIsActive(vm)) {
+                *activeFail = true;
+                ret = 0;
+                goto cleanup;
+            }
+
+            qemuDomainObjEnterMonitor(driver, vm);
+            ret = qemuMonitorGetBlockExtent(priv->mon,
+                                            disk->info.alias,
+                                            &src->allocation);
+            qemuDomainObjExitMonitor(driver, vm);
         }
-
-        qemuDomainObjEnterMonitor(driver, vm);
-        ret = qemuMonitorGetBlockExtent(priv->mon,
-                                        disk->info.alias,
-                                        &src->allocation);
-        qemuDomainObjExitMonitor(driver, vm);
-
     } else {
         ret = 0;
     }
@@ -18530,6 +18542,7 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
     virHashTablePtr stats = NULL;
     qemuDomainObjPrivatePtr priv = dom->privateData;
     bool abbreviated = false;
+    virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);

     if (!HAVE_JOB(privflags) || !virDomainObjIsActive(dom)) {
         abbreviated = true; /* it's ok, just go ahead silently */
@@ -18555,8 +18568,18 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,

         if (abbreviated || !disk->info.alias ||
             !(entry = virHashLookup(stats, disk->info.alias))) {
-            /* FIXME: we could still look up sizing by sharing code
-             * with qemuDomainGetBlockInfo */
+            if (qemuStorageLimitsRefresh(driver, cfg, dom,
+                                         disk, disk->src, NULL, NULL) < 0)
+                goto cleanup;
+            if (disk->src->allocation)
+                QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, i,
+                                         "allocation", disk->src->allocation);
+            if (disk->src->capacity)
+                QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, i,
+                                         "capacity", disk->src->capacity);
+            if (disk->src->physical)
+                QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, i,
+                                         "physical", disk->src->physical);
             continue;
         }

@@ -18593,6 +18616,7 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,

  cleanup:
     virHashFree(stats);
+    virObjectUnref(cfg);
     return ret;
 }

-- 
1.9.3




More information about the libvir-list mailing list