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