[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 10/14] COLO: Don't process failover request while loa
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[Qemu-devel] [PULL 10/14] COLO: Don't process failover request while loading VM's state |
Date: |
Mon, 13 Feb 2017 17:50:29 +0000 |
From: zhanghailiang <address@hidden>
We should not do failover work while the main thread is loading
VM's state. Otherwise the consistent of VM's memory and
device state will be broken.
We will restart the loading process after jump over the stage,
The new failover status 'RELAUNCH' will help to record if we
need to restart the process.
Cc: Eric Blake <address@hidden>
Signed-off-by: zhanghailiang <address@hidden>
Signed-off-by: Li Zhijian <address@hidden>
Reviewed-by: Dr. David Alan Gilbert <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
Added a missing '(Since 2.9)'
---
migration/colo.c | 26 ++++++++++++++++++++++++++
qapi-schema.json | 4 +++-
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/migration/colo.c b/migration/colo.c
index 3222812..712308e 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -20,6 +20,8 @@
#include "qapi/error.h"
#include "migration/failover.h"
+static bool vmstate_loading;
+
#define COLO_BUFFER_BASE_SIZE (4 * 1024 * 1024)
bool colo_supported(void)
@@ -51,6 +53,19 @@ static void secondary_vm_do_failover(void)
int old_state;
MigrationIncomingState *mis = migration_incoming_get_current();
+ /* Can not do failover during the process of VM's loading VMstate, Or
+ * it will break the secondary VM.
+ */
+ if (vmstate_loading) {
+ old_state = failover_set_state(FAILOVER_STATUS_ACTIVE,
+ FAILOVER_STATUS_RELAUNCH);
+ if (old_state != FAILOVER_STATUS_ACTIVE) {
+ error_report("Unknown error while do failover for secondary VM,"
+ "old_state: %s", FailoverStatus_lookup[old_state]);
+ }
+ return;
+ }
+
migrate_set_state(&mis->state, MIGRATION_STATUS_COLO,
MIGRATION_STATUS_COMPLETED);
@@ -548,13 +563,23 @@ void *colo_process_incoming_thread(void *opaque)
qemu_mutex_lock_iothread();
qemu_system_reset(VMRESET_SILENT);
+ vmstate_loading = true;
if (qemu_loadvm_state(fb) < 0) {
error_report("COLO: loadvm failed");
qemu_mutex_unlock_iothread();
goto out;
}
+
+ vmstate_loading = false;
qemu_mutex_unlock_iothread();
+ if (failover_get_state() == FAILOVER_STATUS_RELAUNCH) {
+ failover_set_state(FAILOVER_STATUS_RELAUNCH,
+ FAILOVER_STATUS_NONE);
+ failover_request_active(NULL);
+ goto out;
+ }
+
colo_send_message(mis->to_src_file, COLO_MESSAGE_VMSTATE_LOADED,
&local_err);
if (local_err) {
@@ -563,6 +588,7 @@ void *colo_process_incoming_thread(void *opaque)
}
out:
+ vmstate_loading = false;
/* Throw the unreported error message after exited from loop */
if (local_err) {
error_report_err(local_err);
diff --git a/qapi-schema.json b/qapi-schema.json
index 9330541..5edb08d 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -1193,10 +1193,12 @@
#
# @completed: finish the process of failover
#
+# @relaunch: restart the failover process, from 'none' -> 'completed' (Since
2.9)
+#
# Since: 2.8
##
{ 'enum': 'FailoverStatus',
- 'data': [ 'none', 'require', 'active', 'completed'] }
+ 'data': [ 'none', 'require', 'active', 'completed', 'relaunch' ] }
##
# @x-colo-lost-heartbeat:
--
2.9.3
- [Qemu-devel] [PULL 02/14] MAINTAINERS: update my email address, (continued)
- [Qemu-devel] [PULL 02/14] MAINTAINERS: update my email address, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 01/14] migration: remove myself as maintainer, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 03/14] migration: add MigrationState arg for ram_save_/compressed_/page(), Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 05/14] migration: discard non-dirty ram pages after the start of postcopy, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 07/14] migration: consolidate VMStateField.start, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 06/14] migrate: Introduce zero RAM checks to skip RAM migration, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 04/14] add 'release-ram' migrate capability, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 08/14] COLO: fix setting checkpoint-delay not working properly, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 09/14] COLO: Shutdown related socket fd while do failover, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 12/14] migration: Add VMSTATE_WITH_TMP, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 10/14] COLO: Don't process failover request while loading VM's state,
Dr. David Alan Gilbert (git) <=
- [Qemu-devel] [PULL 11/14] migration: Add VMSTATE_UNUSED_VARRAY_UINT32, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 13/14] tests/migration: Add test for VMSTATE_WITH_TMP, Dr. David Alan Gilbert (git), 2017/02/13
- [Qemu-devel] [PULL 14/14] virtio/migration: Migrate virtio-net to VMState, Dr. David Alan Gilbert (git), 2017/02/13
- Re: [Qemu-devel] [PULL 00/14] migration queue, Peter Maydell, 2017/02/14