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

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

 



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@xxxxxxxxxxxxx>
---
 migration-tcp.c |   36 +++++++++++++++++++++++++++++++++++-
 1 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/migration-tcp.c b/migration-tcp.c
index 767a2f1..a5d9b6d 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
 
@@ -55,7 +56,8 @@ static int socket_read(FdMigrationState *s, const void * buf, size_t size)
 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;
     }
@@ -181,6 +183,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");
 
-- 
1.7.0.31.g1df487

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux