Non-postcopy case talks to QEMU monitor and thus needs to create a
nested job. Since qemuMigrationAnyConnectionClosed is called in case
there's no thread processing a migration API, we need to make the
current thread a temporary owner of the migration job to avoid "This
thread doesn't seem to be the async job owner: 0". This is done by
starting a migration phase.
While no monitor interaction happens in postcopy case and just setting
the phase (to indicate a broken postcopy migration) would be enough,
being consistent and setting the owner does not hurt anything.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
Reviewed-by: Peter Krempa <pkrempa(a)redhat.com>
Reviewed-by: Pavel Hrdina <phrdina(a)redhat.com>
---
Notes:
Version 2:
- no change
src/qemu/qemu_migration.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 1396c1d9b4..616f812ef1 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2317,6 +2317,7 @@ qemuMigrationAnyConnectionClosed(virDomainObj *vm,
virQEMUDriver *driver = priv->driver;
qemuDomainJobPrivate *jobPriv = priv->job.privateData;
bool postcopy = false;
+ int phase;
VIR_DEBUG("vm=%s, conn=%p, asyncJob=%s, phase=%s",
vm->def->name, conn,
@@ -2376,12 +2377,17 @@ qemuMigrationAnyConnectionClosed(virDomainObj *vm,
return;
}
+ if (postcopy)
+ phase = QEMU_MIGRATION_PHASE_POSTCOPY_FAILED;
+ else
+ phase = QEMU_MIGRATION_PHASE_CONFIRM3_CANCELLED;
+ ignore_value(qemuMigrationJobStartPhase(vm, phase));
+
if (postcopy) {
if (priv->job.asyncJob == VIR_ASYNC_JOB_MIGRATION_OUT)
qemuMigrationSrcPostcopyFailed(vm);
else
qemuMigrationDstPostcopyFailed(vm);
- ignore_value(qemuMigrationJobSetPhase(vm,
QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob);
qemuMigrationJobContinue(vm);
} else {
--
2.35.1