Patchwork [RFC,18/20] Modify tcp_accept_incoming_migration() to handle ft_mode, and add a hack not to close fd when ft_mode is enabled.

login
register
mail settings
Submitter Yoshiaki Tamura
Date April 21, 2010, 5:57 a.m.
Message ID <1271829445-5328-19-git-send-email-tamura.yoshiaki@lab.ntt.co.jp>
Download mbox | patch
Permalink /patch/50623/
State New
Headers show

Comments

Yoshiaki Tamura - April 21, 2010, 5:57 a.m.
When ft_mode is set in the header, tcp_accept_incoming_migration()
receives ft_transaction iteratively.  We also need a hack no to close
fd before moving to ft_transaction mode, so that we can reuse the fd
for it.

Signed-off-by: Yoshiaki Tamura <tamura.yoshiaki@lab.ntt.co.jp>
---
 migration-tcp.c |   36 +++++++++++++++++++++++++++++++++++-
 1 files changed, 35 insertions(+), 1 deletions(-)

Patch

diff --git a/migration-tcp.c b/migration-tcp.c
index 94a1a03..e018ed1 100644
--- a/migration-tcp.c
+++ b/migration-tcp.c
@@ -18,6 +18,7 @@ 
 #include "sysemu.h"
 #include "buffered_file.h"
 #include "block.h"
+#include "ft_transaction.h"
 
 //#define DEBUG_MIGRATION_TCP
 
@@ -60,7 +61,8 @@  static int socket_writev(FdMigrationState *s, const struct iovec *v, int count)
 static int tcp_close(FdMigrationState *s)
 {
     DPRINTF("tcp_close\n");
-    if (s->fd != -1) {
+    /* FIX ME: accessing ft_mode here isn't clean */
+    if (s->fd != -1 && ft_mode != FT_INIT) {
         close(s->fd);
         s->fd = -1;
     }
@@ -187,6 +189,38 @@  static void tcp_accept_incoming_migration(void *opaque)
         fprintf(stderr, "load of migration failed\n");
         goto out_fopen;
     }
+
+    /* ft_mode is set by qemu_loadvm_state(). */
+    if (ft_mode == FT_INIT) {
+        /* close normal QEMUFile first before reusing connection. */
+        qemu_fclose(f);
+        socket_set_nodelay(c);
+        socket_set_timeout(c, 5);
+        /* don't autostart to avoid split brain. */
+        autostart = 0;
+
+        f = qemu_fopen_transaction(c);
+        if (f == NULL) {
+            fprintf(stderr, "could not qemu_fopen transaction\n");
+            goto out;
+        }
+
+        /* need to wait sender to setup. */
+        if (qemu_transaction_begin(f) < 0) {
+            goto out_fopen;
+        }
+
+        /* loop until transaction breaks */
+        while ((ft_mode != FT_OFF) && (ret == 0)) {
+            ret = qemu_loadvm_state(f, 1);
+        }
+
+        /* if migrate_cancel was called at the sender  */
+        if (ft_mode == FT_OFF) {
+            goto out_fopen;
+        }
+    }
+
     qemu_announce_self();
     DPRINTF("successfully loaded vm state\n");