From: zhanghailiang <zhang.zhanghailiang@huawei.com>
To: qemu-devel@nongnu.org
Cc: amit.shah@redhat.com, quintela@redhat.com, dgilbert@redhat.com,
eddie.dong@intel.com, lizhijian@cn.fujitsu.com,
zhangchen.fnst@cn.fujitsu.com, xuquan8@huawei.com,
zhanghailiang <zhang.zhanghailiang@huawei.com>,
Eric Blake <eblake@redhat.com>
Subject: [Qemu-devel] [PATCH 3/3] COLO: Don't process failover request while loading VM's state
Date: Tue, 17 Jan 2017 20:57:44 +0800 [thread overview]
Message-ID: <1484657864-21708-4-git-send-email-zhang.zhanghailiang@huawei.com> (raw)
In-Reply-To: <1484657864-21708-1-git-send-email-zhang.zhanghailiang@huawei.com>
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 <eblake@redhat.com>
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
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 ce20f16..97210c7 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -856,10 +856,12 @@
#
# @completed: finish the process of failover
#
+# @relaunch: restart the failover process, from 'none' -> 'completed'
+#
# Since: 2.8
##
{ 'enum': 'FailoverStatus',
- 'data': [ 'none', 'require', 'active', 'completed'] }
+ 'data': [ 'none', 'require', 'active', 'completed', 'relaunch' ] }
##
# @x-colo-lost-heartbeat:
--
1.8.3.1
next prev parent reply other threads:[~2017-01-17 12:59 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-17 12:57 [Qemu-devel] [PATCH 0/3] COLO: fix some bugs zhanghailiang
2017-01-17 12:57 ` [Qemu-devel] [PATCH 1/3] COLO: fix setting checkpoint-delay not working properly zhanghailiang
2017-02-08 10:38 ` Dr. David Alan Gilbert
2017-02-08 11:18 ` Hailiang Zhang
2017-01-17 12:57 ` [Qemu-devel] [PATCH 2/3] COLO: Shutdown related socket fd while do failover zhanghailiang
2017-01-18 11:01 ` Dr. David Alan Gilbert
2017-02-08 11:14 ` Hailiang Zhang
2017-02-08 19:53 ` Dr. David Alan Gilbert
2017-02-13 4:13 ` Hailiang Zhang
2017-01-17 12:57 ` zhanghailiang [this message]
2017-01-17 18:24 ` [Qemu-devel] [PATCH 3/3] COLO: Don't process failover request while loading VM's state Eric Blake
2017-01-18 8:19 ` Hailiang Zhang
2017-02-10 15:44 ` [Qemu-devel] [PATCH 0/3] COLO: fix some bugs Dr. David Alan Gilbert
2017-02-13 8:46 ` Hailiang Zhang
2017-02-13 10:17 ` Dr. David Alan Gilbert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1484657864-21708-4-git-send-email-zhang.zhanghailiang@huawei.com \
--to=zhang.zhanghailiang@huawei.com \
--cc=amit.shah@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=eddie.dong@intel.com \
--cc=lizhijian@cn.fujitsu.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=xuquan8@huawei.com \
--cc=zhangchen.fnst@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).