We need the restored job even in case the migration already finished
even though we will stop it just a few lines below as the functions we
call in between require an existing migration job.
This fixes a crash on reconnect when post-copy migration finished while
the daemon was not running.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_process.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 0769f30d74..e1c18dde90 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3635,11 +3635,14 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
if (rc > 0) {
job->phase = QEMU_MIGRATION_PHASE_POSTCOPY_FAILED;
+ /* Even though we restore the migration async job here, the APIs below
+ * use VIR_ASYNC_JOB_NONE because we're already in a MODIFY job started
+ * before we reconnected to the domain. */
+ qemuProcessRestoreMigrationJob(vm, job);
if (migStatus == VIR_DOMAIN_JOB_STATUS_POSTCOPY) {
VIR_DEBUG("Post-copy migration of domain %s still running, it will be
handled as unattended",
vm->def->name);
- qemuProcessRestoreMigrationJob(vm, job);
return 0;
}
@@ -3648,17 +3651,19 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
qemuMigrationSrcPostcopyFailed(vm);
else
qemuMigrationDstPostcopyFailed(vm);
-
- qemuProcessRestoreMigrationJob(vm, job);
return 0;
}
VIR_DEBUG("Post-copy migration of domain %s already finished",
vm->def->name);
- if (job->asyncJob == VIR_ASYNC_JOB_MIGRATION_OUT)
+ if (job->asyncJob == VIR_ASYNC_JOB_MIGRATION_OUT) {
qemuMigrationSrcComplete(driver, vm, VIR_ASYNC_JOB_NONE);
- else
+ /* No need to stop the restored job as the domain has just been
+ * destroyed. */
+ } else {
qemuMigrationDstComplete(driver, vm, true, VIR_ASYNC_JOB_NONE, job);
+ virDomainObjEndAsyncJob(vm);
+ }
return 0;
}
--
2.38.1