mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
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:
parent
21469f6076
commit
56348173fa
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user