Message ID | 1470227172-13704-18-git-send-email-zhang.zhanghailiang@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
* zhanghailiang (zhang.zhanghailiang@huawei.com) wrote: > + error_report("Unkown error for failover, old_state=%d", old_state); Tiny typo; 'Unknown'. Don't bother reposting just for that, we can fix it later; or fix it if you have to repost anyway. Dave > + 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 b445279..9afc527 100644 > --- a/migration/colo.c > +++ b/migration/colo.c > @@ -232,6 +232,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"); > @@ -331,6 +333,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/migration/trace-events b/migration/trace-events > index 82dc7a0..d9f44ba 100644 > --- a/migration/trace-events > +++ b/migration/trace-events > @@ -214,3 +214,4 @@ migration_tls_incoming_handshake_complete(void) "" > colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'" > colo_send_message(const char *msg) "Send '%s' message" > colo_receive_message(const char *msg) "Receive '%s' message" > +colo_failover_set_state(int new_state) "new state %d" > -- > 1.8.3.1 > > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
On 2016/8/9 17:17, Dr. David Alan Gilbert wrote: > * zhanghailiang (zhang.zhanghailiang@huawei.com) wrote: > >> + error_report("Unkown error for failover, old_state=%d", old_state); > > Tiny typo; 'Unknown'. > Don't bother reposting just for that, we can fix it later; or fix it if > you have to repost anyway. > OK, thanks. > Dave > >> + 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 b445279..9afc527 100644 >> --- a/migration/colo.c >> +++ b/migration/colo.c >> @@ -232,6 +232,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"); >> @@ -331,6 +333,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/migration/trace-events b/migration/trace-events >> index 82dc7a0..d9f44ba 100644 >> --- a/migration/trace-events >> +++ b/migration/trace-events >> @@ -214,3 +214,4 @@ migration_tls_incoming_handshake_complete(void) "" >> colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'" >> colo_send_message(const char *msg) "Send '%s' message" >> colo_receive_message(const char *msg) "Receive '%s' message" >> +colo_failover_set_state(int new_state) "new state %d" >> -- >> 1.8.3.1 >> >> > -- > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK > > . >
diff --git a/include/migration/failover.h b/include/migration/failover.h index 3274735..fe71bb4 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 413675d..69aac55 100644 --- a/migration/colo-failover.c +++ b/migration/colo-failover.c @@ -15,22 +15,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 b445279..9afc527 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -232,6 +232,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"); @@ -331,6 +333,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/migration/trace-events b/migration/trace-events index 82dc7a0..d9f44ba 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -214,3 +214,4 @@ migration_tls_incoming_handshake_complete(void) "" colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'" colo_send_message(const char *msg) "Send '%s' message" colo_receive_message(const char *msg) "Receive '%s' message" +colo_failover_set_state(int new_state) "new state %d"