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(a)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,