Reviewed-by: Steven Dake <sdake@xxxxxxxxxx> On 12/12/2011 06:00 AM, Fabio M. Di Nitto wrote: > From: "Fabio M. Di Nitto" <fdinitto@xxxxxxxxxx> > > -1 indicates an error communicating with corosync/quorum/votequorum service > 0 node is not quorate > 1 node is quorate > > also add more error reporting and a couple of missing calls to finalize > > Signed-off-by: Fabio M. Di Nitto <fdinitto@xxxxxxxxxx> > --- > :100644 100644 0fb5e60... 2fd2b16... M tools/corosync-quorumtool.c > tools/corosync-quorumtool.c | 91 ++++++++++++++++++++++++++++--------------- > 1 files changed, 59 insertions(+), 32 deletions(-) > > diff --git a/tools/corosync-quorumtool.c b/tools/corosync-quorumtool.c > index 0fb5e60..2fd2b16 100644 > --- a/tools/corosync-quorumtool.c > +++ b/tools/corosync-quorumtool.c > @@ -258,7 +258,12 @@ static void quorum_notification_fn( > } > } > > -static void show_status(void) > +/* > + * return 1 if quorate > + * 0 if not quorate > + * -1 on error > + */ > +static int show_status(void) > { > quorum_handle_t q_handle; > votequorum_handle_t v_handle; > @@ -272,26 +277,39 @@ static void show_status(void) > err=quorum_initialize(&q_handle, &callbacks); > if (err != CS_OK) { > fprintf(stderr, "Cannot connect to quorum service, is it loaded?\n"); > - return; > + return -1; > } > > err=quorum_getquorate(q_handle, &is_quorate); > if (err != CS_OK) { > fprintf(stderr, "quorum_getquorate FAILED: %d\n", err); > - return; > + goto quorum_err; > } > > err=quorum_trackstart(q_handle, CS_TRACK_CURRENT); > if (err != CS_OK) { > fprintf(stderr, "quorum_trackstart FAILED: %d\n", err); > - return; > + goto quorum_err; > } > > g_called = 0; > - while (g_called == 0) > - quorum_dispatch(q_handle, CS_DISPATCH_ONE); > + while (g_called == 0 && err == CS_OK) { > + err = quorum_dispatch(q_handle, CS_DISPATCH_ONE); > + if (err != CS_OK) { > + fprintf(stderr, "quorum_dispatch FAILED: %d\n", err); > + } > + } > > - quorum_finalize(q_handle); > + if (quorum_trackstop(q_handle) != CS_OK) { > + fprintf(stderr, "quorum_trackstop FAILED: %d\n", err); > + } > + > +quorum_err: > + if (quorum_finalize(q_handle) != CS_OK) { > + fprintf(stderr, "quorum_finalize FAILED: %d\n", err); > + } > + if (err < 0) > + return err; > > printf("Version: %s\n", VERSION); > printf("Nodes: %d\n", g_view_list_entries); > @@ -299,34 +317,42 @@ static void show_status(void) > printf("Quorum type: %s\n", get_quorum_type()); > printf("Quorate: %s\n", is_quorate?"Yes":"No"); > > - if (using_votequorum()) { > + if (!using_votequorum()) { > + return is_quorate; > + } > + > + v_callbacks.votequorum_notify_fn = NULL; > + v_callbacks.votequorum_expectedvotes_notify_fn = NULL; > + > + if ((err=votequorum_initialize(&v_handle, &v_callbacks)) != CS_OK) { > + fprintf(stderr, "votequorum_initialize FAILED: %d, this is probably a configuration error\n", err); > + goto err_exit; > + } > > - v_callbacks.votequorum_notify_fn = NULL; > - v_callbacks.votequorum_expectedvotes_notify_fn = NULL; > + if ((err=votequorum_getinfo(v_handle, 0, &info)) == CS_OK) { > + printf("Node votes: %d\n", info.node_votes); > + printf("Expected votes: %d\n", info.node_expected_votes); > + printf("Highest expected: %d\n", info.highest_expected); > + printf("Total votes: %d\n", info.total_votes); > + printf("Quorum: %d %s\n", info.quorum, info.flags & VOTEQUORUM_INFO_FLAG_QUORATE?" ":"Activity blocked"); > + printf("Flags: "); > + if (info.flags & VOTEQUORUM_INFO_FLAG_HASSTATE) printf("HasState "); > + if (info.flags & VOTEQUORUM_INFO_FLAG_DISALLOWED) printf("DisallowedNodes "); > + if (info.flags & VOTEQUORUM_INFO_FLAG_TWONODE) printf("2Node "); > + if (info.flags & VOTEQUORUM_INFO_FLAG_QUORATE) printf("Quorate "); > + printf("\n"); > + } else { > + fprintf(stderr, "votequorum_getinfo FAILED: %d\n", err); > + } > > - if ( (err=votequorum_initialize(&v_handle, &v_callbacks)) != CS_OK) { > - fprintf(stderr, "votequorum_initialize FAILED: %d, this is probably a configuration error\n", err); > - goto err_exit; > - } > - if ( (err=votequorum_getinfo(v_handle, 0, &info)) != CS_OK) > - fprintf(stderr, "votequorum_getinfo FAILED: %d\n", err); > - else { > - printf("Node votes: %d\n", info.node_votes); > - printf("Expected votes: %d\n", info.node_expected_votes); > - printf("Highest expected: %d\n", info.highest_expected); > - printf("Total votes: %d\n", info.total_votes); > - printf("Quorum: %d %s\n", info.quorum, info.flags & VOTEQUORUM_INFO_FLAG_QUORATE?" ":"Activity blocked"); > - printf("Flags: "); > - if (info.flags & VOTEQUORUM_INFO_FLAG_HASSTATE) printf("HasState "); > - if (info.flags & VOTEQUORUM_INFO_FLAG_DISALLOWED) printf("DisallowedNodes "); > - if (info.flags & VOTEQUORUM_INFO_FLAG_TWONODE) printf("2Node "); > - if (info.flags & VOTEQUORUM_INFO_FLAG_QUORATE) printf("Quorate "); > - printf("\n"); > - } > + if (votequorum_finalize(v_handle) != CS_OK) { > + fprintf(stderr, "votequorum_finalize FAILED: %d\n", err); > } > > - err_exit: > - return; > +err_exit: > + if (err != CS_OK) > + return err; > + return is_quorate; > } > > static int show_nodes(nodeid_format_t nodeid_format, name_format_t name_format) > @@ -490,12 +516,13 @@ int main (int argc, char *argv[]) { > switch (command_opt) { > case CMD_UNKNOWN: > show_usage(argv[0]); > + ret = -1; > break; > case CMD_SHOWNODES: > ret = show_nodes(nodeid_format, address_format); > break; > case CMD_SHOWSTATUS: > - show_status(); > + ret = show_status(); > break; > case CMD_SETVOTES: > ret = set_votes(nodeid, votes); _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss