From: Denis V. Lunev <[email protected]> QEMU 10.2 added a postcopy-device migration state between active and postcopy-active. The source stays in it from the moment it has sent the device state until the destination confirms it has loaded it, and the destination is in it while loading. libvirt does not know the state: the MIGRATION event is dropped with a warning and query-migrate fails with
unexpected migration status in postcopy-device so virDomainGetJobInfo and virDomainGetJobStats fail for that whole phase. OpenStack nova polls job stats during a live migration and aborts it on that error. Treat postcopy-device as part of the migrating phase. A failure in it still lets the source resume, which is what QEMU added the state for, so the source keeps waiting for postcopy-active before it reports post-copy. Signed-off-by: Denis V. Lunev <[email protected]> --- src/qemu/qemu_migration.c | 2 ++ src/qemu/qemu_monitor.c | 1 + src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 1 + src/qemu/qemu_process.c | 1 + tests/qemumonitorjsontest.c | 25 +++++++++++++++++++++++++ 6 files changed, 31 insertions(+) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 4a43ab83b0..797f83ca0d 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2004,6 +2004,7 @@ qemuMigrationUpdateJobType(virDomainJobData *jobData) break; case QEMU_MONITOR_MIGRATION_STATUS_DEVICE: + case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE: jobData->status = VIR_DOMAIN_JOB_STATUS_MIGRATING; break; @@ -4895,6 +4896,7 @@ qemuMigrationSrcIsCanceled(virDomainObj *vm) qemuMonitorMigrationStatusTypeToString(status)); return true; + case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP: diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 2c86cd1971..1216681ac5 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -148,6 +148,7 @@ VIR_ENUM_IMPL(qemuMonitorMigrationStatus, "active", "pre-switchover", "device", + "postcopy-device", "postcopy-active", "postcopy-paused", "postcopy-recover", diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index e9b6a25f0c..d69335a27d 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -995,6 +995,7 @@ typedef enum { QEMU_MONITOR_MIGRATION_STATUS_ACTIVE, QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER, QEMU_MONITOR_MIGRATION_STATUS_DEVICE, + QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE, QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY, QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED, QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 8e88dc9442..29c42f7dd5 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -3286,6 +3286,7 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValue *reply, break; case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE: + case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_PAUSED: case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER: diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 57a3ed3720..f99a4c3b37 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1771,6 +1771,7 @@ qemuProcessHandleMigrationStatus(qemuMonitor *mon G_GNUC_UNUSED, case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE: case QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER: case QEMU_MONITOR_MIGRATION_STATUS_DEVICE: + case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE: case QEMU_MONITOR_MIGRATION_STATUS_ERROR: case QEMU_MONITOR_MIGRATION_STATUS_CANCELLING: case QEMU_MONITOR_MIGRATION_STATUS_CANCELLED: diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index a963029c69..a38d63c22c 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1674,6 +1674,19 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationStats(const void *opaque) " \"error-desc\": \"It's broken\"" " }," " \"id\": \"libvirt-14\"" + "}") < 0 || + qemuMonitorTestAddItem(test, "query-migrate", + "{" + " \"return\": {" + " \"status\": \"postcopy-device\"," + " \"total-time\": 52," + " \"ram\": {" + " \"total\": 1611038720," + " \"remaining\": 0," + " \"transferred\": 1611038720" + " }" + " }," + " \"id\": \"libvirt-15\"" "}") < 0) return -1; @@ -1699,6 +1712,18 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationStats(const void *opaque) return -1; } + memset(&stats, 0, sizeof(stats)); + if (qemuMonitorJSONGetMigrationStats(qemuMonitorTestGetMonitor(test), + &stats, NULL) < 0) + return -1; + + if (stats.status != QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_DEVICE || + stats.ram_transferred != 1611038720) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "Invalid postcopy-device migration statistics"); + return -1; + } + return 0; } base-commit: 215fab8ab1d912f6b25e60ab4d2ad59000f2eaff -- 2.53.0
