提交 81b2a2c7 编写于 作者: J Jiri Denemark

qemu: Refactor qemuProcessRecoverMigration

Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
上级 f6ea8a9f
...@@ -3134,113 +3134,122 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, virDomainObjPtr vm) ...@@ -3134,113 +3134,122 @@ 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 ATTRIBUTE_UNUSED)
int reason)
{ {
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: case QEMU_MIGRATION_PHASE_BEGIN3:
case QEMU_MIGRATION_PHASE_BEGIN3: case QEMU_MIGRATION_PHASE_PERFORM3:
case QEMU_MIGRATION_PHASE_PERFORM3: case QEMU_MIGRATION_PHASE_PERFORM3_DONE:
case QEMU_MIGRATION_PHASE_PERFORM3_DONE: 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:
VIR_DEBUG("Killing unfinished incoming migration for domain %s",
vm->def->name);
return -1;
case QEMU_MIGRATION_PHASE_PREPARE: case QEMU_MIGRATION_PHASE_FINISH2:
VIR_DEBUG("Killing unfinished incoming migration for domain %s", /* source domain is already killed so let's just resume the domain
vm->def->name); * and hope we are all set */
VIR_DEBUG("Incoming migration finished, resuming domain %s",
vm->def->name);
if (qemuProcessStartCPUs(driver, vm, conn,
VIR_DOMAIN_RUNNING_UNPAUSED,
QEMU_ASYNC_JOB_NONE) < 0) {
VIR_WARN("Could not resume domain %s", vm->def->name);
}
break;
case QEMU_MIGRATION_PHASE_FINISH3:
/* migration finished, we started resuming the domain but didn't
* confirm success or failure yet; killing it seems safest unless
* we already started guest CPUs */
if (state != VIR_DOMAIN_RUNNING) {
VIR_DEBUG("Killing migrated domain %s", vm->def->name);
return -1; return -1;
}
break;
}
case QEMU_MIGRATION_PHASE_FINISH2: return 0;
/* source domain is already killed so let's just resume the domain }
* and hope we are all set */
VIR_DEBUG("Incoming migration finished, resuming domain %s",
vm->def->name);
if (qemuProcessStartCPUs(driver, vm, conn,
VIR_DOMAIN_RUNNING_UNPAUSED,
QEMU_ASYNC_JOB_NONE) < 0) {
VIR_WARN("Could not resume domain %s", vm->def->name);
}
break;
case QEMU_MIGRATION_PHASE_FINISH3: static int
/* migration finished, we started resuming the domain but didn't qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver,
* confirm success or failure yet; killing it seems safest unless virDomainObjPtr vm,
* we already started guest CPUs */ virConnectPtr conn,
if (state != VIR_DOMAIN_RUNNING) { qemuMigrationJobPhase phase,
VIR_DEBUG("Killing migrated domain %s", vm->def->name); virDomainState state,
return -1; int reason)
} {
break; 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 happened so far, just forget we were about to migrate the
* domain */
break;
case QEMU_MIGRATION_PHASE_PERFORM2:
case QEMU_MIGRATION_PHASE_PERFORM3:
/* migration is still in progress, let's cancel it and resume the
* domain */
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);
} }
} else if (job == QEMU_ASYNC_JOB_MIGRATION_OUT) { goto resume;
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:
break;
case QEMU_MIGRATION_PHASE_BEGIN3: case QEMU_MIGRATION_PHASE_PERFORM3_DONE:
/* nothing happen so far, just forget we were about to migrate the /* migration finished but we didn't have a chance to get the result
* domain */ * of Finish3 step; third party needs to check what to do next
break; */
break;
case QEMU_MIGRATION_PHASE_PERFORM2: case QEMU_MIGRATION_PHASE_CONFIRM3_CANCELLED:
case QEMU_MIGRATION_PHASE_PERFORM3: /* Finish3 failed, we need to resume the domain */
/* migration is still in progress, let's cancel it and resume the VIR_DEBUG("Resuming domain %s after failed migration",
* domain */ vm->def->name);
if (qemuMigrationCancel(driver, vm) < 0) goto resume;
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);
}
}
break;
case QEMU_MIGRATION_PHASE_PERFORM3_DONE: case QEMU_MIGRATION_PHASE_CONFIRM3:
/* migration finished but we didn't have a chance to get the result /* migration completed, we need to kill the domain here */
* of Finish3 step; third party needs to check what to do next return -1;
*/ }
break;
case QEMU_MIGRATION_PHASE_CONFIRM3_CANCELLED: return 0;
/* Finish3 failed, we need to resume the domain */
VIR_DEBUG("Resuming domain %s after failed migration",
vm->def->name);
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);
}
}
break;
case QEMU_MIGRATION_PHASE_CONFIRM3: resume:
/* migration completed, we need to kill the domain here */ /* resume the domain but only if it was paused as a result of
return -1; * 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);
} }
} }
return 0; return 0;
} }
...@@ -3258,9 +3267,14 @@ qemuProcessRecoverJob(virQEMUDriverPtr driver, ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册