[libvirt] [PATCH v2 13/17] qemu: assume support for all migration protocols except rdma

John Ferlan jferlan at redhat.com
Mon Nov 9 23:27:02 UTC 2015



On 11/09/2015 11:24 AM, Daniel P. Berrange wrote:
> Since we require QEMU 0.12.0, we can assume that QEMU supports
> all of the fd, tcp, unix and exec migration protocols.
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  src/qemu/qemu_capabilities.c                       | 34 +---------
>  src/qemu/qemu_capabilities.h                       | 10 +--
>  src/qemu/qemu_command.c                            | 44 +------------
>  src/qemu/qemu_migration.c                          | 77 ++++++----------------
>  tests/qemuargv2xmltest.c                           |  1 -
>  tests/qemucapabilitiesdata/caps_1.2.2-1.caps       |  4 --
>  tests/qemucapabilitiesdata/caps_1.3.1-1.caps       |  4 --
>  tests/qemucapabilitiesdata/caps_1.4.2-1.caps       |  4 --
>  tests/qemucapabilitiesdata/caps_1.5.3-1.caps       |  4 --
>  tests/qemucapabilitiesdata/caps_1.6.0-1.caps       |  4 --
>  tests/qemucapabilitiesdata/caps_1.6.50-1.caps      |  4 --
>  tests/qemucapabilitiesdata/caps_2.1.1-1.caps       |  4 --
>  tests/qemucaps2xmldata/all_1.6.0-1.caps            |  4 --
>  tests/qemucaps2xmldata/nodisksnapshot_1.6.0-1.caps |  4 --
>  tests/qemuhelptest.c                               | 32 ---------
>  .../qemuxml2argv-migrate-numa-unaligned.args       |  2 +-
>  .../qemuxml2argvdata/qemuxml2argv-restore-v1.args  | 23 -------
>  tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml | 28 --------
>  tests/qemuxml2argvtest.c                           | 13 ++--
>  19 files changed, 33 insertions(+), 267 deletions(-)
>  delete mode 100644 tests/qemuxml2argvdata/qemuxml2argv-restore-v1.args
>  delete mode 100644 tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml
> 

Similar to 8/17 - should the "-incoming" be removed from
qemuParseCommandLine?

Also, Coverity complained about one thing - although I'm not quite sure
"how" it used the definition it did... I think this is a false positive,
but could easily be avoided.

[...]

> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index e8ffde0..fca05e3 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -4359,15 +4359,8 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>          break;
>  
>      case MIGRATION_DEST_UNIX:
> -        if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_UNIX)) {
> -            ret = qemuMonitorMigrateToUnix(priv->mon, migrate_flags,
> -                                           spec->dest.unix_socket.file);
> -        } else {
> -            const char *args[] = {
> -                "nc", "-U", spec->dest.unix_socket.file, NULL
> -            };
> -            ret = qemuMonitorMigrateToCommand(priv->mon, migrate_flags, args);
> -        }
> +        ret = qemuMonitorMigrateToUnix(priv->mon, migrate_flags,
> +                                       spec->dest.unix_socket.file);
>          break;
>  
>      case MIGRATION_DEST_FD:
> @@ -4562,8 +4555,7 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
>          }
>      }
>  
> -    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD) &&
> -        STRNEQ(uribits->scheme, "rdma"))
> +    if (STRNEQ(uribits->scheme, "rdma"))
>          spec.destType = MIGRATION_DEST_CONNECT_HOST;
>      else
>          spec.destType = MIGRATION_DEST_HOST;
> @@ -4600,11 +4592,11 @@ static int doTunnelMigrate(virQEMUDriverPtr driver,
>                             size_t nmigrate_disks,
>                             const char **migrate_disks)
>  {
> -    qemuDomainObjPrivatePtr priv = vm->privateData;
>      virNetSocketPtr sock = NULL;
>      int ret = -1;
>      qemuMigrationSpec spec;
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
> +    int fds[2];

(1) Event var_decl: 	Declaring variable "fds" without initializer.
Also see events:

>  
>      VIR_DEBUG("driver=%p, vm=%p, st=%p, cookiein=%s, cookieinlen=%d, "
>                "cookieout=%p, cookieoutlen=%p, flags=%lx, resource=%lu, "
> @@ -4613,53 +4605,24 @@ static int doTunnelMigrate(virQEMUDriverPtr driver,
>                cookieout, cookieoutlen, flags, resource,
>                NULLSTR(graphicsuri), nmigrate_disks, migrate_disks);
>  
> -    if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD) &&
> -        !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_UNIX) &&
> -        !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_EXEC)) {
> -        virReportError(VIR_ERR_OPERATION_FAILED, "%s",
> -                       _("Source qemu is too old to support tunnelled migration"));
> -        virObjectUnref(cfg);
> -        return -1;
> -    }
> -
>      spec.fwdType = MIGRATION_FWD_STREAM;
>      spec.fwd.stream = st;
>  
> -    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD)) {
> -        int fds[2];
> -
> -        spec.destType = MIGRATION_DEST_FD;
> -        spec.dest.fd.qemu = -1;
> -        spec.dest.fd.local = -1;
> -
> -        if (pipe2(fds, O_CLOEXEC) == 0) {
> -            spec.dest.fd.qemu = fds[1];
> -            spec.dest.fd.local = fds[0];
> -        }
> -        if (spec.dest.fd.qemu == -1 ||
> -            virSecurityManagerSetImageFDLabel(driver->securityManager, vm->def,
> -                                              spec.dest.fd.qemu) < 0) {
> -            virReportSystemError(errno, "%s",
> -                        _("cannot create pipe for tunnelled migration"));
> -            goto cleanup;
> -        }
> -    } else {
> -        spec.destType = MIGRATION_DEST_UNIX;
> -        spec.dest.unix_socket.sock = -1;
> -        spec.dest.unix_socket.file = NULL;
> -
> -        if (virAsprintf(&spec.dest.unix_socket.file,
> -                        "%s/qemu.tunnelmigrate.src.%s",
> -                        cfg->libDir, vm->def->name) < 0)
> -            goto cleanup;
>  
> -        if (virNetSocketNewListenUNIX(spec.dest.unix_socket.file, 0700,
> -                                      cfg->user, cfg->group,
> -                                      &sock) < 0 ||
> -            virNetSocketListen(sock, 1) < 0)
> -            goto cleanup;
> +    spec.destType = MIGRATION_DEST_FD;
> +    spec.dest.fd.qemu = -1;
> +    spec.dest.fd.local = -1;
>  
> -        spec.dest.unix_socket.sock = virNetSocketGetFD(sock);

(4) Event uninit_use_in_call: 	Using uninitialized element of array
"fds" when calling "rpl_pipe2". [details]
Also see events: 	[var_decl]

Not sure why this shows up - guess I'd have to understand the build a
bit better... The only place where I found rpl_pipe2 is in unistd.h.

Initializing to {-1, -1}; avoids the error

John


> +    if (pipe2(fds, O_CLOEXEC) == 0) {
> +        spec.dest.fd.qemu = fds[1];
> +        spec.dest.fd.local = fds[0];
> +    }
> +    if (spec.dest.fd.qemu == -1 ||
> +        virSecurityManagerSetImageFDLabel(driver->securityManager, vm->def,
> +                                          spec.dest.fd.qemu) < 0) {
> +        virReportSystemError(errno, "%s",
> +                             _("cannot create pipe for tunnelled migration"));
> +        goto cleanup;
>      }
>  
>      ret = qemuMigrationRun(driver, vm, cookiein, cookieinlen, cookieout,
> @@ -5943,8 +5906,7 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
>          return -1;
>      }
>  
> -    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD) &&
> -        (!compressor || pipe(pipeFD) == 0)) {
> +    if ((!compressor || pipe(pipeFD) == 0)) {
>          /* All right! We can use fd migration, which means that qemu
>           * doesn't have to open() the file, so while we still have to
>           * grant SELinux access, we can do it on fd and avoid cleanup
> @@ -5983,8 +5945,7 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
>      if (!compressor) {
>          const char *args[] = { "cat", NULL };
>  
> -        if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD) &&
> -            priv->monConfig->type == VIR_DOMAIN_CHR_TYPE_UNIX) {
> +        if (priv->monConfig->type == VIR_DOMAIN_CHR_TYPE_UNIX) {
>              rc = qemuMonitorMigrateToFd(priv->mon,
>                                          QEMU_MONITOR_MIGRATE_BACKGROUND,
>                                          fd);

[...]




More information about the libvir-list mailing list