qemu: Refactor qemuMigrationFinish
To get rid of a giant if-else block which is very easy to get lost in. Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
eb084a733b
commit
b2334e433a
@ -5793,6 +5793,8 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||
unsigned short port;
|
||||
unsigned long long timeReceived = 0;
|
||||
virObjectEventPtr event;
|
||||
|
||||
VIR_DEBUG("driver=%p, dconn=%p, vm=%p, cookiein=%s, cookieinlen=%d, "
|
||||
"cookieout=%p, cookieoutlen=%p, flags=%lx, retcode=%d",
|
||||
@ -5807,6 +5809,8 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ignore_value(virTimeMillisNow(&timeReceived));
|
||||
|
||||
qemuMigrationJobStartPhase(driver, vm,
|
||||
v3proto ? QEMU_MIGRATION_PHASE_FINISH3
|
||||
: QEMU_MIGRATION_PHASE_FINISH2);
|
||||
@ -5824,19 +5828,24 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
|
||||
cookieinlen, cookie_flags)))
|
||||
goto endjob;
|
||||
|
||||
/* Did the migration go as planned? If yes, return the domain
|
||||
* object, but if no, clean up the empty qemu process.
|
||||
*/
|
||||
if (flags & VIR_MIGRATE_OFFLINE) {
|
||||
if (retcode != 0 ||
|
||||
qemuMigrationPersist(driver, vm, mig, false) < 0)
|
||||
goto endjob;
|
||||
|
||||
if (retcode == 0 &&
|
||||
qemuMigrationPersist(driver, vm, mig, false) == 0)
|
||||
dom = virGetDomain(dconn, vm->def->name, vm->def->uuid);
|
||||
} else if (retcode == 0) {
|
||||
unsigned long long timeReceived = 0;
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
ignore_value(virTimeMillisNow(&timeReceived));
|
||||
if (retcode != 0) {
|
||||
qemuDomainJobInfo info;
|
||||
|
||||
/* Check for a possible error on the monitor in case Finish was called
|
||||
* earlier than monitor EOF handler got a chance to process the error
|
||||
*/
|
||||
qemuMigrationFetchJobStatus(driver, vm,
|
||||
QEMU_ASYNC_JOB_MIGRATION_IN,
|
||||
&info);
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
if (!virDomainObjIsActive(vm)) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
@ -5907,7 +5916,7 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
|
||||
* now.
|
||||
* In v2 protocol, the source is dead, so we leave
|
||||
* target in paused state, in case admin can fix
|
||||
* things up
|
||||
* things up.
|
||||
*/
|
||||
if (v3proto)
|
||||
goto endjob;
|
||||
@ -5930,17 +5939,17 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
|
||||
|
||||
dom = virGetDomain(dconn, vm->def->name, vm->def->uuid);
|
||||
|
||||
qemuDomainEventQueue(driver,
|
||||
virDomainEventLifecycleNewFromObj(vm,
|
||||
event = virDomainEventLifecycleNewFromObj(vm,
|
||||
VIR_DOMAIN_EVENT_RESUMED,
|
||||
VIR_DOMAIN_EVENT_RESUMED_MIGRATED));
|
||||
VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
|
||||
qemuDomainEventQueue(driver, event);
|
||||
|
||||
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
|
||||
virDomainObjSetState(vm, VIR_DOMAIN_PAUSED,
|
||||
VIR_DOMAIN_PAUSED_USER);
|
||||
qemuDomainEventQueue(driver,
|
||||
virDomainEventLifecycleNewFromObj(vm,
|
||||
virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_USER);
|
||||
event = virDomainEventLifecycleNewFromObj(vm,
|
||||
VIR_DOMAIN_EVENT_SUSPENDED,
|
||||
VIR_DOMAIN_EVENT_SUSPENDED_PAUSED));
|
||||
VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
|
||||
qemuDomainEventQueue(driver, event);
|
||||
}
|
||||
|
||||
if (virDomainObjIsActive(vm) &&
|
||||
@ -5949,16 +5958,6 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
|
||||
|
||||
/* Guest is successfully running, so cancel previous auto destroy */
|
||||
qemuProcessAutoDestroyRemove(driver, vm);
|
||||
} else {
|
||||
qemuDomainJobInfo info;
|
||||
|
||||
/* Check for a possible error on the monitor in case Finish was called
|
||||
* earlier than monitor EOF handler got a chance to process the error
|
||||
*/
|
||||
qemuMigrationFetchJobStatus(driver, vm,
|
||||
QEMU_ASYNC_JOB_MIGRATION_IN,
|
||||
&info);
|
||||
}
|
||||
|
||||
endjob:
|
||||
if (!dom &&
|
||||
@ -5967,10 +5966,10 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
|
||||
qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED,
|
||||
VIR_QEMU_PROCESS_STOP_MIGRATED);
|
||||
virDomainAuditStop(vm, "failed");
|
||||
qemuDomainEventQueue(driver,
|
||||
virDomainEventLifecycleNewFromObj(vm,
|
||||
event = virDomainEventLifecycleNewFromObj(vm,
|
||||
VIR_DOMAIN_EVENT_STOPPED,
|
||||
VIR_DOMAIN_EVENT_STOPPED_FAILED));
|
||||
VIR_DOMAIN_EVENT_STOPPED_FAILED);
|
||||
qemuDomainEventQueue(driver, event);
|
||||
}
|
||||
|
||||
if (dom &&
|
||||
|
Loading…
x
Reference in New Issue
Block a user