]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Handle 'postcopy-paused' migration state
authorJiri Denemark <jdenemar@redhat.com>
Tue, 10 May 2022 13:20:25 +0000 (15:20 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 7 Jun 2022 15:40:20 +0000 (17:40 +0200)
When connection breaks during post-copy migration, QEMU enters
'postcopy-paused' state. We need to handle this state and make the
situation visible to upper layers.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/hypervisor/domain_job.c
src/hypervisor/domain_job.h
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_process.c

index ff4e008cb5f04f4bcba79ee79ed21f32289cdaaf..49867c39823f06c0d24d0442c64c799bd8090e70 100644 (file)
@@ -93,6 +93,7 @@ virDomainJobStatusToType(virDomainJobStatus status)
     case VIR_DOMAIN_JOB_STATUS_MIGRATING:
     case VIR_DOMAIN_JOB_STATUS_HYPERVISOR_COMPLETED:
     case VIR_DOMAIN_JOB_STATUS_POSTCOPY:
+    case VIR_DOMAIN_JOB_STATUS_POSTCOPY_PAUSED:
     case VIR_DOMAIN_JOB_STATUS_PAUSED:
         return VIR_DOMAIN_JOB_UNBOUNDED;
 
index db8b8b139071af5c8df3f2032bac21b756987267..fce35ffbf5a6bb1d91dd08169f996d93134930c3 100644 (file)
@@ -78,6 +78,7 @@ typedef enum {
     VIR_DOMAIN_JOB_STATUS_HYPERVISOR_COMPLETED,
     VIR_DOMAIN_JOB_STATUS_PAUSED,
     VIR_DOMAIN_JOB_STATUS_POSTCOPY,
+    VIR_DOMAIN_JOB_STATUS_POSTCOPY_PAUSED,
     VIR_DOMAIN_JOB_STATUS_COMPLETED,
     VIR_DOMAIN_JOB_STATUS_FAILED,
     VIR_DOMAIN_JOB_STATUS_CANCELED,
index 3f3289650eb5145fad10750d4330d4eaa2fa28e5..3ac9da37ddcde68e1dba77854f81edc4983c652e 100644 (file)
@@ -12545,6 +12545,7 @@ qemuDomainGetJobInfoMigrationStats(virQEMUDriver *driver,
     case VIR_DOMAIN_JOB_STATUS_HYPERVISOR_COMPLETED:
     case VIR_DOMAIN_JOB_STATUS_POSTCOPY:
     case VIR_DOMAIN_JOB_STATUS_PAUSED:
+    case VIR_DOMAIN_JOB_STATUS_POSTCOPY_PAUSED:
         if (qemuMigrationAnyFetchStats(driver, vm, VIR_ASYNC_JOB_NONE,
                                        jobData, NULL) < 0)
             return -1;
index 07217943363d6fd2431ce01eac32c875119784de..b012c3ede194def3ab924cb6624599cfbe77eda4 100644 (file)
@@ -1747,6 +1747,10 @@ qemuMigrationUpdateJobType(virDomainJobData *jobData)
         jobData->status = VIR_DOMAIN_JOB_STATUS_POSTCOPY;
         break;
 
+    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED:
+        jobData->status = VIR_DOMAIN_JOB_STATUS_POSTCOPY_PAUSED;
+        break;
+
     case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
         jobData->status = VIR_DOMAIN_JOB_STATUS_HYPERVISOR_COMPLETED;
         break;
@@ -1871,6 +1875,12 @@ qemuMigrationJobCheckStatus(virQEMUDriver *driver,
                        qemuMigrationJobName(vm), _("canceled by client"));
         return -1;
 
+    case VIR_DOMAIN_JOB_STATUS_POSTCOPY_PAUSED:
+        virReportError(VIR_ERR_OPERATION_FAILED, _("%s: %s"),
+                       qemuMigrationJobName(vm),
+                       _("post-copy phase failed"));
+        return -1;
+
     case VIR_DOMAIN_JOB_STATUS_COMPLETED:
     case VIR_DOMAIN_JOB_STATUS_ACTIVE:
     case VIR_DOMAIN_JOB_STATUS_MIGRATING:
@@ -1973,6 +1983,7 @@ qemuMigrationAnyCompleted(virQEMUDriver *driver,
 
     case VIR_DOMAIN_JOB_STATUS_FAILED:
     case VIR_DOMAIN_JOB_STATUS_CANCELED:
+    case VIR_DOMAIN_JOB_STATUS_POSTCOPY_PAUSED:
         /* QEMU aborted the migration. */
         return -1;
 
index 2cfe9dbb001d0a4e5122bd5a98d25623feefdf1a..8d0f54e4a0cd1e342d849c22fc822d9557fbbadb 100644 (file)
@@ -149,6 +149,7 @@ VIR_ENUM_IMPL(qemuMonitorMigrationStatus,
               "inactive", "setup",
               "active", "pre-switchover",
               "device", "postcopy-active",
+              "postcopy-paused",
               "completed", "failed",
               "cancelling", "cancelled",
               "wait-unplug",
index be341d5196329896a32f80c433d28cd0f009c201..90532962fe5987b4212d2ca50d06f24b8cc5487c 100644 (file)
@@ -795,6 +795,7 @@ typedef enum {
     QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER,
     QEMU_MONITOR_MIGRATION_STATUS_DEVICE,
     QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY,
+    QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED,
     QEMU_MONITOR_MIGRATION_STATUS_COMPLETED,
     QEMU_MONITOR_MIGRATION_STATUS_ERROR,
     QEMU_MONITOR_MIGRATION_STATUS_CANCELLING,
index dc05dfd047202c9ca01abf09a3e8a5dc58903fb1..ffff9e710375f92f912374eda3de5ed198dbe05d 100644 (file)
@@ -3242,6 +3242,7 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValue *reply,
 
     case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE:
     case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY:
+    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED:
     case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
     case QEMU_MONITOR_MIGRATION_STATUS_CANCELLING:
     case QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER:
index f1264909dec133a91c4a1ba852b204b5b6e128f8..6acf5c7881ac193f05aca488d3287a31cfc4a487 100644 (file)
@@ -1513,6 +1513,17 @@ qemuProcessHandleMigrationStatus(qemuMonitor *mon G_GNUC_UNUSED,
         }
         break;
 
+    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED:
+        if (priv->job.asyncJob == VIR_ASYNC_JOB_MIGRATION_OUT &&
+            state == VIR_DOMAIN_PAUSED) {
+            /* At this point no thread is watching the migration progress on
+             * the source as it is just waiting for the Finish phase to end.
+             * Thus we need to handle the event here. */
+            qemuMigrationSrcPostcopyFailed(vm);
+            qemuDomainSaveStatus(vm);
+        }
+        break;
+
     case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
     case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
     case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE: