mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-09 05:01:28 +00:00
qemu: Implement VIR_MIGRATE_POSTCOPY_RESUME for peer-to-peer migration
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
56348173fa
commit
9189301fe5
@ -2726,7 +2726,7 @@ qemuMigrationAnyCanResume(virDomainObj *vm,
|
|||||||
*/
|
*/
|
||||||
if (job == VIR_ASYNC_JOB_MIGRATION_OUT &&
|
if (job == VIR_ASYNC_JOB_MIGRATION_OUT &&
|
||||||
expectedPhase < QEMU_MIGRATION_PHASE_PERFORM_RESUME &&
|
expectedPhase < QEMU_MIGRATION_PHASE_PERFORM_RESUME &&
|
||||||
!(flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
|
!(flags & (VIR_MIGRATE_CHANGE_PROTECTION | VIR_MIGRATE_PEER2PEER))) {
|
||||||
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
||||||
_("resuming failed post-copy migration requires change protection"));
|
_("resuming failed post-copy migration requires change protection"));
|
||||||
return false;
|
return false;
|
||||||
@ -5438,9 +5438,14 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriver *driver,
|
|||||||
* bit here, because we are already running inside the context of
|
* bit here, because we are already running inside the context of
|
||||||
* a single job. */
|
* a single job. */
|
||||||
|
|
||||||
|
if (flags & VIR_MIGRATE_POSTCOPY_RESUME) {
|
||||||
|
dom_xml = qemuMigrationSrcBeginResume(driver, vm, xmlin,
|
||||||
|
&cookieout, &cookieoutlen, flags);
|
||||||
|
} else {
|
||||||
dom_xml = qemuMigrationSrcBeginPhase(driver, vm, xmlin, dname,
|
dom_xml = qemuMigrationSrcBeginPhase(driver, vm, xmlin, dname,
|
||||||
&cookieout, &cookieoutlen,
|
&cookieout, &cookieoutlen,
|
||||||
nmigrate_disks, migrate_disks, flags);
|
nmigrate_disks, migrate_disks, flags);
|
||||||
|
}
|
||||||
if (!dom_xml)
|
if (!dom_xml)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -5496,7 +5501,8 @@ qemuMigrationSrcPerformPeer2Peer3(virQEMUDriver *driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED)
|
if (!(flags & VIR_MIGRATE_POSTCOPY_RESUME) &&
|
||||||
|
virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED)
|
||||||
flags |= VIR_MIGRATE_PAUSED;
|
flags |= VIR_MIGRATE_PAUSED;
|
||||||
|
|
||||||
destflags = flags & ~(VIR_MIGRATE_ABORT_ON_ERROR |
|
destflags = flags & ~(VIR_MIGRATE_ABORT_ON_ERROR |
|
||||||
@ -5945,6 +5951,18 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver,
|
|||||||
qemuDomainObjPrivate *priv = vm->privateData;
|
qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
qemuDomainJobPrivate *jobPriv = priv->job.privateData;
|
qemuDomainJobPrivate *jobPriv = priv->job.privateData;
|
||||||
|
|
||||||
|
if (flags & VIR_MIGRATE_POSTCOPY_RESUME) {
|
||||||
|
if (!qemuMigrationAnyCanResume(vm, VIR_ASYNC_JOB_MIGRATION_OUT, flags,
|
||||||
|
QEMU_MIGRATION_PHASE_POSTCOPY_FAILED))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (qemuMigrationJobStartPhase(vm, QEMU_MIGRATION_PHASE_BEGIN_RESUME) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
virCloseCallbacksUnset(driver->closeCallbacks, vm,
|
||||||
|
qemuMigrationAnyConnectionClosed);
|
||||||
|
qemuDomainCleanupRemove(vm, qemuProcessCleanupMigrationJob);
|
||||||
|
} else {
|
||||||
if (qemuMigrationJobStart(driver, vm, VIR_ASYNC_JOB_MIGRATION_OUT,
|
if (qemuMigrationJobStart(driver, vm, VIR_ASYNC_JOB_MIGRATION_OUT,
|
||||||
flags) < 0)
|
flags) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -5961,6 +5979,7 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
qemuMigrationSrcStoreDomainState(vm);
|
qemuMigrationSrcStoreDomainState(vm);
|
||||||
|
}
|
||||||
|
|
||||||
if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
|
if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
|
||||||
ret = qemuMigrationSrcPerformPeer2Peer(driver, conn, vm, xmlin, persist_xml,
|
ret = qemuMigrationSrcPerformPeer2Peer(driver, conn, vm, xmlin, persist_xml,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user