static int q_lib_init(void) { votequorum_callbacks_t vq_callbacks; quorum_callbacks_t q_callbacks; int ret = 0; int retry = 3; int fd; if (vq_handle == 0) { qb_log (LOG_INFO, "votequorum_initialize"); vq_callbacks.votequorum_notify_fn = votequorum_notification_fn; vq_callbacks.votequorum_expectedvotes_notify_fn = NULL; ret = CS_ERR_NOT_EXIST; while (ret == CS_ERR_NOT_EXIST && retry > 0) { ret = votequorum_initialize (&vq_handle, &vq_callbacks); if (ret == CS_ERR_NOT_EXIST) { sleep (1); retry--; } } if (ret != CS_OK) { qb_log (LOG_ERR, "votequorum_initialize FAILED: %d", ret); vq_handle = 0; } else { ret = votequorum_trackstart (vq_handle, vq_handle, CS_TRACK_CHANGES); if (ret != CS_OK) { qb_log (LOG_ERR, "votequorum_trackstart FAILED: %d", ret); } votequorum_fd_get (vq_handle, &fd); qb_loop_poll_add (ta_poll_handle_get(), QB_LOOP_MED, fd, POLLIN|POLLNVAL, NULL, vq_dispatch_wrapper_fn); } } if (q_handle == 0) { uint32_t q_type; qb_log (LOG_INFO, "quorum_initialize"); q_callbacks.quorum_notify_fn = quorum_notification_fn; ret = quorum_initialize (&q_handle, &q_callbacks, &q_type); if (ret != CS_OK) { qb_log (LOG_ERR, "quorum_initialize FAILED: %d", ret); q_handle = 0; } else { ret = quorum_trackstart (q_handle, CS_TRACK_CHANGES); if (ret != CS_OK) { qb_log (LOG_ERR, "quorum_trackstart FAILED: %d", ret); } quorum_fd_get (q_handle, &fd); qb_loop_poll_add (ta_poll_handle_get(), QB_LOOP_MED, fd, POLLIN|POLLNVAL, NULL, q_dispatch_wrapper_fn); } } return ret; }
int main(int argc, char *argv[]) { int ret = 0; #ifdef EXPERIMENTAL_QUORUM_DEVICE_API int pollcount=0, polltime=1; int err; if ( (err=votequorum_initialize(&handle, NULL)) != CS_OK) { fprintf(stderr, "votequorum_initialize FAILED: %d\n", err); return -1; } print_info(1); if (argc >= 2 && atoi(argv[1])) { pollcount = atoi(argv[1]); } if (argc >= 3 && atoi(argv[2])) { polltime = atoi(argv[2]); } if (argc >= 2) { if ( (err=votequorum_qdevice_register(handle, "QDEVICE")) != CS_OK) { fprintf(stderr, "qdevice_register FAILED: %d\n", err); ret = -1; goto out; } while (pollcount--) { print_info(0); if ((err=votequorum_qdevice_poll(handle, "QDEVICE", 1)) != CS_OK) { fprintf(stderr, "qdevice poll FAILED: %d\n", err); ret = -1; goto out; } print_info(0); sleep(polltime); } if ((err= votequorum_qdevice_unregister(handle, "QDEVICE")) != CS_OK) { fprintf(stderr, "qdevice unregister FAILED: %d\n", err); ret = -1; goto out; } } print_info(1); out: votequorum_finalize(handle); #else fprintf(stderr, "qdevice support is not built in corosync/votequorum\n"); #endif return ret; }
static int init_all(void) { cmap_handle = 0; q_handle = 0; v_handle = 0; c_handle = 0; if (cmap_initialize(&cmap_handle) != CS_OK) { fprintf(stderr, "Cannot initialize CMAP service\n"); cmap_handle = 0; goto out; } if (quorum_initialize(&q_handle, &q_callbacks, &q_type) != CS_OK) { fprintf(stderr, "Cannot initialize QUORUM service\n"); q_handle = 0; goto out; } if (corosync_cfg_initialize(&c_handle, &c_callbacks) != CS_OK) { fprintf(stderr, "Cannot initialise CFG service\n"); c_handle = 0; goto out; } if (using_votequorum() <= 0) { return 0; } if (votequorum_initialize(&v_handle, &v_callbacks) != CS_OK) { fprintf(stderr, "Cannot initialise VOTEQUORUM service\n"); v_handle = 0; goto out; } if (cmap_get_uint32(cmap_handle, "runtime.votequorum.this_node_id", &our_nodeid) != CS_OK) { fprintf(stderr, "Unable to retrieve this_node_id\n"); goto out; } return 0; out: return -1; }
static int set_expected(int expected_votes) { votequorum_handle_t v_handle; votequorum_callbacks_t v_callbacks; int err; 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); return err; } if ( (err=votequorum_setexpected(v_handle, expected_votes)) != CS_OK) fprintf(stderr, "set expected votes FAILED: %d\n", err); votequorum_finalize(v_handle); return err==CS_OK?0:err; }
int main(int argc, char *argv[]) { int ret = 0; int cast_vote = 1, master_wins = 0; int pollcount=0, polltime=1, quiet=0, once=0; int err; int opt; const char *devicename = "QDEVICE"; const char *options = "n:p:t:cmq1h"; while ((opt = getopt(argc, argv, options)) != -1) { switch (opt) { case 'm': master_wins = 1; break; case 'c': cast_vote = 1; break; case '1': once = 1; break; case 'q': quiet = 1; break; case 'p': pollcount = atoi(optarg)+1; break; case 'n': devicename = strdup(optarg); break; case 't': polltime = atoi(optarg); break; case 'h': usage(argv[0]); exit(0); } } if ( (err=votequorum_initialize(&handle, NULL)) != CS_OK) { fprintf(stderr, "votequorum_initialize FAILED: %d\n", err); return -1; } if (quiet && once) { fprintf(stderr, "setting both -q (quet) and -1 (once) makes no sense\n"); usage(argv[0]); exit(1); } if (!quiet) { print_info(1); } if (once) { exit(0); } if (argc >= 2) { if ( (err=votequorum_qdevice_register(handle, devicename)) != CS_OK) { fprintf(stderr, "qdevice_register FAILED: %d\n", err); ret = -1; goto out; } if ( (err=votequorum_qdevice_master_wins(handle, devicename, master_wins)) != CS_OK) { fprintf(stderr, "qdevice_master_wins FAILED: %d\n", err); ret = -1; goto out; } while (--pollcount) { if (!quiet) print_info(0); if ((err=votequorum_qdevice_poll(handle, devicename, cast_vote)) != CS_OK) { fprintf(stderr, "qdevice poll FAILED: %d\n", err); ret = -1; goto out; } if (!quiet) print_info(0); sleep(polltime); } if ((err= votequorum_qdevice_unregister(handle, devicename)) != CS_OK) { fprintf(stderr, "qdevice unregister FAILED: %d\n", err); ret = -1; goto out; } } if (!quiet) print_info(1); out: votequorum_finalize(handle); return ret; }
static int show_nodes(nodeid_format_t nodeid_format, name_format_t name_format) { quorum_handle_t q_handle = 0; votequorum_handle_t v_handle = 0; corosync_cfg_handle_t c_handle = 0; corosync_cfg_callbacks_t c_callbacks; int i; int using_vq = 0; quorum_callbacks_t q_callbacks; votequorum_callbacks_t v_callbacks; int err; int result = EXIT_FAILURE; q_callbacks.quorum_notify_fn = quorum_notification_fn; err=quorum_initialize(&q_handle, &q_callbacks); if (err != CS_OK) { fprintf(stderr, "Cannot connect to quorum service, is it loaded?\n"); return result; } v_callbacks.votequorum_notify_fn = NULL; v_callbacks.votequorum_expectedvotes_notify_fn = NULL; using_vq = using_votequorum(); if (using_vq) { if ( (err=votequorum_initialize(&v_handle, &v_callbacks)) != CS_OK) { fprintf(stderr, "votequorum_initialize FAILED: %d, this is probably a configuration error\n", err); v_handle = 0; goto err_exit; } } err = quorum_trackstart(q_handle, CS_TRACK_CURRENT); if (err != CS_OK) { fprintf(stderr, "quorum_trackstart FAILED: %d\n", err); goto err_exit; } g_called = 0; while (g_called == 0) quorum_dispatch(q_handle, CS_DISPATCH_ONE); quorum_finalize(q_handle); q_handle = 0; err = corosync_cfg_initialize(&c_handle, &c_callbacks); if (err != CS_OK) { fprintf(stderr, "Cannot initialise CFG service\n"); c_handle = 0; goto err_exit; } if (using_vq) printf("Nodeid Votes Name\n"); else printf("Nodeid Name\n"); for (i=0; i < g_view_list_entries; i++) { if (nodeid_format == NODEID_FORMAT_DECIMAL) { printf("%4u ", g_view_list[i]); } else { printf("0x%04x ", g_view_list[i]); } if (using_vq) { printf("%3d %s\n", get_votes(v_handle, g_view_list[i]), node_name(c_handle, g_view_list[i], name_format)); } else { printf("%s\n", node_name(c_handle, g_view_list[i], name_format)); } } result = EXIT_SUCCESS; err_exit: if (q_handle != 0) { quorum_finalize (q_handle); } if (using_vq && v_handle != 0) { votequorum_finalize (v_handle); } if (c_handle != 0) { corosync_cfg_finalize (c_handle); } return result; }
static void show_status(void) { quorum_handle_t q_handle; votequorum_handle_t v_handle; votequorum_callbacks_t v_callbacks; quorum_callbacks_t callbacks; struct votequorum_info info; int is_quorate; int err; callbacks.quorum_notify_fn = quorum_notification_fn; err=quorum_initialize(&q_handle, &callbacks); if (err != CS_OK) { fprintf(stderr, "Cannot connect to quorum service, is it loaded?\n"); return; } err=quorum_getquorate(q_handle, &is_quorate); if (err != CS_OK) { fprintf(stderr, "quorum_getquorate FAILED: %d\n", err); return; } err=quorum_trackstart(q_handle, CS_TRACK_CURRENT); if (err != CS_OK) { fprintf(stderr, "quorum_trackstart FAILED: %d\n", err); return; } g_called = 0; while (g_called == 0) quorum_dispatch(q_handle, CS_DISPATCH_ONE); quorum_finalize(q_handle); printf("Version: %s\n", VERSION); printf("Nodes: %d\n", g_view_list_entries); printf("Ring ID: %" PRIu64 "\n", g_ring_id); printf("Quorum type: %s\n", get_quorum_type()); printf("Quorate: %s\n", is_quorate?"Yes":"No"); if (using_votequorum()) { 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; } 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"); } } err_exit: return; }
int main(int argc, char *argv[]) { int ret = 0; int cast_vote = 1, master_wins = 0; int pollcount=0, polltime=1, quiet=0, once=0; int send_old_ringid = 0; int err; int opt; votequorum_callbacks_t callbacks; const char *devicename = "QDEVICE"; const char *options = "F:n:p:t:cmq1h"; memset(&callbacks, 0, sizeof(callbacks)); callbacks.votequorum_notify_fn = votequorum_notification_fn; while ((opt = getopt(argc, argv, options)) != -1) { switch (opt) { case 'm': master_wins = 1; break; case 'c': cast_vote = 1; break; case '1': once = 1; break; case 'q': quiet = 1; break; case 'F': send_old_ringid = atoi(optarg)+1; break; case 'p': pollcount = atoi(optarg)+1; break; case 'n': devicename = strdup(optarg); break; case 't': polltime = atoi(optarg); break; case 'h': usage(argv[0]); exit(0); } } if ( (err=votequorum_initialize(&handle, &callbacks)) != CS_OK) { fprintf(stderr, "votequorum_initialize FAILED: %d\n", err); return -1; } if (quiet && once) { fprintf(stderr, "setting both -q (quet) and -1 (once) makes no sense\n"); usage(argv[0]); exit(1); } if (!quiet) { print_info(1); } if (once) { exit(0); } if (argc >= 2) { if ( (err = votequorum_trackstart(handle, handle, CS_TRACK_CHANGES)) != CS_OK) { fprintf(stderr, "votequorum_trackstart FAILED: %d\n", err); ret = -1; goto out; } if ( (err=votequorum_qdevice_register(handle, devicename)) != CS_OK) { fprintf(stderr, "qdevice_register FAILED: %d\n", err); ret = -1; goto out; } if ( (err=votequorum_qdevice_master_wins(handle, devicename, master_wins)) != CS_OK) { fprintf(stderr, "qdevice_master_wins FAILED: %d\n", err); ret = -1; goto out; } while (--pollcount) { if (votequorum_dispatch(handle, CS_DISPATCH_ALL) != CS_OK) { fprintf(stderr, "votequorum_dispatch error\n"); ret = -1; goto out; } if (!quiet) print_info(0); if (no_sent_old_ringid + 1 >= send_old_ringid) { /* * Finally send correct ringid */ memcpy(&ring_id_to_send, &last_received_ring_id, sizeof(ring_id_to_send)); } else { no_sent_old_ringid++; } if ((err=votequorum_qdevice_poll(handle, devicename, cast_vote, ring_id_to_send)) != CS_OK && err != CS_ERR_MESSAGE_ERROR) { fprintf(stderr, "qdevice poll FAILED: %d\n", err); ret = -1; goto out; } if (err == CS_ERR_MESSAGE_ERROR) { fprintf(stderr, "qdevice poll passed OLD ring_id\n"); } if (!quiet) print_info(0); sleep(polltime); } if ((err= votequorum_qdevice_unregister(handle, devicename)) != CS_OK) { fprintf(stderr, "qdevice unregister FAILED: %d\n", err); ret = -1; goto out; } } if (!quiet) print_info(1); out: votequorum_finalize(handle); return ret; }
int main(int argc, char *argv[]) { int ret = 0; int cast_vote = 1, master_wins = 1; int pollcount=0, polltime=1; int err; if ( (err=votequorum_initialize(&handle, NULL)) != CS_OK) { fprintf(stderr, "votequorum_initialize FAILED: %d\n", err); return -1; } print_info(1); if (argc >= 2 && atoi(argv[1])) { pollcount = atoi(argv[1]); } if (argc >= 3 && atoi(argv[2])) { polltime = atoi(argv[2]); } if (argc >= 4) { cast_vote = atoi(argv[3]); } if (argc >= 5) { master_wins = atoi(argv[4]); } if (argc >= 2) { if ( (err=votequorum_qdevice_register(handle, "QDEVICE")) != CS_OK) { fprintf(stderr, "qdevice_register FAILED: %d\n", err); ret = -1; goto out; } if ( (err=votequorum_qdevice_master_wins(handle, "QDEVICE", master_wins)) != CS_OK) { fprintf(stderr, "qdevice_master_wins FAILED: %d\n", err); ret = -1; goto out; } while (pollcount--) { print_info(0); if ((err=votequorum_qdevice_poll(handle, "QDEVICE", cast_vote)) != CS_OK) { fprintf(stderr, "qdevice poll FAILED: %d\n", err); ret = -1; goto out; } print_info(0); sleep(polltime); } if ((err= votequorum_qdevice_unregister(handle, "QDEVICE")) != CS_OK) { fprintf(stderr, "qdevice unregister FAILED: %d\n", err); ret = -1; goto out; } } print_info(1); out: votequorum_finalize(handle); return ret; }
int main(int argc, char *argv[]) { struct votequorum_info info; votequorum_callbacks_t callbacks; int err; if (argc > 1 && strcmp(argv[1], "-h")==0) { fprintf(stderr, "usage: %s [new-expected] [new-votes]\n", argv[0]); return 0; } callbacks.votequorum_notify_fn = votequorum_notification_fn; callbacks.votequorum_expectedvotes_notify_fn = votequorum_expectedvotes_notification_fn; if ( (err=votequorum_initialize(&g_handle, &callbacks)) != CS_OK) fprintf(stderr, "votequorum_initialize FAILED: %d\n", err); if ( (err = votequorum_trackstart(g_handle, g_handle, CS_TRACK_CHANGES)) != CS_OK) fprintf(stderr, "votequorum_trackstart FAILED: %d\n", err); if ( (err=votequorum_getinfo(g_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\n", info.quorum); printf("flags "); if (info.flags & VOTEQUORUM_INFO_FLAG_TWONODE) printf("2Node "); if (info.flags & VOTEQUORUM_INFO_FLAG_QUORATE) printf("Quorate "); if (info.flags & VOTEQUORUM_INFO_WAIT_FOR_ALL) printf("WaitForAll "); if (info.flags & VOTEQUORUM_INFO_LAST_MAN_STANDING) printf("LastManStanding "); if (info.flags & VOTEQUORUM_INFO_AUTO_TIE_BREAKER) printf("AutoTieBreaker "); if (info.flags & VOTEQUORUM_INFO_LEAVE_REMOVE) printf("LeaveRemove "); printf("\n"); } if (argc >= 2 && atoi(argv[1])) { if ( (err=votequorum_setexpected(g_handle, atoi(argv[1]))) != CS_OK) fprintf(stderr, "set expected votes FAILED: %d\n", err); } if (argc >= 3 && atoi(argv[2])) { if ( (err=votequorum_setvotes(g_handle, 0, atoi(argv[2]))) != CS_OK) fprintf(stderr, "set votes FAILED: %d\n", err); } if (argc >= 2) { if ( (err=votequorum_getinfo(g_handle, 0, &info)) != CS_OK) fprintf(stderr, "votequorum_getinfo2 FAILED: %d\n", err); else { printf("-------------------\n"); 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("votequorum %d\n", info.quorum); printf("flags "); if (info.flags & VOTEQUORUM_INFO_FLAG_TWONODE) printf("2Node "); if (info.flags & VOTEQUORUM_INFO_FLAG_QUORATE) printf("Quorate "); if (info.flags & VOTEQUORUM_INFO_WAIT_FOR_ALL) printf("WaitForAll "); if (info.flags & VOTEQUORUM_INFO_LAST_MAN_STANDING) printf("LastManStanding "); if (info.flags & VOTEQUORUM_INFO_AUTO_TIE_BREAKER) printf("AutoTieBreaker "); if (info.flags & VOTEQUORUM_INFO_LEAVE_REMOVE) printf("LeaveRemove "); printf("\n"); } } printf("Waiting for votequorum events, press ^C to finish\n"); printf("-------------------\n"); while (1) { if (votequorum_dispatch(g_handle, CS_DISPATCH_ALL) != CS_OK) { fprintf(stderr, "votequorum_dispatch error\n"); return -1; } } return 0; }