23265d
From 547c0e17e665d7a1051d8670b2f9e44783dbaf58 Mon Sep 17 00:00:00 2001
23265d
Message-Id: <547c0e17e665d7a1051d8670b2f9e44783dbaf58@dist-git>
23265d
From: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
23265d
Date: Fri, 1 Sep 2017 09:49:31 +0300
23265d
Subject: [PATCH] qemu: migration: don't expose incomplete job as complete
23265d
23265d
In case of real migration (not migrating to file on save, dump etc)
23265d
migration info is not complete at time qemu finishes migration
23265d
in normal (non postcopy) mode. We need to update disks stats,
23265d
downtime info etc. Thus let's not expose this job status as
23265d
completed.
23265d
23265d
To archive this let's set status to 'qemu completed' after
23265d
qemu reports migration is finished. It is not visible as complete
23265d
job to clients. Cookie code on confirm phase will finally turn
23265d
job into completed. As we don't need more things to do when
23265d
migrating to file status is set to 'completed' as before
23265d
in this case.
23265d
23265d
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
23265d
(cherry picked from commit 3f2d6d829eb8de0348fcbd58d654b29d5c5bebc2)
23265d
23265d
https://bugzilla.redhat.com/show_bug.cgi?id=1530130
23265d
23265d
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
23265d
---
23265d
 src/qemu/qemu_domain.c    |  1 +
23265d
 src/qemu/qemu_domain.h    |  1 +
23265d
 src/qemu/qemu_driver.c    |  1 +
23265d
 src/qemu/qemu_migration.c | 13 +++++++++----
23265d
 4 files changed, 12 insertions(+), 4 deletions(-)
23265d
23265d
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
23265d
index e81d682c00..9a80e409b9 100644
23265d
--- a/src/qemu/qemu_domain.c
23265d
+++ b/src/qemu/qemu_domain.c
23265d
@@ -398,6 +398,7 @@ qemuDomainJobStatusToType(qemuDomainJobStatus status)
23265d
 
23265d
     case QEMU_DOMAIN_JOB_STATUS_ACTIVE:
23265d
     case QEMU_DOMAIN_JOB_STATUS_MIGRATING:
23265d
+    case QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED:
23265d
     case QEMU_DOMAIN_JOB_STATUS_POSTCOPY:
23265d
         return VIR_DOMAIN_JOB_UNBOUNDED;
23265d
 
23265d
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
23265d
index 0cf54d99ae..cc458e1224 100644
23265d
--- a/src/qemu/qemu_domain.h
23265d
+++ b/src/qemu/qemu_domain.h
23265d
@@ -103,6 +103,7 @@ typedef enum {
23265d
     QEMU_DOMAIN_JOB_STATUS_NONE = 0,
23265d
     QEMU_DOMAIN_JOB_STATUS_ACTIVE,
23265d
     QEMU_DOMAIN_JOB_STATUS_MIGRATING,
23265d
+    QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED,
23265d
     QEMU_DOMAIN_JOB_STATUS_POSTCOPY,
23265d
     QEMU_DOMAIN_JOB_STATUS_COMPLETED,
23265d
     QEMU_DOMAIN_JOB_STATUS_FAILED,
23265d
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
23265d
index 931f3d344d..d2dd704868 100644
23265d
--- a/src/qemu/qemu_driver.c
23265d
+++ b/src/qemu/qemu_driver.c
23265d
@@ -12972,6 +12972,7 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver,
23265d
 
23265d
     if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE ||
23265d
         jobInfo->status == QEMU_DOMAIN_JOB_STATUS_MIGRATING ||
23265d
+        jobInfo->status == QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED ||
23265d
         jobInfo->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY) {
23265d
         if (fetch)
23265d
             ret = qemuMigrationFetchJobStatus(driver, vm, QEMU_ASYNC_JOB_NONE,
23265d
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
23265d
index c8cd7ebfa3..aabd0913ad 100644
23265d
--- a/src/qemu/qemu_migration.c
23265d
+++ b/src/qemu/qemu_migration.c
23265d
@@ -1338,7 +1338,7 @@ qemuMigrationUpdateJobType(qemuDomainJobInfoPtr jobInfo)
23265d
         break;
23265d
 
23265d
     case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
23265d
-        jobInfo->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
23265d
+        jobInfo->status = QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED;
23265d
         break;
23265d
 
23265d
     case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
23265d
@@ -1461,6 +1461,7 @@ qemuMigrationCheckJobStatus(virQEMUDriverPtr driver,
23265d
 
23265d
     case QEMU_DOMAIN_JOB_STATUS_ACTIVE:
23265d
     case QEMU_DOMAIN_JOB_STATUS_MIGRATING:
23265d
+    case QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED:
23265d
     case QEMU_DOMAIN_JOB_STATUS_POSTCOPY:
23265d
         break;
23265d
     }
23265d
@@ -1527,19 +1528,19 @@ qemuMigrationCompleted(virQEMUDriverPtr driver,
23265d
         return 1;
23265d
     }
23265d
 
23265d
-    if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_COMPLETED)
23265d
+    if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED)
23265d
         return 1;
23265d
     else
23265d
         return 0;
23265d
 
23265d
  error:
23265d
-    /* state can not be active at this point */
23265d
+    /* state can not be active or completed at this point */
23265d
     if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_MIGRATING ||
23265d
         jobInfo->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY) {
23265d
         /* The migration was aborted by us rather than QEMU itself. */
23265d
         jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
23265d
         return -2;
23265d
-    } else if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_COMPLETED) {
23265d
+    } else if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED) {
23265d
         jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
23265d
         return -1;
23265d
     } else {
23265d
@@ -1592,6 +1593,10 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver,
23265d
     if (VIR_ALLOC(priv->job.completed) == 0)
23265d
         *priv->job.completed = *jobInfo;
23265d
 
23265d
+    if (asyncJob != QEMU_ASYNC_JOB_MIGRATION_OUT &&
23265d
+        jobInfo->status == QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED)
23265d
+        jobInfo->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
23265d
+
23265d
     return 0;
23265d
 }
23265d
 
23265d
-- 
23265d
2.15.1
23265d