From: zhanghailiang <zhang.zhanghailiang@huawei.com>
To: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: lizhijian@cn.fujitsu.com, quintela@redhat.com,
yunhong.jiang@intel.com, eddie.dong@intel.com,
peter.huangpeng@huawei.com, qemu-devel@nongnu.org,
arei.gonglei@huawei.com,
"stefanha@redhat.com" <stefanha@redhat.com>,
amit.shah@redhat.com, Yang Hongyang <yanghy@cn.fujitsu.com>
Subject: Re: [Qemu-devel] [PATCH COLO-Frame v8 08/34] COLO: Implement colo checkpoint protocol
Date: Thu, 27 Aug 2015 19:27:52 +0800 [thread overview]
Message-ID: <55DEF438.7010002@huawei.com> (raw)
In-Reply-To: <20150827104051.GC2247@work-vm>
Hi Dave,
On 2015/8/27 18:40, Dr. David Alan Gilbert wrote:
> * zhanghailiang (zhang.zhanghailiang@huawei.com) wrote:
>> We need communications protocol of user-defined to control the checkpoint
>> process.
>>
>> The new checkpoint request is started by Primary VM, and the interactive process
>> like below:
>> Checkpoint synchronizing points,
>>
>> Primary Secondary
>> NEW @
>> Suspend
>> SUSPENDED @
>> Suspend&Save state
>> SEND @
>> Send state Receive state
>> RECEIVED @
>> Flush network Load state
>> LOADED @
>> Resume Resume
>>
>> Start Comparing
>> NOTE:
>> 1) '@' who sends the message
>> 2) Every sync-point is synchronized by two sides with only
>> one handshake(single direction) for low-latency.
>> If more strict synchronization is required, a opposite direction
>> sync-point should be added.
>> 3) Since sync-points are single direction, the remote side may
>> go forward a lot when this side just receives the sync-point.
>>
>> Signed-off-by: Yang Hongyang <yanghy@cn.fujitsu.com>
>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>> Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
>> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
>> ---
>> migration/colo.c | 248 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>> trace-events | 3 +-
>> 2 files changed, 248 insertions(+), 3 deletions(-)
>>
>> diff --git a/migration/colo.c b/migration/colo.c
>> index 364e0dd..4ba6f65 100644
>> --- a/migration/colo.c
>> +++ b/migration/colo.c
>> @@ -14,6 +14,55 @@
>> #include "migration/colo.h"
>> #include "trace.h"
>> #include "qemu/error-report.h"
>> +#include "qemu/sockets.h"
>> +
>> +/* Fix me: Convert to use QAPI */
>> +typedef enum COLOCommand {
>> + COLO_CHECPOINT_READY = 0x46,
>
> Typo: CHEC*K*POINT
>
Fixed, i have converted this to QAPI, and some names has been changed too.
Besides, we have decided to respin this series which only including the basic
periodic checkpoint (Just like MicroCheckpointing, and this periodic mode is also what we want to support in COLO.)
it will be based on Yong Hongyang's netfilter/netbuffer to buffer/release net packets.
We have decided to realize the proxy in qemu,
and there will be a long time for proxy to be ready for merging. So extracting
the basic periodic checkpoint that not depend on proxy maybe a good idea,
it will be more easy for test and review, and also can be merged before proxy is ready.
>> + /*
>> + * Checkpoint synchronizing points.
>> + *
>> + * Primary Secondary
>> + * NEW @
>> + * Suspend
>> + * SUSPENDED @
>> + * Suspend&Save state
>> + * SEND @
>> + * Send state Receive state
>> + * RECEIVED @
>> + * Flush network Load state
>> + * LOADED @
>> + * Resume Resume
>> + *
>> + * Start Comparing
>> + * NOTE:
>> + * 1) '@' who sends the message
>> + * 2) Every sync-point is synchronized by two sides with only
>> + * one handshake(single direction) for low-latency.
>> + * If more strict synchronization is required, a opposite direction
>> + * sync-point should be added.
>> + * 3) Since sync-points are single direction, the remote side may
>> + * go forward a lot when this side just receives the sync-point.
>> + */
>> + COLO_CHECKPOINT_NEW,
>> + COLO_CHECKPOINT_SUSPENDED,
>> + COLO_CHECKPOINT_SEND,
>> + COLO_CHECKPOINT_RECEIVED,
>> + COLO_CHECKPOINT_LOADED,
>> +
>> + COLO_CHECKPOINT_MAX
>> +} COLOCommand;
>> +
>> +const char * const COLOCommand_lookup[] = {
>
>
> Unneeded ' ' after the *.
>
>> + [COLO_CHECPOINT_READY] = "checkpoint-ready",
>> + [COLO_CHECKPOINT_NEW] = "checkpoint-new",
>> + [COLO_CHECKPOINT_SUSPENDED] = "checkpoint-suspend",
>> + [COLO_CHECKPOINT_SEND] = "checheckpoint-send",
>> + [COLO_CHECKPOINT_RECEIVED] = "checkpoint-received",
>> + [COLO_CHECKPOINT_LOADED] = "checkpoint-loaded",
>> + [COLO_CHECKPOINT_MAX] = NULL,
>> +};
>>
>> static QEMUBH *colo_bh;
>>
>> @@ -36,20 +85,137 @@ bool migration_incoming_in_colo_state(void)
>> return (mis && (mis->state == MIGRATION_STATUS_COLO));
>> }
>>
>> +/* colo checkpoint control helper */
>> +static int colo_ctl_put(QEMUFile *f, uint64_t request)
>> +{
>> + int ret = 0;
>> +
>> + qemu_put_be64(f, request);
>> + qemu_fflush(f);
>> +
>> + ret = qemu_file_get_error(f);
>> + if (request < COLO_CHECKPOINT_MAX) {
>> + trace_colo_ctl_put(COLOCommand_lookup[request]);
>> + }
>> + return ret;
>> +}
>> +
>> +static int colo_ctl_get_value(QEMUFile *f, uint64_t *value)
>> +{
>> + int ret = 0;
>> + uint64_t temp;
>> +
>> + temp = qemu_get_be64(f);
>> +
>> + ret = qemu_file_get_error(f);
>> + if (ret < 0) {
>> + return -1;
>
> Why not just return ret rather than -1?
>
Fixed, thanks
>> + }
>> +
>> + *value = temp;
>> + return 0;
>> +}
>> +
>> +static int colo_ctl_get(QEMUFile *f, uint64_t require)
>> +{
>> + int ret;
>> + uint64_t value;
>> +
>> + ret = colo_ctl_get_value(f, &value);
>> + if (ret < 0) {
>> + return ret;
>> + }
>> +
>> + if (value != require) {
>> + error_report("unexpected state! expected: %"PRIu64
>> + ", received: %"PRIu64, require, value);
>> + exit(1);
>> + }
>
> Do you really want to exit? If you change that to something like
> return -EINVAL;
>
> then if it happens on the primary side, the primary side would
> survive.
Yes, we should not call exit() in COLO's common path, it will break
failover. i have fixed it.
>> +
>> + trace_colo_ctl_get(COLOCommand_lookup[require]);
>> + return ret;
>
> That's always 0 ?
>
I have fixed this helper function.
>> +}
>> +
>> +static int colo_do_checkpoint_transaction(MigrationState *s, QEMUFile *control)
>> +{
>> + int ret;
>> +
>> + ret = colo_ctl_put(s->file, COLO_CHECKPOINT_NEW);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> +
>> + ret = colo_ctl_get(control, COLO_CHECKPOINT_SUSPENDED);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> +
>> + /* TODO: suspend and save vm state to colo buffer */
>> +
>> + ret = colo_ctl_put(s->file, COLO_CHECKPOINT_SEND);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> +
>> + /* TODO: send vmstate to Secondary */
>> +
>> + ret = colo_ctl_get(control, COLO_CHECKPOINT_RECEIVED);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> +
>> + ret = colo_ctl_get(control, COLO_CHECKPOINT_LOADED);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> +
>> + /* TODO: resume Primary */
>> +
>> +out:
>> + return ret;
>> +}
>> +
>> static void *colo_thread(void *opaque)
>> {
>> MigrationState *s = opaque;
>> + QEMUFile *colo_control = NULL;
>> + int ret;
>> +
>> + colo_control = qemu_fopen_socket(qemu_get_fd(s->file), "rb");
>> + if (!colo_control) {
>> + error_report("Open colo_control failed!");
>> + goto out;
>> + }
>> +
>> + /*
>> + * Wait for Secondary finish loading vm states and enter COLO
>> + * restore.
>> + */
>> + ret = colo_ctl_get(colo_control, COLO_CHECPOINT_READY);
>> + if (ret < 0) {
>> + goto out;
>> + }
>>
>> qemu_mutex_lock_iothread();
>> vm_start();
>> qemu_mutex_unlock_iothread();
>> trace_colo_vm_state_change("stop", "run");
>>
>> - /*TODO: COLO checkpoint savevm loop*/
>> + while (s->state == MIGRATION_STATUS_COLO) {
>> + /* start a colo checkpoint */
>> + if (colo_do_checkpoint_transaction(s, colo_control)) {
>> + goto out;
>> + }
>> + }
>>
>> +out:
>> migrate_set_state(&s->state, MIGRATION_STATUS_COLO,
>> MIGRATION_STATUS_COMPLETED);
>>
>> + if (colo_control) {
>> + qemu_fclose(colo_control);
>> + }
>> +
>> qemu_mutex_lock_iothread();
>> qemu_bh_schedule(s->cleanup_bh);
>> qemu_mutex_unlock_iothread();
>> @@ -83,15 +249,93 @@ void colo_init_checkpointer(MigrationState *s)
>> qemu_bh_schedule(colo_bh);
>> }
>>
>> +/*
>> + * return:
>> + * 0: start a checkpoint
>> + * -1: some error happened, exit colo restore
>> + */
>> +static int colo_wait_handle_cmd(QEMUFile *f, int *checkpoint_request)
>> +{
>> + int ret;
>> + uint64_t cmd;
>> +
>> + ret = colo_ctl_get_value(f, &cmd);
>> + if (ret < 0) {
>> + return -1;
>
> return ret ?
>
>> + }
>> +
>> + switch (cmd) {
>> + case COLO_CHECKPOINT_NEW:
>> + *checkpoint_request = 1;
>> + return 0;
>> + default:
>> + return -1;
>> + }
>> +}
>> +
>> void *colo_process_incoming_checkpoints(void *opaque)
>> {
>> MigrationIncomingState *mis = opaque;
>> + QEMUFile *f = mis->file;
>> + int fd = qemu_get_fd(f);
>> + QEMUFile *ctl = NULL;
>> + int ret;
>>
>> migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE,
>> MIGRATION_STATUS_COLO);
>>
>> - /* TODO: COLO checkpoint restore loop */
>> + ctl = qemu_fopen_socket(fd, "wb");
>> + if (!ctl) {
>> + error_report("Can't open incoming channel!");
>> + goto out;
>> + }
>> + ret = colo_ctl_put(ctl, COLO_CHECPOINT_READY);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> + /* TODO: in COLO mode, Secondary is runing, so start the vm */
>> + while (mis->state == MIGRATION_STATUS_COLO) {
>> + int request = 0;
>> + int ret = colo_wait_handle_cmd(f, &request);
>> +
>> + if (ret < 0) {
>> + break;
>> + } else {
>> + if (!request) {
>> + continue;
>> + }
>> + }
>>
>> + /* TODO: suspend guest */
>> + ret = colo_ctl_put(ctl, COLO_CHECKPOINT_SUSPENDED);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> +
>> + ret = colo_ctl_get(f, COLO_CHECKPOINT_SEND);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> +
>> + /* TODO: read migration data into colo buffer */
>> +
>> + ret = colo_ctl_put(ctl, COLO_CHECKPOINT_RECEIVED);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> +
>> + /* TODO: load vm state */
>> +
>> + ret = colo_ctl_put(ctl, COLO_CHECKPOINT_LOADED);
>> + if (ret < 0) {
>> + goto out;
>> + }
>> +}
>> +
>> +out:
>> + if (ctl) {
>> + qemu_fclose(ctl);
>> + }
>> migration_incoming_exit_colo();
>>
>> return NULL;
>> diff --git a/trace-events b/trace-events
>> index 025d71c..4487633 100644
>> --- a/trace-events
>> +++ b/trace-events
>> @@ -1473,7 +1473,8 @@ rdma_start_outgoing_migration_after_rdma_source_init(void) ""
>>
>> # migration/colo.c
>> colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'"
>> -colo_receive_message(const char *msg) "Receive '%s'"
>> +colo_ctl_put(const char *msg) "Send '%s'"
>> +colo_ctl_get(const char *msg) "Receive '%s'"
>>
>> # kvm-all.c
>> kvm_ioctl(int type, void *arg) "type 0x%x, arg %p"
>> --
>> 1.8.3.1
>>
>>
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
>
> .
>
next prev parent reply other threads:[~2015-08-27 11:29 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-29 8:45 [Qemu-devel] [PATCH COLO-Frame v8 00/34] COarse-grain LOck-stepping(COLO) Virtual Machines for Non-stop Service (FT) zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 01/34] configure: Add parameter for configure to enable/disable COLO support zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 02/34] migration: Introduce capability 'colo' to migration zhanghailiang
2015-08-28 21:54 ` Eric Blake
2015-08-31 2:18 ` zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 03/34] COLO: migrate colo related info to slave zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 04/34] colo-comm/migration: skip colo info section for special cases zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 05/34] migration: Add state records for migration incoming zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 06/34] migration: Integrate COLO checkpoint process into migration zhanghailiang
2015-08-28 21:55 ` Eric Blake
2015-08-31 5:06 ` zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 07/34] migration: Integrate COLO checkpoint process into loadvm zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 08/34] COLO: Implement colo checkpoint protocol zhanghailiang
2015-08-27 10:40 ` Dr. David Alan Gilbert
2015-08-27 11:27 ` zhanghailiang [this message]
2015-08-27 12:43 ` Dr. David Alan Gilbert
2015-08-28 7:53 ` zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 09/34] COLO: Add a new RunState RUN_STATE_COLO zhanghailiang
2015-08-28 21:58 ` Eric Blake
2015-08-31 6:09 ` zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 10/34] QEMUSizedBuffer: Introduce two help functions for qsb zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 11/34] COLO: Save VM state to slave when do checkpoint zhanghailiang
2015-08-27 12:06 ` Dr. David Alan Gilbert
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 12/34] COLO RAM: Load PVM's dirty page into SVM's RAM cache temporarily zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 13/34] COLO VMstate: Load VM state into qsb before restore it zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 14/34] arch_init: Start to trace dirty pages of SVM zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 15/34] COLO RAM: Flush cached RAM into SVM's memory zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 16/34] COLO failover: Introduce a new command to trigger a failover zhanghailiang
2015-08-28 22:06 ` Eric Blake
2015-09-01 2:47 ` zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 17/34] COLO failover: Introduce state to record failover process zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 18/34] COLO failover: Implement COLO primary/secondary vm failover work zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 19/34] qmp event: Add event notification for COLO error zhanghailiang
2015-08-28 22:13 ` Eric Blake
2015-08-31 9:27 ` zhanghailiang
2015-08-31 15:07 ` Eric Blake
2015-09-01 1:08 ` zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 20/34] COLO failover: Don't do failover during loading VM's state zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 21/34] COLO: Add new command parameter 'forward_nic' 'colo_script' for net zhanghailiang
2015-08-28 22:24 ` Eric Blake
2015-08-31 10:57 ` zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 22/34] COLO NIC: Init/remove colo nic devices when add/cleanup tap devices zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 23/34] tap: Make launch_script() public zhanghailiang
2015-07-29 8:57 ` Jason Wang
2015-07-29 9:17 ` zhanghailiang
2015-07-29 9:24 ` Jason Wang
2015-07-29 9:43 ` zhanghailiang
2015-07-30 3:32 ` Jason Wang
2015-07-30 4:02 ` zhanghailiang
2015-07-29 9:19 ` Daniel P. Berrange
2015-07-29 9:37 ` Dr. David Alan Gilbert
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 24/34] COLO NIC: Implement colo nic device interface configure() zhanghailiang
2015-08-05 10:42 ` Dr. David Alan Gilbert
2015-08-05 11:54 ` Li Zhijian
2015-08-20 10:34 ` Dr. David Alan Gilbert
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 25/34] colo-nic: Handle secondary VM's original net device configure zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 26/34] COLO NIC: Implement colo nic init/destroy function zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 27/34] COLO NIC: Some init work related with proxy module zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 28/34] COLO: Handle nfnetlink message from " zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 29/34] COLO: Do checkpoint according to the result of packets comparation zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 30/34] COLO: Improve checkpoint efficiency by do additional periodic checkpoint zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 31/34] COLO: Add colo-set-checkpoint-period command zhanghailiang
2015-08-28 22:26 ` Eric Blake
2015-08-31 12:00 ` zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 32/34] COLO NIC: Implement NIC checkpoint and failover zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 33/34] COLO: Implement shutdown checkpoint zhanghailiang
2015-07-29 8:45 ` [Qemu-devel] [PATCH COLO-Frame v8 34/34] COLO: Add block replication into colo process zhanghailiang
2015-08-05 11:24 ` [Qemu-devel] [PATCH COLO-Frame v8 00/34] COarse-grain LOck-stepping(COLO) Virtual Machines for Non-stop Service (FT) Dr. David Alan Gilbert
2015-08-06 10:25 ` zhanghailiang
2015-08-12 8:20 ` zhanghailiang
2015-08-24 14:38 ` Dr. David Alan Gilbert
2015-08-25 7:03 ` zhanghailiang
2015-08-26 16:49 ` 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=55DEF438.7010002@huawei.com \
--to=zhang.zhanghailiang@huawei.com \
--cc=amit.shah@redhat.com \
--cc=arei.gonglei@huawei.com \
--cc=dgilbert@redhat.com \
--cc=eddie.dong@intel.com \
--cc=lizhijian@cn.fujitsu.com \
--cc=peter.huangpeng@huawei.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefanha@redhat.com \
--cc=yanghy@cn.fujitsu.com \
--cc=yunhong.jiang@intel.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).