[libvirt PATCH 1/3] qemu_migration: Properly wait for migration to be canceled

Jiri Denemark jdenemar at redhat.com
Fri Oct 14 12:58:06 UTC 2022


In my commit v8.7.0-57-g2d7b22b561 I attempted to make
qemuMigrationSrcCancel synchronous, but failed. When we are canceling
migration after some kind of error which is detected in
in qemuMigrationSrcWaitForCompletion, jobData->status will be set to
VIR_DOMAIN_JOB_STATUS_FAILED regardless on QEMU state. So instead of
relying on the translated jobData->status in qemuMigrationSrcIsCanceled
we need to check the migration status we get from QEMU MIGRATION event.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 src/qemu/qemu_migration.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 33105cf07b..21c870334d 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -4597,21 +4597,30 @@ static bool
 qemuMigrationSrcIsCanceled(virDomainObj *vm)
 {
     virDomainJobData *jobData = vm->job->current;
+    qemuDomainJobDataPrivate *priv = jobData->privateData;
+    qemuMonitorMigrationStatus status = priv->stats.mig.status;
 
-    qemuMigrationUpdateJobType(jobData);
-    switch (jobData->status) {
-    case VIR_DOMAIN_JOB_STATUS_FAILED:
-    case VIR_DOMAIN_JOB_STATUS_CANCELED:
-    case VIR_DOMAIN_JOB_STATUS_COMPLETED:
-    case VIR_DOMAIN_JOB_STATUS_NONE:
+    switch (status) {
+    case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
+    case QEMU_MONITOR_MIGRATION_STATUS_ERROR:
+    case QEMU_MONITOR_MIGRATION_STATUS_CANCELLED:
+    case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
+        VIR_DEBUG("QEMU migration status: %s; waiting finished",
+                  qemuMonitorMigrationStatusTypeToString(status));
         return true;
 
-    case VIR_DOMAIN_JOB_STATUS_MIGRATING:
-    case VIR_DOMAIN_JOB_STATUS_POSTCOPY:
-    case VIR_DOMAIN_JOB_STATUS_PAUSED:
-    case VIR_DOMAIN_JOB_STATUS_HYPERVISOR_COMPLETED:
-    case VIR_DOMAIN_JOB_STATUS_POSTCOPY_PAUSED:
-    case VIR_DOMAIN_JOB_STATUS_ACTIVE:
+    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY:
+    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER:
+    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED:
+    case QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER:
+    case QEMU_MONITOR_MIGRATION_STATUS_DEVICE:
+    case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
+    case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE:
+    case QEMU_MONITOR_MIGRATION_STATUS_CANCELLING:
+    case QEMU_MONITOR_MIGRATION_STATUS_WAIT_UNPLUG:
+    case QEMU_MONITOR_MIGRATION_STATUS_LAST:
+        VIR_DEBUG("QEMU migration status: %s; still waiting",
+                  qemuMonitorMigrationStatusTypeToString(status));
         break;
     }
 
-- 
2.38.0



More information about the libvir-list mailing list