提交 aef06085 编写于 作者: Z zhanghailiang 提交者: Amit Shah

COLO: Introduce state to record failover process

When handling failover, COLO processes differently 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: Nzhanghailiang <zhang.zhanghailiang@huawei.com>
Reviewed-by: NDr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: NAmit Shah <amit.shah@redhat.com>
Signed-off-by: NAmit Shah <amit@amitshah.net>
上级 d89e666e
...@@ -14,7 +14,12 @@ ...@@ -14,7 +14,12 @@
#define QEMU_FAILOVER_H #define QEMU_FAILOVER_H
#include "qemu-common.h" #include "qemu-common.h"
#include "qapi-types.h"
void failover_init_state(void);
FailoverStatus failover_set_state(FailoverStatus old_state,
FailoverStatus new_state);
FailoverStatus failover_get_state(void);
void failover_request_active(Error **errp); void failover_request_active(Error **errp);
#endif #endif
...@@ -15,22 +15,63 @@ ...@@ -15,22 +15,63 @@
#include "migration/failover.h" #include "migration/failover.h"
#include "qmp-commands.h" #include "qmp-commands.h"
#include "qapi/qmp/qerror.h" #include "qapi/qmp/qerror.h"
#include "qemu/error-report.h"
#include "trace.h"
static QEMUBH *failover_bh; static QEMUBH *failover_bh;
static FailoverStatus failover_state;
static void colo_failover_bh(void *opaque) static void colo_failover_bh(void *opaque)
{ {
int old_state;
qemu_bh_delete(failover_bh); qemu_bh_delete(failover_bh);
failover_bh = NULL; failover_bh = NULL;
old_state = failover_set_state(FAILOVER_STATUS_REQUIRE,
FAILOVER_STATUS_ACTIVE);
if (old_state != FAILOVER_STATUS_REQUIRE) {
error_report("Unknown error for failover, old_state = %s",
FailoverStatus_lookup[old_state]);
return;
}
/* TODO: Do failover work */ /* TODO: Do failover work */
} }
void failover_request_active(Error **errp) void failover_request_active(Error **errp)
{ {
if (failover_set_state(FAILOVER_STATUS_NONE,
FAILOVER_STATUS_REQUIRE) != FAILOVER_STATUS_NONE) {
error_setg(errp, "COLO failover is already actived");
return;
}
failover_bh = qemu_bh_new(colo_failover_bh, NULL); failover_bh = qemu_bh_new(colo_failover_bh, NULL);
qemu_bh_schedule(failover_bh); qemu_bh_schedule(failover_bh);
} }
void failover_init_state(void)
{
failover_state = FAILOVER_STATUS_NONE;
}
FailoverStatus failover_set_state(FailoverStatus old_state,
FailoverStatus new_state)
{
FailoverStatus old;
old = atomic_cmpxchg(&failover_state, old_state, new_state);
if (old == old_state) {
trace_colo_failover_set_state(FailoverStatus_lookup[new_state]);
}
return old;
}
FailoverStatus failover_get_state(void)
{
return atomic_read(&failover_state);
}
void qmp_x_colo_lost_heartbeat(Error **errp) void qmp_x_colo_lost_heartbeat(Error **errp)
{ {
if (get_colo_mode() == COLO_MODE_UNKNOWN) { if (get_colo_mode() == COLO_MODE_UNKNOWN) {
......
...@@ -232,6 +232,8 @@ static void colo_process_checkpoint(MigrationState *s) ...@@ -232,6 +232,8 @@ static void colo_process_checkpoint(MigrationState *s)
Error *local_err = NULL; Error *local_err = NULL;
int ret; int ret;
failover_init_state();
s->rp_state.from_dst_file = qemu_file_get_return_path(s->to_dst_file); s->rp_state.from_dst_file = qemu_file_get_return_path(s->to_dst_file);
if (!s->rp_state.from_dst_file) { if (!s->rp_state.from_dst_file) {
error_report("Open QEMUFile from_dst_file failed"); error_report("Open QEMUFile from_dst_file failed");
...@@ -332,6 +334,8 @@ void *colo_process_incoming_thread(void *opaque) ...@@ -332,6 +334,8 @@ void *colo_process_incoming_thread(void *opaque)
migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE,
MIGRATION_STATUS_COLO); MIGRATION_STATUS_COLO);
failover_init_state();
mis->to_src_file = qemu_file_get_return_path(mis->from_src_file); mis->to_src_file = qemu_file_get_return_path(mis->from_src_file);
if (!mis->to_src_file) { if (!mis->to_src_file) {
error_report("COLO incoming thread: Open QEMUFile to_src_file failed"); error_report("COLO incoming thread: Open QEMUFile to_src_file failed");
......
...@@ -212,3 +212,4 @@ migration_tls_incoming_handshake_complete(void) "" ...@@ -212,3 +212,4 @@ migration_tls_incoming_handshake_complete(void) ""
colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'" colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'"
colo_send_message(const char *msg) "Send '%s' message" colo_send_message(const char *msg) "Send '%s' message"
colo_receive_message(const char *msg) "Receive '%s' message" colo_receive_message(const char *msg) "Receive '%s' message"
colo_failover_set_state(const char *new_state) "new state %s"
...@@ -839,6 +839,24 @@ ...@@ -839,6 +839,24 @@
{ 'enum': 'COLOMode', { 'enum': 'COLOMode',
'data': [ 'unknown', 'primary', 'secondary'] } 'data': [ 'unknown', 'primary', 'secondary'] }
##
# @FailoverStatus
#
# An enumeration of COLO failover status
#
# @none: no failover has ever happened
#
# @require: got failover requirement but not handled
#
# @active: in the process of doing failover
#
# @completed: finish the process of failover
#
# Since: 2.8
##
{ 'enum': 'FailoverStatus',
'data': [ 'none', 'require', 'active', 'completed'] }
## ##
# @x-colo-lost-heartbeat # @x-colo-lost-heartbeat
# #
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册