Zhang Chen <zhangc...@gmail.com> writes: > On Thu, Jun 7, 2018 at 8:59 PM, Markus Armbruster <arm...@redhat.com> wrote: > >> Zhang Chen <zhangc...@gmail.com> writes: >> >> > Libvirt or other high level software can use this command query colo >> status. >> > You can test this command like that: >> > {'execute':'query-colo-status'} >> > >> > Signed-off-by: Zhang Chen <zhangc...@gmail.com> >> > --- >> > migration/colo.c | 39 +++++++++++++++++++++++++++++++++++++++ >> > qapi/migration.json | 34 ++++++++++++++++++++++++++++++++++ >> > 2 files changed, 73 insertions(+) >> > >> > diff --git a/migration/colo.c b/migration/colo.c >> > index bedb677788..8c6b8e9a4e 100644 >> > --- a/migration/colo.c >> > +++ b/migration/colo.c >> > @@ -29,6 +29,7 @@ >> > #include "net/colo.h" >> > #include "block/block.h" >> > #include "qapi/qapi-events-migration.h" >> > +#include "qapi/qmp/qerror.h" >> > >> > static bool vmstate_loading; >> > static Notifier packets_compare_notifier; >> > @@ -237,6 +238,44 @@ void qmp_xen_colo_do_checkpoint(Error **errp) >> > #endif >> > } >> > >> > +COLOStatus *qmp_query_colo_status(Error **errp) >> > +{ >> > + int state; >> > + COLOStatus *s = g_new0(COLOStatus, 1); >> > + >> > + s->mode = get_colo_mode(); >> > + >> > + switch (s->mode) { >> > + case COLO_MODE_UNKNOWN: >> > + error_setg(errp, "COLO is disabled"); >> > + state = MIGRATION_STATUS_NONE; >> > + break; >> > + case COLO_MODE_PRIMARY: >> > + state = migrate_get_current()->state; >> > + break; >> > + case COLO_MODE_SECONDARY: >> > + state = migration_incoming_get_current()->state; >> > + break; >> > + default: >> > + abort(); >> > + } >> > + >> > + s->colo_running = state == MIGRATION_STATUS_COLO; >> > + >> > + switch (failover_get_state()) { >> > + case FAILOVER_STATUS_NONE: >> > + s->reason = COLO_EXIT_REASON_NONE; >> > + break; >> > + case FAILOVER_STATUS_REQUIRE: >> > + s->reason = COLO_EXIT_REASON_REQUEST; >> > + break; >> > + default: >> > + s->reason = COLO_EXIT_REASON_ERROR; >> > + } >> > + >> > + return s; >> > +} >> > + >> > static void colo_send_message(QEMUFile *f, COLOMessage msg, >> > Error **errp) >> > { >> > diff --git a/qapi/migration.json b/qapi/migration.json >> > index 93136ce5a0..356a370949 100644 >> > --- a/qapi/migration.json >> > +++ b/qapi/migration.json >> > @@ -1231,6 +1231,40 @@ >> > ## >> > { 'command': 'xen-colo-do-checkpoint' } >> > >> > +## >> > +# @COLOStatus: >> > +# >> > +# The result format for 'query-colo-status'. >> > +# >> > +# @mode: COLO running mode. If COLO is running, this field will return >> > +# 'primary' or 'secodary'. >> > +# >> > +# @colo-running: true if COLO is running. >> > +# >> > +# @reason: describes the reason for the COLO exit. >> >> What's the value of @reason before a "COLO exit"? >> > > Before a "COLO exit", we just return 'none' in this field.
Please add that to the documentation. Please excuse my ignorance on COLO... I'm still not sure I fully understand how the three members are related, or even how the COLO state machine works and how its related to / embedded in RunState. I searched docs/ for a state diagram, but couldn't find one. According to runstate_transitions_def[], the part of the RunState state machine that's directly connected to state "colo" looks like this: inmigrate -+ | paused ----+ | migrate ---+-> colo <------> running | suspended -+ | watchdog --+ For each of the seven state transitions: how is the state transition triggered (e.g. by QMP command, spontaneously when a certain condition is detected, ...), and what events (if any) are emitted then? How is @colo-running related to the run state? Which run states are considered to be "before a COLO exit"? If "before a COLO exit" doesn't map to run states, the state machine is too coarse to fully describe COLO, and I'd like to see a suitably refined one. If @colo-running is true, then @mode is either "primary" or "secondary". What are the possible values when @colo-running is false? [...]