Re: [libvirt] [PATCH 10/21] qemu: migration: src: qemu `drive-mirror` to UNIX

2015-12-14 Thread John Ferlan


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 
> ---
>  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 ?

[libvirt] [PATCH 10/21] qemu: migration: src: qemu `drive-mirror` to UNIX

2015-11-18 Thread Pavel Boldin
Make qemuMigrationDriveMirror able to instruct QEMU to connect to
a local UNIX socket used for tunnelling.

Signed-off-by: Pavel Boldin 
---
 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,
  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);
+
+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;
 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,
-- 
1.9.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list