Lines Matching +full:default +full:- +full:state
2 * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO)
10 * later. See the COPYING file in the top-level directory.
16 #include "qapi/qapi-commands-migration.h"
18 #include "qemu-file.h"
21 #include "io/channel-buffer.h"
23 #include "qemu/error-report.h"
24 #include "qemu/main-loop.h"
29 #include "net/colo-compare.h"
32 #include "qapi/qapi-events-migration.h"
50 return (s->state == MIGRATION_STATUS_COLO); in migration_in_colo_state()
57 return mis && (mis->state == MIGRATION_STATUS_COLO); in migration_incoming_in_colo_state()
70 qemu_event_set(&s->colo_checkpoint_event); in colo_checkpoint_notify()
71 s->colo_checkpoint_time = qemu_clock_get_ms(QEMU_CLOCK_HOST); in colo_checkpoint_notify()
72 next_notify_time = s->colo_checkpoint_time + migrate_checkpoint_delay(); in colo_checkpoint_notify()
73 timer_mod(s->colo_delay_timer, next_notify_time); in colo_checkpoint_notify()
90 /* COLO needs enable block-replication */ in secondary_vm_do_failover()
108 migrate_set_state(&mis->state, MIGRATION_STATUS_COLO, in secondary_vm_do_failover()
124 error_report("\"-S\" qemu option will be ignored in secondary side"); in secondary_vm_do_failover()
125 /* recover runstate to normal migration finish state */ in secondary_vm_do_failover()
130 * If mis->from_src_file and mis->to_src_file use the same fd, in secondary_vm_do_failover()
131 * The second shutdown() will return -1, we ignore this value, in secondary_vm_do_failover()
134 if (mis->from_src_file) { in secondary_vm_do_failover()
135 qemu_file_shutdown(mis->from_src_file); in secondary_vm_do_failover()
137 if (mis->to_src_file) { in secondary_vm_do_failover()
138 qemu_file_shutdown(mis->to_src_file); in secondary_vm_do_failover()
144 error_report("Incorrect state (%s) while doing failover for " in secondary_vm_do_failover()
149 qemu_event_set(&mis->colo_incoming_event); in secondary_vm_do_failover()
152 if (mis->colo_incoming_co) { in secondary_vm_do_failover()
153 qemu_coroutine_enter(mis->colo_incoming_co); in secondary_vm_do_failover()
163 migrate_set_state(&s->state, MIGRATION_STATUS_COLO, in primary_vm_do_failover()
167 * qemu_sem_wait(&s->colo_checkpoint_sem). in primary_vm_do_failover()
173 * The s->rp_state.from_dst_file and s->to_dst_file may use the in primary_vm_do_failover()
176 if (s->to_dst_file) { in primary_vm_do_failover()
177 qemu_file_shutdown(s->to_dst_file); in primary_vm_do_failover()
179 if (s->rp_state.from_dst_file) { in primary_vm_do_failover()
180 qemu_file_shutdown(s->rp_state.from_dst_file); in primary_vm_do_failover()
186 error_report("Incorrect state (%s) while doing failover for Primary VM", in primary_vm_do_failover()
198 qemu_event_set(&s->colo_exit_event); in primary_vm_do_failover()
226 default: in colo_do_failover()
263 s->error = true; in qmp_query_xen_replication_status()
264 s->desc = g_strdup(error_get_pretty(err)); in qmp_query_xen_replication_status()
266 s->error = false; in qmp_query_xen_replication_status()
290 s->mode = get_colo_mode(); in qmp_query_colo_status()
291 s->last_mode = last_colo_mode; in qmp_query_colo_status()
295 s->reason = COLO_EXIT_REASON_NONE; in qmp_query_colo_status()
298 s->reason = COLO_EXIT_REASON_REQUEST; in qmp_query_colo_status()
300 default: in qmp_query_colo_status()
302 s->reason = COLO_EXIT_REASON_PROCESSING; in qmp_query_colo_status()
304 s->reason = COLO_EXIT_REASON_ERROR; in qmp_query_colo_status()
323 error_setg_errno(errp, -ret, "Can't send COLO message"); in colo_send_message()
342 error_setg_errno(errp, -ret, "Failed to send value for message:%s", in colo_send_message_value()
355 error_setg_errno(errp, -ret, "Can't receive COLO message"); in colo_receive_message()
399 error_setg_errno(errp, -ret, "Failed to get value for COLO message: %s", in colo_receive_message_value()
410 int ret = -1; in colo_do_checkpoint_transaction()
412 colo_send_message(s->to_dst_file, COLO_MESSAGE_CHECKPOINT_REQUEST, in colo_do_checkpoint_transaction()
418 colo_receive_check_message(s->rp_state.from_dst_file, in colo_do_checkpoint_transaction()
423 /* Reset channel-buffer directly */ in colo_do_checkpoint_transaction()
425 bioc->usage = 0; in colo_do_checkpoint_transaction()
450 colo_send_message(s->to_dst_file, COLO_MESSAGE_VMSTATE_SEND, &local_err); in colo_do_checkpoint_transaction()
456 qemu_savevm_maybe_send_switchover_start(s->to_dst_file); in colo_do_checkpoint_transaction()
458 /* Note: device state is saved into buffer */ in colo_do_checkpoint_transaction()
470 * Only save VM's live state, which not including device state. in colo_do_checkpoint_transaction()
474 qemu_savevm_live_state(s->to_dst_file); in colo_do_checkpoint_transaction()
482 colo_send_message_value(s->to_dst_file, COLO_MESSAGE_VMSTATE_SIZE, in colo_do_checkpoint_transaction()
483 bioc->usage, &local_err); in colo_do_checkpoint_transaction()
488 qemu_put_buffer(s->to_dst_file, bioc->data, bioc->usage); in colo_do_checkpoint_transaction()
489 ret = qemu_fflush(s->to_dst_file); in colo_do_checkpoint_transaction()
494 colo_receive_check_message(s->rp_state.from_dst_file, in colo_do_checkpoint_transaction()
500 qemu_event_reset(&s->colo_checkpoint_event); in colo_do_checkpoint_transaction()
506 colo_receive_check_message(s->rp_state.from_dst_file, in colo_do_checkpoint_transaction()
545 s->rp_state.from_dst_file = qemu_file_get_return_path(s->to_dst_file); in colo_process_checkpoint()
546 if (!s->rp_state.from_dst_file) { in colo_process_checkpoint()
558 colo_receive_check_message(s->rp_state.from_dst_file, in colo_process_checkpoint()
578 timer_mod(s->colo_delay_timer, qemu_clock_get_ms(QEMU_CLOCK_HOST) + in colo_process_checkpoint()
581 while (s->state == MIGRATION_STATUS_COLO) { in colo_process_checkpoint()
587 qemu_event_wait(&s->colo_checkpoint_event); in colo_process_checkpoint()
589 if (s->state != MIGRATION_STATUS_COLO) { in colo_process_checkpoint()
617 default: in colo_process_checkpoint()
623 qemu_event_wait(&s->colo_exit_event); in colo_process_checkpoint()
624 qemu_event_destroy(&s->colo_exit_event); in colo_process_checkpoint()
629 * released before unregister notifier, or there will be use-after-free in colo_process_checkpoint()
633 timer_free(s->colo_delay_timer); in colo_process_checkpoint()
634 qemu_event_destroy(&s->colo_checkpoint_event); in colo_process_checkpoint()
639 * re-used by other threads after we release here. in colo_process_checkpoint()
641 if (s->rp_state.from_dst_file) { in colo_process_checkpoint()
642 qemu_fclose(s->rp_state.from_dst_file); in colo_process_checkpoint()
643 s->rp_state.from_dst_file = NULL; in colo_process_checkpoint()
650 qemu_event_init(&s->colo_checkpoint_event, false); in migrate_start_colo_process()
651 s->colo_delay_timer = timer_new_ms(QEMU_CLOCK_HOST, in migrate_start_colo_process()
654 qemu_event_init(&s->colo_exit_event, false); in migrate_start_colo_process()
673 colo_send_message(mis->to_src_file, COLO_MESSAGE_CHECKPOINT_REPLY, in colo_incoming_process_checkpoint()
680 colo_receive_check_message(mis->from_src_file, in colo_incoming_process_checkpoint()
689 ret = qemu_loadvm_state_main(mis->from_src_file, mis); in colo_incoming_process_checkpoint()
693 error_setg(errp, "Load VM's live state (ram) error"); in colo_incoming_process_checkpoint()
697 value = colo_receive_message_value(mis->from_src_file, in colo_incoming_process_checkpoint()
705 * Read VM device state data into channel buffer, in colo_incoming_process_checkpoint()
706 * It's better to re-use the memory allocated. in colo_incoming_process_checkpoint()
709 if (value > bioc->capacity) { in colo_incoming_process_checkpoint()
710 bioc->capacity = value; in colo_incoming_process_checkpoint()
711 bioc->data = g_realloc(bioc->data, bioc->capacity); in colo_incoming_process_checkpoint()
713 total_size = qemu_get_buffer(mis->from_src_file, bioc->data, value); in colo_incoming_process_checkpoint()
719 bioc->usage = total_size; in colo_incoming_process_checkpoint()
722 colo_send_message(mis->to_src_file, COLO_MESSAGE_VMSTATE_RECEIVED, in colo_incoming_process_checkpoint()
734 error_setg(errp, "COLO: load device state failed"); in colo_incoming_process_checkpoint()
775 colo_send_message(mis->to_src_file, COLO_MESSAGE_VMSTATE_LOADED, in colo_incoming_process_checkpoint()
786 msg = colo_receive_message(mis->from_src_file, &local_err); in colo_wait_handle_message()
796 default: in colo_wait_handle_message()
810 qemu_event_set(&s->colo_checkpoint_event); in colo_shutdown()
811 qemu_event_set(&s->colo_exit_event); in colo_shutdown()
815 qemu_event_set(&mis->colo_incoming_event); in colo_shutdown()
817 default: in colo_shutdown()
826 QIOChannelBuffer *bioc = NULL; /* Cache incoming device state */ in colo_process_incoming_thread()
830 qemu_event_init(&mis->colo_incoming_event, false); in colo_process_incoming_thread()
832 migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, in colo_process_incoming_thread()
851 mis->to_src_file = qemu_file_get_return_path(mis->from_src_file); in colo_process_incoming_thread()
852 if (!mis->to_src_file) { in colo_process_incoming_thread()
862 qemu_file_set_blocking(mis->from_src_file, true); in colo_process_incoming_thread()
880 colo_send_message(mis->to_src_file, COLO_MESSAGE_CHECKPOINT_READY, in colo_process_incoming_thread()
886 while (mis->state == MIGRATION_STATUS_COLO) { in colo_process_incoming_thread()
916 default: in colo_process_incoming_thread()
926 qemu_event_wait(&mis->colo_incoming_event); in colo_process_incoming_thread()
927 qemu_event_destroy(&mis->colo_incoming_event); in colo_process_incoming_thread()
945 mis->colo_incoming_co = qemu_coroutine_self(); in colo_incoming_co()
947 mis->colo_incoming_co = NULL; in colo_incoming_co()