]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Add pause-before-switchover migration capability
authorJiri Denemark <jdenemar@redhat.com>
Fri, 20 Oct 2017 08:11:32 +0000 (10:11 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 26 Oct 2017 08:36:02 +0000 (10:36 +0200)
This new capability enables a pause before device state serialization so
that we can finish all block jobs without racing with the end of the
migration. The pause is indicated by "pre-switchover" state. Once we're
done QEMU enters "device" migration state.

This patch just defines the new capability and QEMU migration states and
their mapping to our job states.

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

index c7c9e94dab8df8e713145aec2505a2e3522fa19c..13e77eedcd34d490a7cd5004201d3d555a7c7aa1 100644 (file)
@@ -423,6 +423,7 @@ qemuDomainJobStatusToType(qemuDomainJobStatus status)
     case QEMU_DOMAIN_JOB_STATUS_MIGRATING:
     case QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED:
     case QEMU_DOMAIN_JOB_STATUS_POSTCOPY:
+    case QEMU_DOMAIN_JOB_STATUS_PAUSED:
         return VIR_DOMAIN_JOB_UNBOUNDED;
 
     case QEMU_DOMAIN_JOB_STATUS_COMPLETED:
index 3b4272047a8c186bb3b2b9499f582d6fc316c8c9..ff5328277c879803f87cc903f9c1faefe5671264 100644 (file)
@@ -103,6 +103,7 @@ typedef enum {
     QEMU_DOMAIN_JOB_STATUS_ACTIVE,
     QEMU_DOMAIN_JOB_STATUS_MIGRATING,
     QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED,
+    QEMU_DOMAIN_JOB_STATUS_PAUSED,
     QEMU_DOMAIN_JOB_STATUS_POSTCOPY,
     QEMU_DOMAIN_JOB_STATUS_COMPLETED,
     QEMU_DOMAIN_JOB_STATUS_FAILED,
index 626b4e3eedef86042ac41a9c2d98e905456bdddf..4b356002fb981dab411242d5ec8043a9f3ab86cb 100644 (file)
@@ -1366,6 +1366,14 @@ qemuMigrationUpdateJobType(qemuDomainJobInfoPtr jobInfo)
         jobInfo->status = QEMU_DOMAIN_JOB_STATUS_CANCELED;
         break;
 
+    case QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER:
+        jobInfo->status = QEMU_DOMAIN_JOB_STATUS_PAUSED;
+        break;
+
+    case QEMU_MONITOR_MIGRATION_STATUS_DEVICE:
+        jobInfo->status = QEMU_DOMAIN_JOB_STATUS_MIGRATING;
+        break;
+
     case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
     case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE:
     case QEMU_MONITOR_MIGRATION_STATUS_CANCELLING:
@@ -1459,6 +1467,7 @@ qemuMigrationCheckJobStatus(virQEMUDriverPtr driver,
     case QEMU_DOMAIN_JOB_STATUS_MIGRATING:
     case QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED:
     case QEMU_DOMAIN_JOB_STATUS_POSTCOPY:
+    case QEMU_DOMAIN_JOB_STATUS_PAUSED:
         break;
     }
 
@@ -1474,6 +1483,7 @@ enum qemuMigrationCompletedFlags {
     QEMU_MIGRATION_COMPLETED_ABORT_ON_ERROR = (1 << 0),
     QEMU_MIGRATION_COMPLETED_CHECK_STORAGE  = (1 << 1),
     QEMU_MIGRATION_COMPLETED_POSTCOPY       = (1 << 2),
+    QEMU_MIGRATION_COMPLETED_PRE_SWITCHOVER = (1 << 3),
 };
 
 
@@ -1534,6 +1544,7 @@ qemuMigrationCompleted(virQEMUDriverPtr driver,
     switch (jobInfo->status) {
     case QEMU_DOMAIN_JOB_STATUS_MIGRATING:
     case QEMU_DOMAIN_JOB_STATUS_POSTCOPY:
+    case QEMU_DOMAIN_JOB_STATUS_PAUSED:
         /* The migration was aborted by us rather than QEMU itself. */
         jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
         return -2;
index 5ca3cdce2a8050a83a89b3aca79c11e0ad1e00df..dd9d64a207d1772a9f2b8ac081e33d8497ad41ad 100644 (file)
@@ -172,14 +172,15 @@ VIR_ONCE_GLOBAL_INIT(qemuMonitor)
 VIR_ENUM_IMPL(qemuMonitorMigrationStatus,
               QEMU_MONITOR_MIGRATION_STATUS_LAST,
               "inactive", "setup",
-              "active", "postcopy-active",
+              "active", "pre-switchover",
+              "device", "postcopy-active",
               "completed", "failed",
               "cancelling", "cancelled")
 
 VIR_ENUM_IMPL(qemuMonitorMigrationCaps,
               QEMU_MONITOR_MIGRATION_CAPS_LAST,
               "xbzrle", "auto-converge", "rdma-pin-all", "events",
-              "postcopy-ram", "compress")
+              "postcopy-ram", "compress", "pause-before-switchover")
 
 VIR_ENUM_IMPL(qemuMonitorVMStatus,
               QEMU_MONITOR_VM_STATUS_LAST,
index fe29f484ee6b4420df27522a25056e65b9306b37..bc8494faee46bc1989aea8b2cae960593cb1f129 100644 (file)
@@ -641,6 +641,8 @@ typedef enum {
     QEMU_MONITOR_MIGRATION_STATUS_INACTIVE,
     QEMU_MONITOR_MIGRATION_STATUS_SETUP,
     QEMU_MONITOR_MIGRATION_STATUS_ACTIVE,
+    QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER,
+    QEMU_MONITOR_MIGRATION_STATUS_DEVICE,
     QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY,
     QEMU_MONITOR_MIGRATION_STATUS_COMPLETED,
     QEMU_MONITOR_MIGRATION_STATUS_ERROR,
@@ -706,6 +708,7 @@ typedef enum {
     QEMU_MONITOR_MIGRATION_CAPS_EVENTS,
     QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
     QEMU_MONITOR_MIGRATION_CAPS_COMPRESS,
+    QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER,
 
     QEMU_MONITOR_MIGRATION_CAPS_LAST
 } qemuMonitorMigrationCaps;
index def80882c4dca4ee54991ec1476eb1aea4fc9170..05cc634d202656a227298256ad2c105ac9be2d9a 100644 (file)
@@ -2846,6 +2846,8 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValuePtr reply,
     case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY:
     case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
     case QEMU_MONITOR_MIGRATION_STATUS_CANCELLING:
+    case QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER:
+    case QEMU_MONITOR_MIGRATION_STATUS_DEVICE:
         ram = virJSONValueObjectGetObject(ret, "ram");
         if (!ram) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",