]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: introduce QEMU_DOMAIN_JOB_STATUS_POSTCOPY
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Fri, 1 Sep 2017 06:49:21 +0000 (09:49 +0300)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 7 Sep 2017 07:41:45 +0000 (09:41 +0200)
Let's introduce QEMU_DOMAIN_JOB_STATUS_POSTCOPY state for job.current->status
instead of checking job.current->stats.status. The latter can be changed
when fetching migration statistics. Moving state function from the variable
and leave only store function seems more managable.

This patch removes all state checking usage of stats except for
qemuDomainGetJobStatsInternal. This place will be handled separately.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_process.c

index eb344788bd6cfeff9829c060fb7263876eab1e57..5a78e3943e1778dffd50cbf16d0a22d1c69d3b18 100644 (file)
@@ -420,6 +420,7 @@ qemuDomainJobStatusToType(qemuDomainJobStatus status)
         break;
 
     case QEMU_DOMAIN_JOB_STATUS_ACTIVE:
+    case QEMU_DOMAIN_JOB_STATUS_POSTCOPY:
         return VIR_DOMAIN_JOB_UNBOUNDED;
 
     case QEMU_DOMAIN_JOB_STATUS_COMPLETED:
index c309080ceb1976052865ae9070e99e363f81a3c5..341c547e5a3985d60b3ecf194c49700fcf144c79 100644 (file)
@@ -102,6 +102,7 @@ VIR_ENUM_DECL(qemuDomainAsyncJob)
 typedef enum {
     QEMU_DOMAIN_JOB_STATUS_NONE = 0,
     QEMU_DOMAIN_JOB_STATUS_ACTIVE,
+    QEMU_DOMAIN_JOB_STATUS_POSTCOPY,
     QEMU_DOMAIN_JOB_STATUS_COMPLETED,
     QEMU_DOMAIN_JOB_STATUS_FAILED,
     QEMU_DOMAIN_JOB_STATUS_CANCELED,
index 990c4ea87331bb74ed52d21098e1404007c2b2a4..c3ae0739a34ec37173051d3450a95766d4f3e86e 100644 (file)
@@ -13018,7 +13018,8 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver,
     }
     *jobInfo = *info;
 
-    if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE) {
+    if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE ||
+        jobInfo->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY) {
         if (fetch)
             ret = qemuMigrationFetchJobStatus(driver, vm, QEMU_ASYNC_JOB_NONE,
                                               jobInfo);
@@ -13152,7 +13153,7 @@ static int qemuDomainAbortJob(virDomainPtr dom)
     }
 
     if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT &&
-        (priv->job.current->stats.status == QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY ||
+        (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY ||
          (virDomainObjGetState(vm, &reason) == VIR_DOMAIN_PAUSED &&
           reason == VIR_DOMAIN_PAUSED_POSTCOPY))) {
         virReportError(VIR_ERR_OPERATION_INVALID, "%s",
index 83d2c618411c6c925d7c90619f0046d27543870f..c51a9c23f44f0c93059251faa3e2b6720a0c6c1f 100644 (file)
@@ -1346,6 +1346,10 @@ static void
 qemuMigrationUpdateJobType(qemuDomainJobInfoPtr jobInfo)
 {
     switch ((qemuMonitorMigrationStatus) jobInfo->stats.status) {
+    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY:
+        jobInfo->status = QEMU_DOMAIN_JOB_STATUS_POSTCOPY;
+        break;
+
     case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
         jobInfo->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
         break;
@@ -1364,7 +1368,6 @@ qemuMigrationUpdateJobType(qemuDomainJobInfoPtr jobInfo)
 
     case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
     case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE:
-    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY:
     case QEMU_MONITOR_MIGRATION_STATUS_CANCELLING:
     case QEMU_MONITOR_MIGRATION_STATUS_LAST:
         break;
@@ -1470,6 +1473,7 @@ qemuMigrationCheckJobStatus(virQEMUDriverPtr driver,
         break;
 
     case QEMU_DOMAIN_JOB_STATUS_ACTIVE:
+    case QEMU_DOMAIN_JOB_STATUS_POSTCOPY:
         break;
     }
     return 0;
@@ -1527,8 +1531,7 @@ qemuMigrationCompleted(virQEMUDriverPtr driver,
      * will continue waiting until the migrate state changes to completed.
      */
     if (flags & QEMU_MIGRATION_COMPLETED_POSTCOPY &&
-        jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE &&
-        jobInfo->stats.status == QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY) {
+        jobInfo->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY) {
         VIR_DEBUG("Migration switched to post-copy");
         if (updateStats &&
             qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
@@ -1542,7 +1545,8 @@ qemuMigrationCompleted(virQEMUDriverPtr driver,
         return 0;
 
  error:
-    if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE) {
+    if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE ||
+        jobInfo->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY) {
         /* The migration was aborted by us rather than QEMU itself. */
         jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
         return -2;
@@ -3836,7 +3840,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
     else if (rc == -1)
         goto cleanup;
 
-    if (priv->job.current->stats.status == QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY)
+    if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY)
         inPostCopy = true;
 
     /* When migration completed, QEMU will have paused the CPUs for us.
@@ -3888,7 +3892,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
         ignore_value(virTimeMillisNow(&priv->job.completed->sent));
     }
 
-    if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE && !inPostCopy)
+    if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE)
         priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
 
     cookieFlags |= QEMU_MIGRATION_COOKIE_NETWORK |
@@ -5261,7 +5265,7 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
             goto endjob;
     }
 
-    if (priv->job.current->stats.status == QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY)
+    if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY)
         inPostCopy = true;
 
     if (!(flags & VIR_MIGRATE_PAUSED)) {
index f6728be5e9293a7a1663920bc9b9533e5ea9f1a9..ef4972c73497d7e2ad9eb02c6ea6a3a7a70a7374 100644 (file)
@@ -741,8 +741,8 @@ qemuProcessHandleStop(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
         }
 
         if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT) {
-            if (priv->job.current->stats.status ==
-                        QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY) {
+            if (priv->job.current->status ==
+                        QEMU_DOMAIN_JOB_STATUS_POSTCOPY) {
                 reason = VIR_DOMAIN_PAUSED_POSTCOPY;
                 detail = VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY;
             } else {