We don't need to call query-migrate every 50ms when we get the current
migration state via MIGRATION event.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
Notes:
ACKed in vesrion 2
Version 3:
- no change
Version 2:
- new patch
src/qemu/qemu_migration.c | 14 ++++++++++++--
src/qemu/qemu_process.c | 31 +++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index d9f1a59..c3c2cac 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2511,7 +2511,11 @@ qemuMigrationCheckJobStatus(virQEMUDriverPtr driver,
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainJobInfoPtr jobInfo = priv->job.current;
- if (qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
+ bool events = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT);
+
+ if (events)
+ qemuMigrationUpdateJobType(jobInfo);
+ else if (qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
return -1;
switch (jobInfo->type) {
@@ -2530,9 +2534,15 @@ qemuMigrationCheckJobStatus(virQEMUDriverPtr driver,
qemuMigrationJobName(vm), _("canceled by client"));
return -1;
+ case VIR_DOMAIN_JOB_COMPLETED:
+ /* Fetch statistics of a completed migration */
+ if (events &&
+ qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
+ return -1;
+ break;
+
case VIR_DOMAIN_JOB_BOUNDED:
case VIR_DOMAIN_JOB_UNBOUNDED:
- case VIR_DOMAIN_JOB_COMPLETED:
case VIR_DOMAIN_JOB_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index ba84182..e703cbd 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1508,6 +1508,36 @@ qemuProcessHandleSpiceMigrated(qemuMonitorPtr mon
ATTRIBUTE_UNUSED,
}
+static int
+qemuProcessHandleMigrationStatus(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
+ virDomainObjPtr vm,
+ int status,
+ void *opaque ATTRIBUTE_UNUSED)
+{
+ qemuDomainObjPrivatePtr priv;
+
+ virObjectLock(vm);
+
+ VIR_DEBUG("Migration of domain %p %s changed state to %s",
+ vm, vm->def->name,
+ qemuMonitorMigrationStatusTypeToString(status));
+
+ priv = vm->privateData;
+ if (priv->job.asyncJob != QEMU_ASYNC_JOB_MIGRATION_OUT &&
+ priv->job.asyncJob != QEMU_ASYNC_JOB_MIGRATION_IN) {
+ VIR_DEBUG("got MIGRATION event without a migration job");
+ goto cleanup;
+ }
+
+ priv->job.current->status.status = status;
+ virDomainObjSignal(vm);
+
+ cleanup:
+ virObjectUnlock(vm);
+ return 0;
+}
+
+
static qemuMonitorCallbacks monitorCallbacks = {
.eofNotify = qemuProcessHandleMonitorEOF,
.errorNotify = qemuProcessHandleMonitorError,
@@ -1532,6 +1562,7 @@ static qemuMonitorCallbacks monitorCallbacks = {
.domainNicRxFilterChanged = qemuProcessHandleNicRxFilterChanged,
.domainSerialChange = qemuProcessHandleSerialChanged,
.domainSpiceMigrated = qemuProcessHandleSpiceMigrated,
+ .domainMigrationStatus = qemuProcessHandleMigrationStatus,
};
static int
--
2.4.3