On 11/18/2015 01:13 PM, Pavel Boldin wrote:
Pass UNIX socket used as a local NBD server destination to the
migration iothread.
Signed-off-by: Pavel Boldin <pboldin(a)mirantis.com>
---
src/qemu/qemu_migration.c | 46 ++++++++++++++++++++++++++++++++++++++--------
1 file changed, 38 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 61e78c5..0682fd8 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -3993,6 +3993,7 @@ struct _qemuMigrationIOThread {
virThread thread;
virStreamPtr qemuStream;
int qemuSock;
+ int unixSock;
virError err;
int wakeupRecvFD;
int wakeupSendFD;
@@ -4003,7 +4004,7 @@ qemuMigrationIOFunc(void *arg)
{
qemuMigrationIOThreadPtr data = arg;
char *buffer = NULL;
- struct pollfd fds[2];
+ struct pollfd fds[3];
int timeout = -1;
virErrorPtr err = NULL;
@@ -4013,8 +4014,8 @@ qemuMigrationIOFunc(void *arg)
goto abrt;
fds[0].fd = data->wakeupRecvFD;
- fds[1].fd = -1;
- fds[0].events = fds[1].events = POLLIN;
+ fds[1].fd = fds[2].fd = -1;
+ fds[0].events = fds[1].events = fds[2].events = POLLIN;
for (;;) {
You'll need the fds[2].revents = 0 here too. Or are we not polling on
this one... It seems we're not since there's no fd2[2].revents code
below (yet?).
int ret;
@@ -4057,7 +4058,9 @@ qemuMigrationIOFunc(void *arg)
break;
case 'u':
fds[1].fd = data->qemuSock;
- VIR_DEBUG("qemuSock set %d", data->qemuSock);
+ fds[2].fd = data->unixSock;
+ VIR_DEBUG("qemuSock set %d, unixSock set %d",
+ data->qemuSock, data->unixSock);
Two for one specials... I do have some "concern" over the
synchronization between the setting/closing of these sockets... Perhaps
more towards the "real" ones are managed via spec.* and these are in io*
and concern over making sure the io* is removed first before the spec*
is closed. Don't think it's an issue, but the more options added the
more things to consider.
break;
}
}
@@ -4126,7 +4129,7 @@ qemuMigrationStartTunnel(virStreamPtr qemuStream)
goto error;
io->qemuStream = qemuStream;
- io->qemuSock = -1;
+ io->qemuSock = io->unixSock = -1;
io->wakeupRecvFD = wakeupFD[0];
io->wakeupSendFD = wakeupFD[1];
@@ -4202,6 +4205,26 @@ qemuMigrationSetQEMUSocket(qemuMigrationIOThreadPtr io, int sock)
}
static int
+qemuMigrationSetUnixSocket(qemuMigrationIOThreadPtr io, int sock)
+{
+ int rv = -1;
+ char action = 'u';
+
+ io->unixSock = sock;
+
+ if (safewrite(io->wakeupSendFD, &action, 1) != 1) {
+ virReportSystemError(errno, "%s",
+ _("failed to update migration tunnel"));
+ goto error;
+ }
+
+ rv = 0;
+
+ error:
+ return rv;
+}
+
+static int
qemuMigrationConnect(virQEMUDriverPtr driver,
virDomainObjPtr vm,
qemuMigrationSpecPtr spec)
@@ -4313,6 +4336,16 @@ qemuMigrationRun(virQEMUDriverPtr driver,
if (qemuDomainMigrateGraphicsRelocate(driver, vm, mig, graphicsuri) < 0)
VIR_WARN("unable to provide data for graphics client relocation");
+ if (spec->fwdType != MIGRATION_FWD_DIRECT) {
+ if (!(iothread = qemuMigrationStartTunnel(spec->fwd.stream)))
+ goto cancel;
+
+ if (nmigrate_disks &&
+ qemuMigrationSetUnixSocket(iothread,
+ spec->nbd_tunnel_unix_socket.sock) < 0)
+ goto cancel;
+ }
+
So again here we seem to be doing two things at one time... In
particular moving the creation/setup of the Tunnel to much sooner in the
processing... before even entering the monitor...
I would think that going to 'cancel' is not the right failure step too.
Why is there 'nmigrate_disks' and 'mig->nbd'? If the destination
doesn't support NBD, then one would think the nbd_tunnel_unix_socket
wouldn't have been created, but I don't recall that check being made in
earlier patches.
Perhaps the above lines need to be separated and the setting of the
socket for the ndb_tunnel* only done if mig->nbd is true below.
That way you're not setting that without also setting the migrate_flags
for the *DISK|*INC bits...
John
if (migrate_flags & (QEMU_MONITOR_MIGRATE_NON_SHARED_DISK |
QEMU_MONITOR_MIGRATE_NON_SHARED_INC)) {
bool dest_host = spec->destType == MIGRATION_DEST_HOST;
@@ -4444,9 +4477,6 @@ qemuMigrationRun(virQEMUDriverPtr driver,
}
if (spec->fwdType != MIGRATION_FWD_DIRECT) {
- if (!(iothread = qemuMigrationStartTunnel(spec->fwd.stream)))
- goto cancel;
-
if (qemuMigrationSetQEMUSocket(iothread, fd) < 0)
goto cancel;
/* If we've created a tunnel, then the 'fd' will be closed in the