@@ -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");