qemu: Call qemuDomainCleanupAdd from qemuMigrationJobContinue

Every single call to qemuMigrationJobContinue needs to register a
cleanup callback in case the migrating domain dies between phases or
when migration is paused due to a failure in postcopy mode.

Let's integrate registering the callback in qemuMigrationJobContinue to
make sure the current thread does not release a migration job without
setting a cleanup callback.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Jiri Denemark 2022-05-10 15:20:25 +02:00
parent 21469f6076
commit 56348173fa

View File

@ -183,8 +183,10 @@ qemuMigrationJobStartPhase(virDomainObj *vm,
static void ATTRIBUTE_NONNULL(1) static void ATTRIBUTE_NONNULL(1)
qemuMigrationJobContinue(virDomainObj *vm) qemuMigrationJobContinue(virDomainObj *vm,
qemuDomainCleanupCallback cleanup)
{ {
qemuDomainCleanupAdd(vm, cleanup);
qemuDomainObjReleaseAsyncJob(vm); qemuDomainObjReleaseAsyncJob(vm);
} }
@ -2388,8 +2390,7 @@ qemuMigrationAnyConnectionClosed(virDomainObj *vm,
qemuMigrationSrcPostcopyFailed(vm); qemuMigrationSrcPostcopyFailed(vm);
else else
qemuMigrationDstPostcopyFailed(vm); qemuMigrationDstPostcopyFailed(vm);
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob); qemuMigrationJobContinue(vm, qemuProcessCleanupMigrationJob);
qemuMigrationJobContinue(vm);
} else { } else {
qemuMigrationParamsReset(driver, vm, priv->job.asyncJob, qemuMigrationParamsReset(driver, vm, priv->job.asyncJob,
jobPriv->migParams, priv->job.apiFlags); jobPriv->migParams, priv->job.apiFlags);
@ -2826,8 +2827,7 @@ qemuMigrationSrcBeginResumePhase(virConnectPtr conn,
if (!xml) if (!xml)
ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED)); ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob); qemuMigrationJobContinue(vm, qemuProcessCleanupMigrationJob);
qemuMigrationJobContinue(vm);
return g_steal_pointer(&xml); return g_steal_pointer(&xml);
} }
@ -2902,8 +2902,6 @@ qemuMigrationSrcBegin(virConnectPtr conn,
if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn, if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
qemuMigrationAnyConnectionClosed) < 0) qemuMigrationAnyConnectionClosed) < 0)
goto endjob; goto endjob;
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob);
} }
ret = g_steal_pointer(&xml); ret = g_steal_pointer(&xml);
@ -2911,7 +2909,7 @@ qemuMigrationSrcBegin(virConnectPtr conn,
endjob: endjob:
if (flags & VIR_MIGRATE_CHANGE_PROTECTION) { if (flags & VIR_MIGRATE_CHANGE_PROTECTION) {
if (ret) if (ret)
qemuMigrationJobContinue(vm); qemuMigrationJobContinue(vm, qemuProcessCleanupMigrationJob);
else else
qemuMigrationJobFinish(vm); qemuMigrationJobFinish(vm);
} else { } else {
@ -3440,13 +3438,11 @@ qemuMigrationDstPrepareFresh(virQEMUDriver *driver,
VIR_WARN("Unable to encode migration cookie"); VIR_WARN("Unable to encode migration cookie");
} }
qemuDomainCleanupAdd(vm, qemuMigrationDstPrepareCleanup);
/* We keep the job active across API calls until the finish() call. /* We keep the job active across API calls until the finish() call.
* This prevents any other APIs being invoked while incoming * This prevents any other APIs being invoked while incoming
* migration is taking place. * migration is taking place.
*/ */
qemuMigrationJobContinue(vm); qemuMigrationJobContinue(vm, qemuMigrationDstPrepareCleanup);
if (autoPort) if (autoPort)
priv->migrationPort = port; priv->migrationPort = port;
@ -3569,8 +3565,7 @@ qemuMigrationDstPrepareResume(virQEMUDriver *driver,
VIR_FREE(priv->origname); VIR_FREE(priv->origname);
ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED)); ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
} }
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob); qemuMigrationJobContinue(vm, qemuProcessCleanupMigrationJob);
qemuMigrationJobContinue(vm);
virDomainObjEndAPI(&vm); virDomainObjEndAPI(&vm);
return ret; return ret;
} }
@ -4099,8 +4094,7 @@ qemuMigrationSrcConfirm(virQEMUDriver *driver,
if (virDomainObjIsFailedPostcopy(vm)) { if (virDomainObjIsFailedPostcopy(vm)) {
ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED)); ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob); qemuMigrationJobContinue(vm, qemuProcessCleanupMigrationJob);
qemuMigrationJobContinue(vm);
} else { } else {
qemuMigrationJobFinish(vm); qemuMigrationJobFinish(vm);
} }
@ -6007,8 +6001,7 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver,
if (virDomainObjIsFailedPostcopy(vm)) { if (virDomainObjIsFailedPostcopy(vm)) {
ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED)); ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob); qemuMigrationJobContinue(vm, qemuProcessCleanupMigrationJob);
qemuMigrationJobContinue(vm);
} else { } else {
/* v2 proto has no confirm phase so we need to reset migration parameters /* v2 proto has no confirm phase so we need to reset migration parameters
* here * here
@ -6076,8 +6069,7 @@ qemuMigrationSrcPerformResume(virQEMUDriver *driver,
if (ret < 0) if (ret < 0)
ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED)); ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob); qemuMigrationJobContinue(vm, qemuProcessCleanupMigrationJob);
qemuMigrationJobContinue(vm);
return ret; return ret;
} }
@ -6150,8 +6142,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriver *driver,
} else { } else {
if (ret < 0) if (ret < 0)
ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED)); ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob); qemuMigrationJobContinue(vm, qemuProcessCleanupMigrationJob);
qemuMigrationJobContinue(vm);
} }
if (!virDomainObjIsActive(vm)) if (!virDomainObjIsActive(vm))
@ -6680,7 +6671,6 @@ qemuMigrationDstFinishActive(virQEMUDriver *driver,
if (virDomainObjIsFailedPostcopy(vm)) { if (virDomainObjIsFailedPostcopy(vm)) {
ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED)); ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
qemuProcessAutoDestroyRemove(driver, vm); qemuProcessAutoDestroyRemove(driver, vm);
qemuDomainCleanupAdd(vm, qemuProcessCleanupMigrationJob);
*finishJob = false; *finishJob = false;
} else { } else {
qemuMigrationParamsReset(driver, vm, VIR_ASYNC_JOB_MIGRATION_IN, qemuMigrationParamsReset(driver, vm, VIR_ASYNC_JOB_MIGRATION_IN,
@ -6774,7 +6764,7 @@ qemuMigrationDstFinish(virQEMUDriver *driver,
if (finishJob) if (finishJob)
qemuMigrationJobFinish(vm); qemuMigrationJobFinish(vm);
else else
qemuMigrationJobContinue(vm); qemuMigrationJobContinue(vm, qemuProcessCleanupMigrationJob);
} }
cleanup: cleanup: