From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45403) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aDoRB-0005O3-0b for qemu-devel@nongnu.org; Tue, 29 Dec 2015 02:11:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aDoR9-0006yg-R5 for qemu-devel@nongnu.org; Tue, 29 Dec 2015 02:11:16 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:14201) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aDoR9-0006xl-7E for qemu-devel@nongnu.org; Tue, 29 Dec 2015 02:11:15 -0500 From: zhanghailiang Date: Tue, 29 Dec 2015 15:09:18 +0800 Message-ID: <1451372975-5048-23-git-send-email-zhang.zhanghailiang@huawei.com> In-Reply-To: <1451372975-5048-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1451372975-5048-1-git-send-email-zhang.zhanghailiang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH COLO-Frame v13 22/39] COLO failover: Introduce state to record failover process List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: xiecl.fnst@cn.fujitsu.com, lizhijian@cn.fujitsu.com, quintela@redhat.com, yunhong.jiang@intel.com, eddie.dong@intel.com, peter.huangpeng@huawei.com, dgilbert@redhat.com, zhanghailiang , arei.gonglei@huawei.com, stefanha@redhat.com, amit.shah@redhat.com, zhangchen.fnst@cn.fujitsu.com, hongyang.yang@easystack.cn When handling failover, we do different things according to the different stage of failover process, here we introduce a global atomic variable to record the status of failover. We add four failover status to indicate the different stage of failover process. You should use the helpers to get and set the value. Signed-off-by: zhanghailiang Reviewed-by: Dr. David Alan Gilbert --- v11: - fix several typos found by Dave - Add Reviewed-by tag --- include/migration/failover.h | 10 ++++++++++ migration/colo-failover.c | 37 +++++++++++++++++++++++++++++++++++++ migration/colo.c | 4 ++++ trace-events | 1 + 4 files changed, 52 insertions(+) diff --git a/include/migration/failover.h b/include/migration/failover.h index 1785b52..882c625 100644 --- a/include/migration/failover.h +++ b/include/migration/failover.h @@ -15,6 +15,16 @@ #include "qemu-common.h" +typedef enum COLOFailoverStatus { + FAILOVER_STATUS_NONE = 0, + FAILOVER_STATUS_REQUEST = 1, /* Request but not handled */ + FAILOVER_STATUS_HANDLING = 2, /* In the process of handling failover */ + FAILOVER_STATUS_COMPLETED = 3, /* Finish the failover process */ +} COLOFailoverStatus; + +void failover_init_state(void); +int failover_set_state(int old_state, int new_state); +int failover_get_state(void); void failover_request_active(Error **errp); #endif diff --git a/migration/colo-failover.c b/migration/colo-failover.c index e3897c6..1b1be24 100644 --- a/migration/colo-failover.c +++ b/migration/colo-failover.c @@ -14,22 +14,59 @@ #include "migration/failover.h" #include "qmp-commands.h" #include "qapi/qmp/qerror.h" +#include "qemu/error-report.h" +#include "trace.h" static QEMUBH *failover_bh; +static COLOFailoverStatus failover_state; static void colo_failover_bh(void *opaque) { + int old_state; + qemu_bh_delete(failover_bh); failover_bh = NULL; + old_state = failover_set_state(FAILOVER_STATUS_REQUEST, + FAILOVER_STATUS_HANDLING); + if (old_state != FAILOVER_STATUS_REQUEST) { + error_report("Unkown error for failover, old_state=%d", old_state); + return; + } /*TODO: Do failover work */ } void failover_request_active(Error **errp) { + if (failover_set_state(FAILOVER_STATUS_NONE, FAILOVER_STATUS_REQUEST) + != FAILOVER_STATUS_NONE) { + error_setg(errp, "COLO failover is already actived"); + return; + } failover_bh = qemu_bh_new(colo_failover_bh, NULL); qemu_bh_schedule(failover_bh); } +void failover_init_state(void) +{ + failover_state = FAILOVER_STATUS_NONE; +} + +int failover_set_state(int old_state, int new_state) +{ + int old; + + old = atomic_cmpxchg(&failover_state, old_state, new_state); + if (old == old_state) { + trace_colo_failover_set_state(new_state); + } + return old; +} + +int failover_get_state(void) +{ + return atomic_read(&failover_state); +} + void qmp_x_colo_lost_heartbeat(Error **errp) { if (get_colo_mode() == COLO_MODE_UNKNOWN) { diff --git a/migration/colo.c b/migration/colo.c index fa85695..92fefc0 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -236,6 +236,8 @@ static void colo_process_checkpoint(MigrationState *s) Error *local_err = NULL; int ret; + failover_init_state(); + s->rp_state.from_dst_file = qemu_file_get_return_path(s->to_dst_file); if (!s->rp_state.from_dst_file) { error_report("Open QEMUFile from_dst_file failed"); @@ -342,6 +344,8 @@ void *colo_process_incoming_thread(void *opaque) migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, MIGRATION_STATUS_COLO); + failover_init_state(); + mis->to_src_file = qemu_file_get_return_path(mis->from_src_file); if (!mis->to_src_file) { error_report("colo incoming thread: Open QEMUFile to_src_file failed"); diff --git a/trace-events b/trace-events index 578b775..a50bf45 100644 --- a/trace-events +++ b/trace-events @@ -1585,6 +1585,7 @@ postcopy_ram_incoming_cleanup_join(void) "" colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'" colo_put_cmd(const char *msg) "Send '%s' cmd" colo_get_cmd(const char *msg) "Receive '%s' cmd" +colo_failover_set_state(int new_state) "new state %d" # kvm-all.c kvm_ioctl(int type, void *arg) "type 0x%x, arg %p" -- 1.8.3.1