[libvirt] [PATCH v2 10/12] qemu: split getting stats for migration and others

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Wed Dec 28 14:39:19 UTC 2016


All domain jobs other than source migration have only one
state - active. Only elapsed time is available for such
jobs so let's make it more explicit. Also if in future there will
be more stats for such jobs we don't want to mess them with
migration stats code.
---
 src/qemu/qemu_driver.c | 58 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 37 insertions(+), 21 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 21e3f9c..acaad8f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13013,6 +13013,34 @@ qemuConnectBaselineCPU(virConnectPtr conn ATTRIBUTE_UNUSED,
 
 
 static int
+qemuDomainGetMigrationJobStats(virQEMUDriverPtr driver,
+                               virDomainObjPtr vm,
+                               qemuDomainJobInfoPtr jobInfo)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+
+    if (jobInfo->status != QEMU_DOMAIN_JOB_STATUS_ACTIVE &&
+        jobInfo->status != QEMU_DOMAIN_JOB_STATUS_POSTCOPY)
+        return 0;
+
+    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT) &&
+        priv->job.current->stats.status) {
+        int rv;
+
+        qemuDomainObjEnterMonitor(driver, vm);
+        rv = qemuMonitorGetMigrationStats(priv->mon, &jobInfo->stats);
+        if (qemuDomainObjExitMonitor(driver, vm) < 0 || rv < 0)
+            return -1;
+    }
+
+    if (qemuDomainJobInfoUpdateTime(jobInfo) < 0)
+        return -1;
+
+    return 0;
+}
+
+
+static int
 qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver,
                               virDomainObjPtr vm,
                               bool completed,
@@ -13047,29 +13075,17 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver,
     }
     *jobInfo = *priv->job.current;
 
-    if (jobInfo->status != QEMU_DOMAIN_JOB_STATUS_ACTIVE &&
-        jobInfo->status != QEMU_DOMAIN_JOB_STATUS_POSTCOPY) {
-        ret = 0;
-        goto cleanup;
+    if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT ||
+        priv->job.asyncJob == QEMU_ASYNC_JOB_SAVE) {
+       ret = qemuDomainGetMigrationJobStats(driver, vm, jobInfo);
+    } else {
+        if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE) {
+            ret = qemuDomainJobInfoUpdateTime(jobInfo);
+        } else {
+            ret = 0;
+        }
     }
 
-    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT) &&
-        priv->job.current->stats.status) {
-        int rv;
-
-        qemuDomainObjEnterMonitor(driver, vm);
-
-        rv = qemuMonitorGetMigrationStats(priv->mon, &jobInfo->stats);
-
-        if (qemuDomainObjExitMonitor(driver, vm) < 0 || rv < 0)
-            goto cleanup;
-    }
-
-    if (qemuDomainJobInfoUpdateTime(jobInfo) < 0)
-        goto cleanup;
-
-    ret = 0;
-
  cleanup:
     qemuDomainObjEndJob(driver, vm);
     return ret;
-- 
1.8.3.1




More information about the libvir-list mailing list