mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: Refactor qemuProcessRecoverMigration
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
f6ea8a9f19
commit
81b2a2c749
@ -3134,15 +3134,13 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, virDomainObjPtr vm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuProcessRecoverMigration(virQEMUDriverPtr driver,
|
qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
virConnectPtr conn,
|
virConnectPtr conn,
|
||||||
qemuDomainAsyncJob job,
|
|
||||||
qemuMigrationJobPhase phase,
|
qemuMigrationJobPhase phase,
|
||||||
virDomainState state,
|
virDomainState state,
|
||||||
int reason)
|
int reason ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
if (job == QEMU_ASYNC_JOB_MIGRATION_IN) {
|
|
||||||
switch (phase) {
|
switch (phase) {
|
||||||
case QEMU_MIGRATION_PHASE_NONE:
|
case QEMU_MIGRATION_PHASE_NONE:
|
||||||
case QEMU_MIGRATION_PHASE_PERFORM2:
|
case QEMU_MIGRATION_PHASE_PERFORM2:
|
||||||
@ -3152,6 +3150,7 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
|
|||||||
case QEMU_MIGRATION_PHASE_CONFIRM3_CANCELLED:
|
case QEMU_MIGRATION_PHASE_CONFIRM3_CANCELLED:
|
||||||
case QEMU_MIGRATION_PHASE_CONFIRM3:
|
case QEMU_MIGRATION_PHASE_CONFIRM3:
|
||||||
case QEMU_MIGRATION_PHASE_LAST:
|
case QEMU_MIGRATION_PHASE_LAST:
|
||||||
|
/* N/A for incoming migration */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QEMU_MIGRATION_PHASE_PREPARE:
|
case QEMU_MIGRATION_PHASE_PREPARE:
|
||||||
@ -3181,17 +3180,29 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (job == QEMU_ASYNC_JOB_MIGRATION_OUT) {
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
virConnectPtr conn,
|
||||||
|
qemuMigrationJobPhase phase,
|
||||||
|
virDomainState state,
|
||||||
|
int reason)
|
||||||
|
{
|
||||||
switch (phase) {
|
switch (phase) {
|
||||||
case QEMU_MIGRATION_PHASE_NONE:
|
case QEMU_MIGRATION_PHASE_NONE:
|
||||||
case QEMU_MIGRATION_PHASE_PREPARE:
|
case QEMU_MIGRATION_PHASE_PREPARE:
|
||||||
case QEMU_MIGRATION_PHASE_FINISH2:
|
case QEMU_MIGRATION_PHASE_FINISH2:
|
||||||
case QEMU_MIGRATION_PHASE_FINISH3:
|
case QEMU_MIGRATION_PHASE_FINISH3:
|
||||||
case QEMU_MIGRATION_PHASE_LAST:
|
case QEMU_MIGRATION_PHASE_LAST:
|
||||||
|
/* N/A for outgoing migration */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QEMU_MIGRATION_PHASE_BEGIN3:
|
case QEMU_MIGRATION_PHASE_BEGIN3:
|
||||||
/* nothing happen so far, just forget we were about to migrate the
|
/* nothing happened so far, just forget we were about to migrate the
|
||||||
* domain */
|
* domain */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -3199,20 +3210,13 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
|
|||||||
case QEMU_MIGRATION_PHASE_PERFORM3:
|
case QEMU_MIGRATION_PHASE_PERFORM3:
|
||||||
/* migration is still in progress, let's cancel it and resume the
|
/* migration is still in progress, let's cancel it and resume the
|
||||||
* domain */
|
* domain */
|
||||||
if (qemuMigrationCancel(driver, vm) < 0)
|
VIR_DEBUG("Cancelling unfinished migration of domain %s",
|
||||||
return -1;
|
vm->def->name);
|
||||||
/* resume the domain but only if it was paused as a result of
|
if (qemuMigrationCancel(driver, vm) < 0) {
|
||||||
* migration */
|
VIR_WARN("Could not cancel ongoing migration of domain %s",
|
||||||
if (state == VIR_DOMAIN_PAUSED &&
|
vm->def->name);
|
||||||
(reason == VIR_DOMAIN_PAUSED_MIGRATION ||
|
|
||||||
reason == VIR_DOMAIN_PAUSED_UNKNOWN)) {
|
|
||||||
if (qemuProcessStartCPUs(driver, vm, conn,
|
|
||||||
VIR_DOMAIN_RUNNING_UNPAUSED,
|
|
||||||
QEMU_ASYNC_JOB_NONE) < 0) {
|
|
||||||
VIR_WARN("Could not resume domain %s", vm->def->name);
|
|
||||||
}
|
}
|
||||||
}
|
goto resume;
|
||||||
break;
|
|
||||||
|
|
||||||
case QEMU_MIGRATION_PHASE_PERFORM3_DONE:
|
case QEMU_MIGRATION_PHASE_PERFORM3_DONE:
|
||||||
/* migration finished but we didn't have a chance to get the result
|
/* migration finished but we didn't have a chance to get the result
|
||||||
@ -3224,6 +3228,19 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
|
|||||||
/* Finish3 failed, we need to resume the domain */
|
/* Finish3 failed, we need to resume the domain */
|
||||||
VIR_DEBUG("Resuming domain %s after failed migration",
|
VIR_DEBUG("Resuming domain %s after failed migration",
|
||||||
vm->def->name);
|
vm->def->name);
|
||||||
|
goto resume;
|
||||||
|
|
||||||
|
case QEMU_MIGRATION_PHASE_CONFIRM3:
|
||||||
|
/* migration completed, we need to kill the domain here */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
resume:
|
||||||
|
/* resume the domain but only if it was paused as a result of
|
||||||
|
* migration
|
||||||
|
*/
|
||||||
if (state == VIR_DOMAIN_PAUSED &&
|
if (state == VIR_DOMAIN_PAUSED &&
|
||||||
(reason == VIR_DOMAIN_PAUSED_MIGRATION ||
|
(reason == VIR_DOMAIN_PAUSED_MIGRATION ||
|
||||||
reason == VIR_DOMAIN_PAUSED_UNKNOWN)) {
|
reason == VIR_DOMAIN_PAUSED_UNKNOWN)) {
|
||||||
@ -3233,14 +3250,6 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
|
|||||||
VIR_WARN("Could not resume domain %s", vm->def->name);
|
VIR_WARN("Could not resume domain %s", vm->def->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case QEMU_MIGRATION_PHASE_CONFIRM3:
|
|
||||||
/* migration completed, we need to kill the domain here */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3258,9 +3267,14 @@ qemuProcessRecoverJob(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
switch (job->asyncJob) {
|
switch (job->asyncJob) {
|
||||||
case QEMU_ASYNC_JOB_MIGRATION_OUT:
|
case QEMU_ASYNC_JOB_MIGRATION_OUT:
|
||||||
|
if (qemuProcessRecoverMigrationOut(driver, vm, conn, job->phase,
|
||||||
|
state, reason) < 0)
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
|
||||||
case QEMU_ASYNC_JOB_MIGRATION_IN:
|
case QEMU_ASYNC_JOB_MIGRATION_IN:
|
||||||
if (qemuProcessRecoverMigration(driver, vm, conn, job->asyncJob,
|
if (qemuProcessRecoverMigrationIn(driver, vm, conn, job->phase,
|
||||||
job->phase, state, reason) < 0)
|
state, reason) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user