[libvirt] [PATCH 10/21] qemu: migration: src: qemu `drive-mirror` to UNIX
John Ferlan
jferlan at redhat.com
Mon Dec 14 15:41:26 UTC 2015
On 11/18/2015 01:13 PM, Pavel Boldin wrote:
> Make qemuMigrationDriveMirror able to instruct QEMU to connect to
> a local UNIX socket used for tunnelling.
>
> Signed-off-by: Pavel Boldin <pboldin at mirantis.com>
> ---
> src/qemu/qemu_migration.c | 45 ++++++++++++++++++++++++++++++---------------
> 1 file changed, 30 insertions(+), 15 deletions(-)
>
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index d587c56..d95cd66 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -2048,7 +2048,8 @@ static int
> qemuMigrationDriveMirror(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> qemuMigrationCookiePtr mig,
> - const char *host,
> + bool dest_host,
> + const char *dest,
You'll need to update comments for function including the parameters
In particular if 'dest_host' is not set, then the expectation is that
the incoming 'dest' contains the unix socket file/tunnel.
FWIW: When I first read it, I thought the change would be to have the
new flag be the new option, not the old way.
Perhaps it'd be clearer to have the calling code check for
MIGRATION_DEST_FD in order to determine that we "could" have this ndb
socket.
However, something that's not quite clear (yet) - as I read it,
pec.nbd_tunnel_unix_socket.file is only generated when doTunnelMigrate
determines 'nmigrate_disks' is true. So if it's not true, but yet some
existing 'destType == MIGRATION_DEST_FD', then because this code has a
check for a NULL 'dest' value, it would seem a failure would occur when
perhaps it didn't previously or wasn't expected if there were no disks
to migrate.
Again, I have limited exposure/knowledge of the overall environment/
setup for migration, but something just doesn't seem right.
It would seem that the code now assumes that nmigrate_disks would be
true when MIGRATION_DEST_FD is set.
> unsigned long speed,
> unsigned int *migrate_flags,
> size_t nmigrate_disks,
> @@ -2057,7 +2058,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
> {
> qemuDomainObjPrivatePtr priv = vm->privateData;
> int ret = -1;
> - int port;
> + int port = -1;
> size_t i;
> char *diskAlias = NULL;
> char *nbd_dest = NULL;
> @@ -2068,16 +2069,20 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
>
> VIR_DEBUG("Starting drive mirrors for domain %s", vm->def->name);
>
> - /* steal NBD port and thus prevent its propagation back to destination */
> - port = mig->nbd->port;
> - mig->nbd->port = 0;
> + virCheckNonNullArgGoto(dest, cleanup);
Hmm.. wouldn't ever expect this to trigger! If 'host' had been NULL,
the strchr() below would have failed miserably.
> +
> + if (dest_host) {
> + /* steal NBD port and thus prevent its propagation back to destination */
> + port = mig->nbd->port;
> + mig->nbd->port = 0;
>
> - /* escape literal IPv6 address */
> - if (strchr(host, ':')) {
> - if (virAsprintf(&hoststr, "[%s]", host) < 0)
> + /* escape literal IPv6 address */
> + if (strchr(dest, ':')) {
> + if (virAsprintf(&hoststr, "[%s]", dest) < 0)
> + goto cleanup;
> + } else if (VIR_STRDUP(hoststr, dest) < 0) {
> goto cleanup;
> - } else if (VIR_STRDUP(hoststr, host) < 0) {
> - goto cleanup;
> + }
> }
>
> if (*migrate_flags & QEMU_MONITOR_MIGRATE_NON_SHARED_INC)
> @@ -2092,11 +2097,18 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
> if (!qemuMigrateDisk(disk, nmigrate_disks, migrate_disks))
> continue;
>
> - if ((virAsprintf(&diskAlias, "%s%s",
> - QEMU_DRIVE_HOST_PREFIX, disk->info.alias) < 0) ||
> - (virAsprintf(&nbd_dest, "nbd:%s:%d:exportname=%s",
> - hoststr, port, diskAlias) < 0))
> + if (virAsprintf(&diskAlias, "%s%s",
> + QEMU_DRIVE_HOST_PREFIX, disk->info.alias) < 0)
> goto cleanup;
> + if (dest_host) {
> + if (virAsprintf(&nbd_dest, "nbd:%s:%d:exportname=%s",
> + hoststr, port, diskAlias) < 0)
> + goto cleanup;
> + } else {
> + if (virAsprintf(&nbd_dest, "nbd:unix:%s:exportname=%s",
> + dest, diskAlias) < 0)
> + goto cleanup;
> + }
>
> if (qemuDomainObjEnterMonitorAsync(driver, vm,
> QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
> @@ -4281,10 +4293,13 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>
> if (migrate_flags & (QEMU_MONITOR_MIGRATE_NON_SHARED_DISK |
> QEMU_MONITOR_MIGRATE_NON_SHARED_INC)) {
> + bool dest_host = spec->destType == MIGRATION_DEST_HOST;
> + const char *dest = dest_host ? spec->dest.host.name :
> + spec->nbd_tunnel_unix_socket.file;
Seems to me that perhaps the bool should be "dest_fd_migrate_disks" and
would be set if (spec->nbd_tunnel_unix_socket.file). It would only be
checked/set if "spec->destType == MIGRATION_DEST_FD"; otherwise, we use
the existing code and no boolean.
IOW: The assumption I see here is that "any" destType !=
MIGRATION_DEST_HOST means it's MIGRATION_DEST_FD, which perhaps isn't
true since I also see a MIGRATION_DEST_CONNECT_HOST and it doesn't
preclude something in the future being added.
John
> if (mig->nbd) {
> /* This will update migrate_flags on success */
> if (qemuMigrationDriveMirror(driver, vm, mig,
> - spec->dest.host.name,
> + dest_host, dest,
> migrate_speed,
> &migrate_flags,
> nmigrate_disks,
>
More information about the libvir-list
mailing list