mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: Split cleanup and error code in qemuMigrationRun
Let cleanup only do things common to both failure and success paths and move error handling code inside the new "error" section. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
f8ede9cc23
commit
c1a643b68f
@ -3662,20 +3662,20 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
if (persist_xml) {
|
if (persist_xml) {
|
||||||
if (!(persistDef = qemuMigrationPrepareDef(driver, persist_xml,
|
if (!(persistDef = qemuMigrationPrepareDef(driver, persist_xml,
|
||||||
NULL, NULL)))
|
NULL, NULL)))
|
||||||
goto cleanup;
|
goto error;
|
||||||
} else {
|
} else {
|
||||||
virDomainDefPtr def = vm->newDef ? vm->newDef : vm->def;
|
virDomainDefPtr def = vm->newDef ? vm->newDef : vm->def;
|
||||||
if (!(persistDef = qemuDomainDefCopy(driver, def,
|
if (!(persistDef = qemuDomainDefCopy(driver, def,
|
||||||
VIR_DOMAIN_XML_SECURE |
|
VIR_DOMAIN_XML_SECURE |
|
||||||
VIR_DOMAIN_XML_MIGRATABLE)))
|
VIR_DOMAIN_XML_MIGRATABLE)))
|
||||||
goto cleanup;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,
|
mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,
|
||||||
cookieFlags | QEMU_MIGRATION_COOKIE_GRAPHICS);
|
cookieFlags | QEMU_MIGRATION_COOKIE_GRAPHICS);
|
||||||
if (!mig)
|
if (!mig)
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
if (qemuDomainMigrateGraphicsRelocate(driver, vm, mig, graphicsuri) < 0)
|
if (qemuDomainMigrateGraphicsRelocate(driver, vm, mig, graphicsuri) < 0)
|
||||||
VIR_WARN("unable to provide data for graphics client relocation");
|
VIR_WARN("unable to provide data for graphics client relocation");
|
||||||
@ -3688,7 +3688,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
if (qemuMigrationAddTLSObjects(driver, vm, cfg, false,
|
if (qemuMigrationAddTLSObjects(driver, vm, cfg, false,
|
||||||
QEMU_ASYNC_JOB_MIGRATION_OUT,
|
QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||||
&tlsAlias, &secAlias, migParams) < 0)
|
&tlsAlias, &secAlias, migParams) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
/* We need to add tls-hostname whenever QEMU itself does not
|
/* We need to add tls-hostname whenever QEMU itself does not
|
||||||
* connect directly to the destination. */
|
* connect directly to the destination. */
|
||||||
@ -3696,17 +3696,17 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
spec->destType == MIGRATION_DEST_FD) {
|
spec->destType == MIGRATION_DEST_FD) {
|
||||||
if (VIR_STRDUP(migParams->migrateTLSHostname,
|
if (VIR_STRDUP(migParams->migrateTLSHostname,
|
||||||
spec->dest.host.name) < 0)
|
spec->dest.host.name) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
} else {
|
} else {
|
||||||
/* Be sure there's nothing from a previous migration */
|
/* Be sure there's nothing from a previous migration */
|
||||||
if (VIR_STRDUP(migParams->migrateTLSHostname, "") < 0)
|
if (VIR_STRDUP(migParams->migrateTLSHostname, "") < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (qemuMigrationSetEmptyTLSParams(driver, vm,
|
if (qemuMigrationSetEmptyTLSParams(driver, vm,
|
||||||
QEMU_ASYNC_JOB_MIGRATION_OUT,
|
QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||||
migParams) < 0)
|
migParams) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (migrate_flags & (QEMU_MONITOR_MIGRATE_NON_SHARED_DISK |
|
if (migrate_flags & (QEMU_MONITOR_MIGRATE_NON_SHARED_DISK |
|
||||||
@ -3720,7 +3720,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
nmigrate_disks,
|
nmigrate_disks,
|
||||||
migrate_disks,
|
migrate_disks,
|
||||||
dconn) < 0) {
|
dconn) < 0) {
|
||||||
goto cleanup;
|
goto error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Destination doesn't support NBD server.
|
/* Destination doesn't support NBD server.
|
||||||
@ -3734,37 +3734,37 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
if (!(flags & VIR_MIGRATE_LIVE) &&
|
if (!(flags & VIR_MIGRATE_LIVE) &&
|
||||||
virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
|
virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
|
||||||
if (qemuMigrationSetOffline(driver, vm) < 0)
|
if (qemuMigrationSetOffline(driver, vm) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuMigrationSetCompression(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
|
if (qemuMigrationSetCompression(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||||
compression, migParams) < 0)
|
compression, migParams) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
if (qemuMigrationSetOption(driver, vm,
|
if (qemuMigrationSetOption(driver, vm,
|
||||||
QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
|
QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
|
||||||
flags & VIR_MIGRATE_AUTO_CONVERGE,
|
flags & VIR_MIGRATE_AUTO_CONVERGE,
|
||||||
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
if (qemuMigrationSetOption(driver, vm,
|
if (qemuMigrationSetOption(driver, vm,
|
||||||
QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
|
QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
|
||||||
flags & VIR_MIGRATE_RDMA_PIN_ALL,
|
flags & VIR_MIGRATE_RDMA_PIN_ALL,
|
||||||
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
if (qemuMigrationSetPostCopy(driver, vm,
|
if (qemuMigrationSetPostCopy(driver, vm,
|
||||||
flags & VIR_MIGRATE_POSTCOPY,
|
flags & VIR_MIGRATE_POSTCOPY,
|
||||||
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
if (qemuMigrationSetParams(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
|
if (qemuMigrationSetParams(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||||
migParams) < 0)
|
migParams) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
if (qemuDomainObjEnterMonitorAsync(driver, vm,
|
if (qemuDomainObjEnterMonitorAsync(driver, vm,
|
||||||
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
if (priv->job.abortJob) {
|
if (priv->job.abortJob) {
|
||||||
/* explicitly do this *after* we entered the monitor,
|
/* explicitly do this *after* we entered the monitor,
|
||||||
@ -3775,7 +3775,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
|
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
|
||||||
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
|
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
|
||||||
_("canceled by client"));
|
_("canceled by client"));
|
||||||
goto cleanup;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuMonitorSetMigrationSpeed(priv->mon, migrate_speed) < 0)
|
if (qemuMonitorSetMigrationSpeed(priv->mon, migrate_speed) < 0)
|
||||||
@ -3822,7 +3822,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto cleanup;
|
goto error;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
/* From this point onwards we *must* call cancel to abort the
|
/* From this point onwards we *must* call cancel to abort the
|
||||||
@ -3851,7 +3851,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
if (rc == -2)
|
if (rc == -2)
|
||||||
goto cancel;
|
goto cancel;
|
||||||
else if (rc == -1)
|
else if (rc == -1)
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY)
|
if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY)
|
||||||
inPostCopy = true;
|
inPostCopy = true;
|
||||||
@ -3906,28 +3906,10 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (ret < 0 && !orig_err)
|
|
||||||
orig_err = virSaveLastError();
|
|
||||||
|
|
||||||
/* cancel any outstanding NBD jobs */
|
|
||||||
if (ret < 0 && mig && mig->nbd)
|
|
||||||
qemuMigrationCancelDriveMirror(driver, vm, false,
|
|
||||||
QEMU_ASYNC_JOB_MIGRATION_OUT,
|
|
||||||
dconn);
|
|
||||||
|
|
||||||
VIR_FREE(tlsAlias);
|
VIR_FREE(tlsAlias);
|
||||||
VIR_FREE(secAlias);
|
VIR_FREE(secAlias);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
|
|
||||||
if (ret < 0 && iothread)
|
|
||||||
qemuMigrationStopTunnel(iothread, true);
|
|
||||||
|
|
||||||
VIR_FORCE_CLOSE(fd);
|
VIR_FORCE_CLOSE(fd);
|
||||||
|
|
||||||
if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE ||
|
|
||||||
priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_MIGRATING)
|
|
||||||
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
|
|
||||||
|
|
||||||
virDomainDefFree(persistDef);
|
virDomainDefFree(persistDef);
|
||||||
qemuMigrationCookieFree(mig);
|
qemuMigrationCookieFree(mig);
|
||||||
|
|
||||||
@ -3941,9 +3923,28 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (!orig_err)
|
||||||
|
orig_err = virSaveLastError();
|
||||||
|
|
||||||
|
/* cancel any outstanding NBD jobs */
|
||||||
|
if (mig && mig->nbd)
|
||||||
|
qemuMigrationCancelDriveMirror(driver, vm, false,
|
||||||
|
QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||||
|
dconn);
|
||||||
|
|
||||||
|
if (iothread)
|
||||||
|
qemuMigrationStopTunnel(iothread, true);
|
||||||
|
|
||||||
|
if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE ||
|
||||||
|
priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_MIGRATING)
|
||||||
|
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
|
||||||
|
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
exit_monitor:
|
exit_monitor:
|
||||||
ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
cancel:
|
cancel:
|
||||||
orig_err = virSaveLastError();
|
orig_err = virSaveLastError();
|
||||||
@ -3955,14 +3956,14 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
goto cleanup;
|
goto error;
|
||||||
|
|
||||||
cancelPostCopy:
|
cancelPostCopy:
|
||||||
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
|
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
|
||||||
if (inPostCopy)
|
if (inPostCopy)
|
||||||
goto cancel;
|
goto cancel;
|
||||||
else
|
else
|
||||||
goto cleanup;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform migration using QEMU's native migrate support,
|
/* Perform migration using QEMU's native migrate support,
|
||||||
|
Loading…
Reference in New Issue
Block a user