qemu: Refactor qemuProcessRecoverMigration

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
Jiri Denemark 2016-01-14 15:55:18 +01:00
parent f6ea8a9f19
commit 81b2a2c749

View File

@ -3134,15 +3134,13 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, virDomainObjPtr vm)
}
static int
qemuProcessRecoverMigration(virQEMUDriverPtr driver,
qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virConnectPtr conn,
qemuDomainAsyncJob job,
qemuMigrationJobPhase phase,
virDomainState state,
int reason)
int reason ATTRIBUTE_UNUSED)
{
if (job == QEMU_ASYNC_JOB_MIGRATION_IN) {
switch (phase) {
case QEMU_MIGRATION_PHASE_NONE:
case QEMU_MIGRATION_PHASE_PERFORM2:
@ -3152,6 +3150,7 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
case QEMU_MIGRATION_PHASE_CONFIRM3_CANCELLED:
case QEMU_MIGRATION_PHASE_CONFIRM3:
case QEMU_MIGRATION_PHASE_LAST:
/* N/A for incoming migration */
break;
case QEMU_MIGRATION_PHASE_PREPARE:
@ -3181,17 +3180,29 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
}
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) {
case QEMU_MIGRATION_PHASE_NONE:
case QEMU_MIGRATION_PHASE_PREPARE:
case QEMU_MIGRATION_PHASE_FINISH2:
case QEMU_MIGRATION_PHASE_FINISH3:
case QEMU_MIGRATION_PHASE_LAST:
/* N/A for outgoing migration */
break;
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 */
break;
@ -3199,20 +3210,13 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
case QEMU_MIGRATION_PHASE_PERFORM3:
/* migration is still in progress, let's cancel it and resume the
* domain */
if (qemuMigrationCancel(driver, vm) < 0)
return -1;
/* resume the domain but only if it was paused as a result of
* migration */
if (state == VIR_DOMAIN_PAUSED &&
(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);
VIR_DEBUG("Cancelling unfinished migration of domain %s",
vm->def->name);
if (qemuMigrationCancel(driver, vm) < 0) {
VIR_WARN("Could not cancel ongoing migration of domain %s",
vm->def->name);
}
}
break;
goto resume;
case QEMU_MIGRATION_PHASE_PERFORM3_DONE:
/* 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 */
VIR_DEBUG("Resuming domain %s after failed migration",
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 &&
(reason == VIR_DOMAIN_PAUSED_MIGRATION ||
reason == VIR_DOMAIN_PAUSED_UNKNOWN)) {
@ -3233,14 +3250,6 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
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;
}
@ -3258,9 +3267,14 @@ qemuProcessRecoverJob(virQEMUDriverPtr driver,
switch (job->asyncJob) {
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:
if (qemuProcessRecoverMigration(driver, vm, conn, job->asyncJob,
job->phase, state, reason) < 0)
if (qemuProcessRecoverMigrationIn(driver, vm, conn, job->phase,
state, reason) < 0)
return -1;
break;