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 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;