[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