]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Add support for postcopy-recover QEMU 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)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
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 b012c3ede194def3ab924cb6624599cfbe77eda4..4e95c2655c55bb92f417b9c876cb334c6ccd9d69 100644 (file)
@@ -1744,6 +1744,7 @@ qemuMigrationUpdateJobType(virDomainJobData *jobData)
 
     switch ((qemuMonitorMigrationStatus) priv->stats.mig.status) {
     case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY:
+    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER:
         jobData->status = VIR_DOMAIN_JOB_STATUS_POSTCOPY;
         break;
 
index 8d0f54e4a0cd1e342d849c22fc822d9557fbbadb..ec56d413da2c6f3a47f30abb5c9e8a475f717459 100644 (file)
@@ -149,7 +149,7 @@ VIR_ENUM_IMPL(qemuMonitorMigrationStatus,
               "inactive", "setup",
               "active", "pre-switchover",
               "device", "postcopy-active",
-              "postcopy-paused",
+              "postcopy-paused", "postcopy-recover",
               "completed", "failed",
               "cancelling", "cancelled",
               "wait-unplug",
index 90532962fe5987b4212d2ca50d06f24b8cc5487c..41e8db945ce197be78cb706b87ec1aec8a80c5d9 100644 (file)
@@ -796,6 +796,7 @@ typedef enum {
     QEMU_MONITOR_MIGRATION_STATUS_DEVICE,
     QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY,
     QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED,
+    QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER,
     QEMU_MONITOR_MIGRATION_STATUS_COMPLETED,
     QEMU_MONITOR_MIGRATION_STATUS_ERROR,
     QEMU_MONITOR_MIGRATION_STATUS_CANCELLING,
index ffff9e710375f92f912374eda3de5ed198dbe05d..83d0600a75ea7175ef17c468da5d35fb4ad1156c 100644 (file)
@@ -3243,6 +3243,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_POSTCOPY_RECOVER:
     case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
     case QEMU_MONITOR_MIGRATION_STATUS_CANCELLING:
     case QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER:
index 6acf5c7881ac193f05aca488d3287a31cfc4a487..b039108ff79e5e446a8784dbec13c96b710174bd 100644 (file)
@@ -1524,6 +1524,31 @@ qemuProcessHandleMigrationStatus(qemuMonitor *mon G_GNUC_UNUSED,
         }
         break;
 
+    case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER:
+        if (virDomainObjIsFailedPostcopy(vm)) {
+            int eventType = -1;
+            int eventDetail = -1;
+
+            if (state == VIR_DOMAIN_PAUSED) {
+                reason = VIR_DOMAIN_PAUSED_POSTCOPY;
+                eventType = VIR_DOMAIN_EVENT_SUSPENDED;
+                eventDetail = qemuDomainPausedReasonToSuspendedEvent(reason);
+            } else {
+                reason = VIR_DOMAIN_RUNNING_POSTCOPY;
+                eventType = VIR_DOMAIN_EVENT_RESUMED;
+                eventDetail = qemuDomainRunningReasonToResumeEvent(reason);
+            }
+
+            VIR_DEBUG("Post-copy migration recovered; correcting state for domain '%s' to %s/%s",
+                      vm->def->name,
+                      virDomainStateTypeToString(state),
+                      NULLSTR(virDomainStateReasonToString(state, reason)));
+            virDomainObjSetState(vm, state, reason);
+            event = virDomainEventLifecycleNewFromObj(vm, eventType, eventDetail);
+            qemuDomainSaveStatus(vm);
+        }
+        break;
+
     case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
     case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
     case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE: