qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] migration: add timeout option for tcp migration sen


From: Zhanghaoyu (A)
Subject: [Qemu-devel] [PATCH] migration: add timeout option for tcp migration send/receive socket
Date: Sun, 30 Jun 2013 05:12:32 +0000

When network disconnection occurs during live migration, the migration thread 
will be stuck in the function sendmsg(), as the migration socket is in 
~O_NONBLOCK mode now.

Signed-off-by: Zeng Junliang <address@hidden>
---
 include/migration/migration.h |    4 ++++
 migration-tcp.c               |   23 ++++++++++++++++++++++-
 2 files changed, 26 insertions(+), 1 deletions(-)

diff --git a/include/migration/migration.h b/include/migration/migration.h
index f0640e0..1a56248 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -23,6 +23,8 @@
 #include "qapi-types.h"
 #include "exec/cpu-common.h"
 
+#define QEMU_MIGRATE_SOCKET_OP_TIMEOUT 60
+
 struct MigrationParams {
     bool blk;
     bool shared;
@@ -109,6 +111,8 @@ uint64_t xbzrle_mig_pages_transferred(void);
 uint64_t xbzrle_mig_pages_overflow(void);
 uint64_t xbzrle_mig_pages_cache_miss(void);
 
+int tcp_migration_set_socket_timeout(int fd, int optname, int timeout_in_sec);
+
 /**
  * @migrate_add_blocker - prevent migration from proceeding
  *
diff --git a/migration-tcp.c b/migration-tcp.c
index b20ee58..860238b 100644
--- a/migration-tcp.c
+++ b/migration-tcp.c
@@ -29,11 +29,28 @@
     do { } while (0)
 #endif
 
+int tcp_migration_set_socket_timeout(int fd, int optname, int timeout_in_sec)
+{
+    struct timeval timeout;
+    int ret = 0;
+
+    if (fd < 0 || timeout_in_sec < 0 ||
+        (optname != SO_RCVTIMEO && optname != SO_SNDTIMEO))
+        return -1;
+
+    timeout.tv_sec = timeout_in_sec;
+    timeout.tv_usec = 0;
+
+    ret = qemu_setsockopt(fd, SOL_SOCKET, optname, &timeout, sizeof(timeout));
+
+    return ret;
+}
+
 static void tcp_wait_for_connect(int fd, void *opaque)
 {
     MigrationState *s = opaque;
 
-    if (fd < 0) {
+    if (tcp_migration_set_socket_timeout(fd, SO_SNDTIMEO, 
QEMU_MIGRATE_SOCKET_OP_TIMEOUT) < 0) {
         DPRINTF("migrate connect error\n");
         s->file = NULL;
         migrate_fd_error(s);
@@ -76,6 +93,10 @@ static void tcp_accept_incoming_migration(void *opaque)
         goto out;
     }
 
+    if (tcp_migration_set_socket_timeout(c, SO_RCVTIMEO, 
QEMU_MIGRATE_SOCKET_OP_TIMEOUT) < 0) {
+        fprintf(stderr, "set tcp migration socket receive timeout error\n");
+        goto out;
+    }
     process_incoming_migration(f);
     return;
 
-- 
1.7.3.1.msysgit.0



reply via email to

[Prev in Thread] Current Thread [Next in Thread]