]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuMonitorJSONQueryBlockstats: query stats for helper images
authorPeter Krempa <pkrempa@redhat.com>
Mon, 1 Nov 2021 10:35:41 +0000 (11:35 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 4 Nov 2021 09:55:28 +0000 (10:55 +0100)
Use the 'query-nodes' flag to return all stats. The flag was introduced
prior to qemu-2.11 so we can always use it, but we invoke it only when
querying stats. The other invocation is used for detecting the nodenames
which is fragile code.

The images without a frontend don't have the device field so the
extraction code checks need to be relaxed.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h

index a63915b6d7eac5cd7380cad7c55437406a64368e..92dd4e75575fed4f51af2ab4c2444eaaffdbbb17 100644 (file)
@@ -2038,14 +2038,14 @@ qemuMonitorGetBlockInfo(qemuMonitor *mon)
  * qemuMonitorQueryBlockstats:
  * @mon: monitor object
  *
- * Returns data from a call to 'query-blockstats'.
+ * Returns data from a call to 'query-blockstats' without using 'query-nodes'
  */
 virJSONValue *
 qemuMonitorQueryBlockstats(qemuMonitor *mon)
 {
     QEMU_CHECK_MONITOR_NULL(mon);
 
-    return qemuMonitorJSONQueryBlockstats(mon);
+    return qemuMonitorJSONQueryBlockstats(mon, false);
 }
 
 
index 7d21e238009fc9bc7ac7bc6e968b272889af7254..9186d59ca2e53146a2d2ee2f78b43c209e9c1f98 100644 (file)
@@ -2430,12 +2430,15 @@ qemuMonitorJSONGetOneBlockStatsInfo(virJSONValue *dev,
 
 
 virJSONValue *
-qemuMonitorJSONQueryBlockstats(qemuMonitor *mon)
+qemuMonitorJSONQueryBlockstats(qemuMonitor *mon,
+                               bool queryNodes)
 {
     g_autoptr(virJSONValue) cmd = NULL;
     g_autoptr(virJSONValue) reply = NULL;
 
-    if (!(cmd = qemuMonitorJSONMakeCommand("query-blockstats", NULL)))
+    if (!(cmd = qemuMonitorJSONMakeCommand("query-blockstats",
+                                           "B:query-nodes", queryNodes,
+                                           NULL)))
         return NULL;
 
     if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
@@ -2457,7 +2460,7 @@ qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitor *mon,
     size_t i;
     g_autoptr(virJSONValue) devices = NULL;
 
-    if (!(devices = qemuMonitorJSONQueryBlockstats(mon)))
+    if (!(devices = qemuMonitorJSONQueryBlockstats(mon, true)))
         return -1;
 
     for (i = 0; i < virJSONValueArraySize(devices); i++) {
@@ -2471,16 +2474,11 @@ qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitor *mon,
             return -1;
         }
 
-        if (!(dev_name = virJSONValueObjectGetString(dev, "device"))) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("blockstats device entry was not "
-                             "in expected format"));
-            return -1;
+        if ((dev_name = virJSONValueObjectGetString(dev, "device"))) {
+            if (*dev_name == '\0')
+                dev_name = NULL;
         }
 
-        if (*dev_name == '\0')
-            dev_name = NULL;
-
         rc = qemuMonitorJSONGetOneBlockStatsInfo(dev, dev_name, 0, hash);
 
         if (rc < 0)
index d91c5928e3dc32797505938aaa12ccb25e00837b..f7fb13f56ca2c99b9e926d92967c71d7c2925997 100644 (file)
@@ -75,7 +75,8 @@ int qemuMonitorJSONSetMemoryStatsPeriod(qemuMonitor *mon,
 int qemuMonitorJSONGetBlockInfo(qemuMonitor *mon,
                                 GHashTable *table);
 
-virJSONValue *qemuMonitorJSONQueryBlockstats(qemuMonitor *mon);
+virJSONValue *qemuMonitorJSONQueryBlockstats(qemuMonitor *mon,
+                                             bool queryNodes);
 int qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitor *mon,
                                         GHashTable *hash);
 int qemuMonitorJSONBlockStatsUpdateCapacity(qemuMonitor *mon,