qemu: Always restore post-copy migration job on reconnect

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@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Jiri Denemark 2022-11-18 16:19:16 +01:00
parent b09441b1c5
commit bf77578c9c

View File

@ -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;
}