[libvirt] [PATCHv2 10/14] Exit early after domain crash in monitor on migration
John Ferlan
jferlan at redhat.com
Tue Jan 13 00:44:08 UTC 2015
<no commit message>
On 01/07/2015 10:42 AM, Ján Tomko wrote:
> ---
> src/qemu/qemu_migration.c | 41 ++++++++++++++++++++++++++---------------
> 1 file changed, 26 insertions(+), 15 deletions(-)
>
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 77e0b35..31494c8 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -1663,7 +1663,8 @@ qemuMigrationStartNBDServer(virQEMUDriverPtr driver,
> qemuDomainObjExitMonitor(driver, vm);
Missing the error check here (yes, it's in 11/14)
> goto cleanup;
> }
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + goto cleanup;
> }
>
> priv->nbdPort = port;
> @@ -1860,7 +1861,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
> }
>
>
> -static void
> +static int
> qemuMigrationStopNBDServer(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> qemuMigrationCookiePtr mig)
> @@ -1868,22 +1869,23 @@ qemuMigrationStopNBDServer(virQEMUDriverPtr driver,
> qemuDomainObjPrivatePtr priv = vm->privateData;
>
> if (!mig->nbd)
> - return;
> + return 0;
>
> if (qemuDomainObjEnterMonitorAsync(driver, vm,
> QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
> - return;
> + return -1;
>
> if (qemuMonitorNBDServerStop(priv->mon) < 0)
> VIR_WARN("Unable to stop NBD server");
>
> - qemuDomainObjExitMonitor(driver, vm);
> -
Why not ret = qemuDomainObjExitMonitor(), then return ret later on...
Holding the lock while virPortAllocatorRelease executes seems unnecessary...
> virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort);
> priv->nbdPort = 0;
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + return -1;
> + return 0;
> }
>
> -static void
> +static int
> qemuMigrationCancelDriveMirror(qemuMigrationCookiePtr mig,
> virQEMUDriverPtr driver,
> virDomainObjPtr vm)
> @@ -1891,6 +1893,7 @@ qemuMigrationCancelDriveMirror(qemuMigrationCookiePtr mig,
> qemuDomainObjPrivatePtr priv = vm->privateData;
> size_t i;
> char *diskAlias = NULL;
> + int ret = 0;
>
> VIR_DEBUG("mig=%p nbdPort=%d", mig->nbd, priv->nbdPort);
>
> @@ -1914,12 +1917,15 @@ qemuMigrationCancelDriveMirror(qemuMigrationCookiePtr mig,
> if (qemuMonitorBlockJob(priv->mon, diskAlias, NULL, NULL, 0,
> BLOCK_JOB_ABORT, true) < 0)
> VIR_WARN("Unable to stop block job on %s", diskAlias);
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0) {
> + ret = -1;
> + goto cleanup;
> + }
> }
>
> cleanup:
> VIR_FREE(diskAlias);
> - return;
> + return ret;
> }
>
> /* Validate whether the domain is safe to migrate. If vm is NULL,
> @@ -2125,7 +2131,8 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
> state);
>
> cleanup:
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
or ret = qemuDomainObjExitMonitor();
return ret;
(your choice here and the next few)
The rest seems OK... Might be nice to mention in a commit message why
failure to cancel drive mirror is ignorable while failure to stop nbd
server is not.
ACK, but it might be nice to pull in part of 11/14 since you're changing
ExitMonitor checks anyway
John
> return ret;
> }
>
> @@ -2164,7 +2171,8 @@ qemuMigrationSetAutoConverge(virQEMUDriverPtr driver,
> state);
>
> cleanup:
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
> return ret;
> }
>
> @@ -2210,7 +2218,8 @@ qemuMigrationSetPinAll(virQEMUDriverPtr driver,
> state);
>
> cleanup:
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
> return ret;
> }
>
> @@ -2476,7 +2485,8 @@ qemuDomainMigrateGraphicsRelocate(virQEMUDriverPtr driver,
> QEMU_ASYNC_JOB_MIGRATION_OUT) == 0) {
> ret = qemuMonitorGraphicsRelocate(priv->mon, type, listenAddress,
> port, tlsPort, tlsSubject);
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
> }
>
> cleanup:
> @@ -4000,7 +4010,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>
> /* cancel any outstanding NBD jobs */
> if (mig)
> - qemuMigrationCancelDriveMirror(mig, driver, vm);
> + ignore_value(qemuMigrationCancelDriveMirror(mig, driver, vm));
>
> if (spec->fwdType != MIGRATION_FWD_DIRECT) {
> if (iothread && qemuMigrationStopTunnel(iothread, ret < 0) < 0)
> @@ -5142,7 +5152,8 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
> VIR_WARN("unable to provide network data for relocation");
> }
>
> - qemuMigrationStopNBDServer(driver, vm, mig);
> + if (qemuMigrationStopNBDServer(driver, vm, mig) < 0)
> + goto endjob;
>
> if (flags & VIR_MIGRATE_PERSIST_DEST) {
> virDomainDefPtr vmdef;
>
More information about the libvir-list
mailing list