6d3351
From 4db224dec8f4aeaadf95da115a57ed73244939a0 Mon Sep 17 00:00:00 2001
6d3351
Message-Id: <4db224dec8f4aeaadf95da115a57ed73244939a0@dist-git>
6d3351
From: Jiri Denemark <jdenemar@redhat.com>
6d3351
Date: Wed, 26 Apr 2017 12:00:09 +0200
6d3351
Subject: [PATCH] qemu: Report VIR_DOMAIN_JOB_OPERATION
6d3351
6d3351
Not all async jobs are visible via virDomainGetJobStats (either they are
6d3351
too fast or getting the stats is not allowed during the job), but
6d3351
forcing all of them to advertise the operation is easier than hunting
6d3351
the jobs for which fetching statistics is allowed. And we won't need to
6d3351
think about this when we add support for getting stats for more jobs.
6d3351
6d3351
https://bugzilla.redhat.com/show_bug.cgi?id=1441563
6d3351
6d3351
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
6d3351
(cherry picked from commit 2a978269fc9dc31c354a7c9132cb62d52e7613ef)
6d3351
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
6d3351
---
6d3351
 src/qemu/qemu_domain.c    | 16 +++++++++++++---
6d3351
 src/qemu/qemu_domain.h    |  4 +++-
6d3351
 src/qemu/qemu_driver.c    | 32 ++++++++++++++++++++++----------
6d3351
 src/qemu/qemu_migration.c | 19 ++++++++++++-------
6d3351
 src/qemu/qemu_process.c   |  6 ++++--
6d3351
 src/qemu/qemu_process.h   |  3 ++-
6d3351
 6 files changed, 56 insertions(+), 24 deletions(-)
6d3351
6d3351
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
6d3351
index c43ff3d63..9c09ced0c 100644
6d3351
--- a/src/qemu/qemu_domain.c
6d3351
+++ b/src/qemu/qemu_domain.c
6d3351
@@ -405,6 +405,11 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
6d3351
     int maxpar = 0;
6d3351
     int npar = 0;
6d3351
 
6d3351
+    if (virTypedParamsAddInt(&par, &npar, &maxpar,
6d3351
+                             VIR_DOMAIN_JOB_OPERATION,
6d3351
+                             jobInfo->operation) < 0)
6d3351
+        goto error;
6d3351
+
6d3351
     if (virTypedParamsAddULLong(&par, &npar, &maxpar,
6d3351
                                 VIR_DOMAIN_JOB_TIME_ELAPSED,
6d3351
                                 jobInfo->timeElapsed) < 0)
6d3351
@@ -3674,13 +3679,18 @@ int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
6d3351
 
6d3351
 int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
6d3351
                                virDomainObjPtr obj,
6d3351
-                               qemuDomainAsyncJob asyncJob)
6d3351
+                               qemuDomainAsyncJob asyncJob,
6d3351
+                               virDomainJobOperation operation)
6d3351
 {
6d3351
+    qemuDomainObjPrivatePtr priv;
6d3351
+
6d3351
     if (qemuDomainObjBeginJobInternal(driver, obj, QEMU_JOB_ASYNC,
6d3351
                                       asyncJob) < 0)
6d3351
         return -1;
6d3351
-    else
6d3351
-        return 0;
6d3351
+
6d3351
+    priv = obj->privateData;
6d3351
+    priv->job.current->operation = operation;
6d3351
+    return 0;
6d3351
 }
6d3351
 
6d3351
 int
6d3351
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
6d3351
index 0e32bb9ea..f50330487 100644
6d3351
--- a/src/qemu/qemu_domain.h
6d3351
+++ b/src/qemu/qemu_domain.h
6d3351
@@ -103,6 +103,7 @@ typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
6d3351
 typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
6d3351
 struct _qemuDomainJobInfo {
6d3351
     virDomainJobType type;
6d3351
+    virDomainJobOperation operation;
6d3351
     unsigned long long started; /* When the async job started */
6d3351
     unsigned long long stopped; /* When the domain's CPUs were stopped */
6d3351
     unsigned long long sent; /* When the source sent status info to the
6d3351
@@ -433,7 +434,8 @@ int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
6d3351
     ATTRIBUTE_RETURN_CHECK;
6d3351
 int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
6d3351
                                virDomainObjPtr obj,
6d3351
-                               qemuDomainAsyncJob asyncJob)
6d3351
+                               qemuDomainAsyncJob asyncJob,
6d3351
+                               virDomainJobOperation operation)
6d3351
     ATTRIBUTE_RETURN_CHECK;
6d3351
 int qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
6d3351
                                 virDomainObjPtr obj,
6d3351
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
6d3351
index 2fcf4612e..8699fb2fe 100644
6d3351
--- a/src/qemu/qemu_driver.c
6d3351
+++ b/src/qemu/qemu_driver.c
6d3351
@@ -268,7 +268,8 @@ qemuAutostartDomain(virDomainObjPtr vm,
6d3351
     virResetLastError();
6d3351
     if (vm->autostart &&
6d3351
         !virDomainObjIsActive(vm)) {
6d3351
-        if (qemuProcessBeginJob(data->driver, vm) < 0) {
6d3351
+        if (qemuProcessBeginJob(data->driver, vm,
6d3351
+                                VIR_DOMAIN_JOB_OPERATION_START) < 0) {
6d3351
             virReportError(VIR_ERR_INTERNAL_ERROR,
6d3351
                            _("Failed to start job on VM '%s': %s"),
6d3351
                            vm->def->name, virGetLastErrorMessage());
6d3351
@@ -1764,7 +1765,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn,
6d3351
     virObjectRef(vm);
6d3351
     def = NULL;
6d3351
 
6d3351
-    if (qemuProcessBeginJob(driver, vm) < 0) {
6d3351
+    if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_START) < 0) {
6d3351
         qemuDomainRemoveInactive(driver, vm);
6d3351
         goto cleanup;
6d3351
     }
6d3351
@@ -3152,7 +3153,8 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
6d3351
     if (!qemuMigrationIsAllowed(driver, vm, false, 0))
6d3351
         goto cleanup;
6d3351
 
6d3351
-    if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_SAVE) < 0)
6d3351
+    if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_SAVE,
6d3351
+                                   VIR_DOMAIN_JOB_OPERATION_SAVE) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
     if (!virDomainObjIsActive(vm)) {
6d3351
@@ -3690,7 +3692,8 @@ qemuDomainCoreDumpWithFormat(virDomainPtr dom,
6d3351
         goto cleanup;
6d3351
 
6d3351
     if (qemuDomainObjBeginAsyncJob(driver, vm,
6d3351
-                                   QEMU_ASYNC_JOB_DUMP) < 0)
6d3351
+                                   QEMU_ASYNC_JOB_DUMP,
6d3351
+                                   VIR_DOMAIN_JOB_OPERATION_DUMP) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
     if (!virDomainObjIsActive(vm)) {
6d3351
@@ -3920,7 +3923,8 @@ processWatchdogEvent(virQEMUDriverPtr driver,
6d3351
     switch (action) {
6d3351
     case VIR_DOMAIN_WATCHDOG_ACTION_DUMP:
6d3351
         if (qemuDomainObjBeginAsyncJob(driver, vm,
6d3351
-                                       QEMU_ASYNC_JOB_DUMP) < 0) {
6d3351
+                                       QEMU_ASYNC_JOB_DUMP,
6d3351
+                                       VIR_DOMAIN_JOB_OPERATION_DUMP) < 0) {
6d3351
             goto cleanup;
6d3351
         }
6d3351
 
6d3351
@@ -4007,7 +4011,8 @@ processGuestPanicEvent(virQEMUDriverPtr driver,
6d3351
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
6d3351
     bool removeInactive = false;
6d3351
 
6d3351
-    if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_DUMP) < 0)
6d3351
+    if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_DUMP,
6d3351
+                                   VIR_DOMAIN_JOB_OPERATION_DUMP) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
     if (!virDomainObjIsActive(vm)) {
6d3351
@@ -6492,7 +6497,7 @@ qemuDomainRestoreFlags(virConnectPtr conn,
6d3351
         priv->hookRun = true;
6d3351
     }
6d3351
 
6d3351
-    if (qemuProcessBeginJob(driver, vm) < 0)
6d3351
+    if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_RESTORE) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
     ret = qemuDomainSaveImageStartVM(conn, driver, vm, &fd, &header, path,
6d3351
@@ -6912,6 +6917,7 @@ qemuDomainObjStart(virConnectPtr conn,
6d3351
     bool bypass_cache = (flags & VIR_DOMAIN_START_BYPASS_CACHE) != 0;
6d3351
     bool force_boot = (flags & VIR_DOMAIN_START_FORCE_BOOT) != 0;
6d3351
     unsigned int start_flags = VIR_QEMU_PROCESS_START_COLD;
6d3351
+    qemuDomainObjPrivatePtr priv = vm->privateData;
6d3351
 
6d3351
     start_flags |= start_paused ? VIR_QEMU_PROCESS_START_PAUSED : 0;
6d3351
     start_flags |= autodestroy ? VIR_QEMU_PROCESS_START_AUTODESTROY : 0;
6d3351
@@ -6935,6 +6941,9 @@ qemuDomainObjStart(virConnectPtr conn,
6d3351
             }
6d3351
             vm->hasManagedSave = false;
6d3351
         } else {
6d3351
+            virDomainJobOperation op = priv->job.current->operation;
6d3351
+            priv->job.current->operation = VIR_DOMAIN_JOB_OPERATION_RESTORE;
6d3351
+
6d3351
             ret = qemuDomainObjRestore(conn, driver, vm, managed_save,
6d3351
                                        start_paused, bypass_cache, asyncJob);
6d3351
 
6d3351
@@ -6951,6 +6960,7 @@ qemuDomainObjStart(virConnectPtr conn,
6d3351
                 goto cleanup;
6d3351
             } else {
6d3351
                 VIR_WARN("Ignoring incomplete managed state %s", managed_save);
6d3351
+                priv->job.current->operation = op;
6d3351
             }
6d3351
         }
6d3351
     }
6d3351
@@ -7000,7 +7010,7 @@ qemuDomainCreateWithFlags(virDomainPtr dom, unsigned int flags)
6d3351
     if (virDomainCreateWithFlagsEnsureACL(dom->conn, vm->def) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
-    if (qemuProcessBeginJob(driver, vm) < 0)
6d3351
+    if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_START) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
     if (virDomainObjIsActive(vm)) {
6d3351
@@ -14567,7 +14577,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
6d3351
      * a regular job, so we need to set the job mask to disallow query as
6d3351
      * 'savevm' blocks the monitor. External snapshot will then modify the
6d3351
      * job mask appropriately. */
6d3351
-    if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_SNAPSHOT) < 0)
6d3351
+    if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_SNAPSHOT,
6d3351
+                                   VIR_DOMAIN_JOB_OPERATION_SNAPSHOT) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
     qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
6d3351
@@ -15157,7 +15168,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
6d3351
         goto cleanup;
6d3351
     }
6d3351
 
6d3351
-    if (qemuProcessBeginJob(driver, vm) < 0)
6d3351
+    if (qemuProcessBeginJob(driver, vm,
6d3351
+                            VIR_DOMAIN_JOB_OPERATION_SNAPSHOT_REVERT) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
     if (!(snap = qemuSnapObjFromSnapshot(vm, snapshot)))
6d3351
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
6d3351
index 8cbad894c..cadbf9b97 100644
6d3351
--- a/src/qemu/qemu_migration.c
6d3351
+++ b/src/qemu/qemu_migration.c
6d3351
@@ -5598,18 +5598,23 @@ qemuMigrationJobStart(virQEMUDriverPtr driver,
6d3351
                       qemuDomainAsyncJob job)
6d3351
 {
6d3351
     qemuDomainObjPrivatePtr priv = vm->privateData;
6d3351
-
6d3351
-    if (qemuDomainObjBeginAsyncJob(driver, vm, job) < 0)
6d3351
-        return -1;
6d3351
+    virDomainJobOperation op;
6d3351
+    unsigned long long mask;
6d3351
 
6d3351
     if (job == QEMU_ASYNC_JOB_MIGRATION_IN) {
6d3351
-        qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
6d3351
+        op = VIR_DOMAIN_JOB_OPERATION_MIGRATION_IN;
6d3351
+        mask = QEMU_JOB_NONE;
6d3351
     } else {
6d3351
-        qemuDomainObjSetAsyncJobMask(vm, (QEMU_JOB_DEFAULT_MASK |
6d3351
-                                          JOB_MASK(QEMU_JOB_SUSPEND) |
6d3351
-                                          JOB_MASK(QEMU_JOB_MIGRATION_OP)));
6d3351
+        op = VIR_DOMAIN_JOB_OPERATION_MIGRATION_OUT;
6d3351
+        mask = QEMU_JOB_DEFAULT_MASK |
6d3351
+               JOB_MASK(QEMU_JOB_SUSPEND) |
6d3351
+               JOB_MASK(QEMU_JOB_MIGRATION_OP);
6d3351
     }
6d3351
 
6d3351
+    if (qemuDomainObjBeginAsyncJob(driver, vm, job, op) < 0)
6d3351
+        return -1;
6d3351
+
6d3351
+    qemuDomainObjSetAsyncJobMask(vm, mask);
6d3351
     priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
6d3351
 
6d3351
     return 0;
6d3351
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
6d3351
index 2eee70203..afd9dfb71 100644
6d3351
--- a/src/qemu/qemu_process.c
6d3351
+++ b/src/qemu/qemu_process.c
6d3351
@@ -4143,11 +4143,13 @@ qemuProcessIncomingDefNew(virQEMUCapsPtr qemuCaps,
6d3351
  */
6d3351
 int
6d3351
 qemuProcessBeginJob(virQEMUDriverPtr driver,
6d3351
-                    virDomainObjPtr vm)
6d3351
+                    virDomainObjPtr vm,
6d3351
+                    virDomainJobOperation operation)
6d3351
 {
6d3351
     qemuDomainObjPrivatePtr priv = vm->privateData;
6d3351
 
6d3351
-    if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_START) < 0)
6d3351
+    if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_START,
6d3351
+                                   operation) < 0)
6d3351
         return -1;
6d3351
 
6d3351
     qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
6d3351
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
6d3351
index 21f3b0cca..830d8cef8 100644
6d3351
--- a/src/qemu/qemu_process.h
6d3351
+++ b/src/qemu/qemu_process.h
6d3351
@@ -59,7 +59,8 @@ qemuProcessIncomingDefPtr qemuProcessIncomingDefNew(virQEMUCapsPtr qemuCaps,
6d3351
 void qemuProcessIncomingDefFree(qemuProcessIncomingDefPtr inc);
6d3351
 
6d3351
 int qemuProcessBeginJob(virQEMUDriverPtr driver,
6d3351
-                        virDomainObjPtr vm);
6d3351
+                        virDomainObjPtr vm,
6d3351
+                        virDomainJobOperation operation);
6d3351
 void qemuProcessEndJob(virQEMUDriverPtr driver,
6d3351
                        virDomainObjPtr vm);
6d3351
 
6d3351
-- 
6d3351
2.12.2
6d3351