diff mbox

[RFC,17/20] Modify migrate_fd_put_ready() when ft_mode is on.

Message ID 1271829445-5328-18-git-send-email-tamura.yoshiaki@lab.ntt.co.jp (mailing list archive)
State New, archived
Headers show

Commit Message

Yoshiaki Tamura April 21, 2010, 5:57 a.m. UTC
None
diff mbox

Patch

diff --git a/migration.c b/migration.c
index 3cc47fc..c81fdb4 100644
--- a/migration.c
+++ b/migration.c
@@ -494,8 +494,32 @@  void migrate_fd_put_ready(void *opaque)
         } else {
             state = MIG_STATE_COMPLETED;
         }
-        migrate_fd_cleanup(s);
-        s->state = state;
+
+        if (ft_mode && state == MIG_STATE_COMPLETED) {
+            /* close buffered_file and open ft_transaction.
+             * Note: file discriptor won't get closed,
+             * but reused by ft_transaction. */
+            socket_set_block(s->fd);
+            socket_set_nodelay(s->fd);
+            qemu_fclose(s->file);
+            s->file = qemu_fopen_ops_ft_tranx(s,
+                                              migrate_fd_put_buffer,
+                                              migrate_fd_put_vector,
+                                              migrate_fd_get_buffer,
+                                              NULL,
+                                              migrate_fd_close,
+                                              1);
+
+            /* events are tapped from now. */
+            event_tap_on();
+
+            if (old_vm_running) {
+                vm_start();
+            }
+        } else {
+            migrate_fd_cleanup(s);
+            s->state = state;
+        }
     }
 }
 
@@ -515,8 +539,14 @@  void migrate_fd_cancel(MigrationState *mig_state)
     DPRINTF("cancelling migration\n");
 
     s->state = MIG_STATE_CANCELLED;
-    qemu_savevm_state_cancel(s->mon, s->file);
 
+    if (ft_mode == FT_TRANSACTION) {
+        qemu_transaction_cancel(s->file);
+        ft_mode = FT_OFF;
+        event_tap_off();
+    }
+
+    qemu_savevm_state_cancel(s->mon, s->file);
     migrate_fd_cleanup(s);
 }