From: "Fabio M. Di Nitto" <fdinitto@xxxxxxxxxx> as agreed, the API has not been tested yet. Adding later is better than removing it. Signed-off-by: Fabio M. Di Nitto <fdinitto@xxxxxxxxxx> --- exec/votequorum.c | 168 ++++++++++-------- include/corosync/ipc_votequorum.h | 9 +- include/corosync/votequorum.h | 51 +++--- lib/votequorum.c | 353 +++++++++++++++++++------------------ test/testvotequorum2.c | 8 +- 5 files changed, 311 insertions(+), 278 deletions(-) diff --git a/exec/votequorum.c b/exec/votequorum.c index d3f7757..f465714 100644 --- a/exec/votequorum.c +++ b/exec/votequorum.c @@ -67,10 +67,13 @@ static struct corosync_api_v1 *corosync_api; * Silly default to prevent accidents! */ #define DEFAULT_EXPECTED 1024 + +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API #define DEFAULT_QDEV_POLL 10000 static unsigned int quorumdev_poll = DEFAULT_QDEV_POLL; static char quorum_device_name[VOTEQUORUM_MAX_QDISK_NAME_LEN]; +#endif static uint8_t two_node = 0; @@ -202,7 +205,9 @@ static struct list_head trackers_list; * votequorum timers */ +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API static corosync_timer_handle_t quorum_device_timer; +#endif static corosync_timer_handle_t last_man_standing_timer; static int last_man_standing_timer_set = 0; @@ -264,6 +269,13 @@ static void message_handler_req_lib_votequorum_setexpected (void *conn, static void message_handler_req_lib_votequorum_setvotes (void *conn, const void *message); +static void message_handler_req_lib_votequorum_trackstart (void *conn, + const void *message); + +static void message_handler_req_lib_votequorum_trackstop (void *conn, + const void *message); + +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API static void message_handler_req_lib_votequorum_qdisk_register (void *conn, const void *message); @@ -275,11 +287,7 @@ static void message_handler_req_lib_votequorum_qdisk_poll (void *conn, static void message_handler_req_lib_votequorum_qdisk_getinfo (void *conn, const void *message); - -static void message_handler_req_lib_votequorum_trackstart (void *conn, - const void *message); -static void message_handler_req_lib_votequorum_trackstop (void *conn, - const void *message); +#endif static struct corosync_lib_handler quorum_lib_service[] = { @@ -296,28 +304,30 @@ static struct corosync_lib_handler quorum_lib_service[] = .flow_control = COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED }, { /* 3 */ - .lib_handler_fn = message_handler_req_lib_votequorum_qdisk_register, + .lib_handler_fn = message_handler_req_lib_votequorum_trackstart, .flow_control = COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED }, { /* 4 */ - .lib_handler_fn = message_handler_req_lib_votequorum_qdisk_unregister, + .lib_handler_fn = message_handler_req_lib_votequorum_trackstop, .flow_control = COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API }, { /* 5 */ - .lib_handler_fn = message_handler_req_lib_votequorum_qdisk_poll, + .lib_handler_fn = message_handler_req_lib_votequorum_qdisk_register, .flow_control = COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED }, { /* 6 */ - .lib_handler_fn = message_handler_req_lib_votequorum_qdisk_getinfo, + .lib_handler_fn = message_handler_req_lib_votequorum_qdisk_unregister, .flow_control = COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED }, { /* 7 */ - .lib_handler_fn = message_handler_req_lib_votequorum_trackstart, + .lib_handler_fn = message_handler_req_lib_votequorum_qdisk_poll, .flow_control = COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED }, { /* 8 */ - .lib_handler_fn = message_handler_req_lib_votequorum_trackstop, + .lib_handler_fn = message_handler_req_lib_votequorum_qdisk_getinfo, .flow_control = COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED +#endif } }; @@ -703,9 +713,11 @@ static void votequorum_readconfig_dynamic(void) us->votes = 1; } +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API if (icmap_get_uint32("quorum.quorumdev_poll", &quorumdev_poll) != CS_OK) { quorumdev_poll = DEFAULT_QDEV_POLL; } +#endif icmap_get_uint8("quorum.two_node", &two_node); @@ -1260,6 +1272,7 @@ static int quorum_lib_exit_fn (void *conn) * library internal functions */ +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API static void quorum_device_timer_fn(void *arg) { ENTER(); @@ -1281,6 +1294,7 @@ static void quorum_device_timer_fn(void *arg) LEAVE(); } +#endif /* * Library Handler Functions @@ -1438,6 +1452,72 @@ error_exit: LEAVE(); } +static void message_handler_req_lib_votequorum_trackstart (void *conn, + const void *message) +{ + const struct req_lib_votequorum_trackstart *req_lib_votequorum_trackstart = message; + struct res_lib_votequorum_status res_lib_votequorum_status; + struct quorum_pd *quorum_pd = (struct quorum_pd *)corosync_api->ipc_private_data_get (conn); + + ENTER(); + /* + * If an immediate listing of the current cluster membership + * is requested, generate membership list + */ + if (req_lib_votequorum_trackstart->track_flags & CS_TRACK_CURRENT || + req_lib_votequorum_trackstart->track_flags & CS_TRACK_CHANGES) { + log_printf(LOGSYS_LEVEL_DEBUG, "sending initial status to %p\n", conn); + votequorum_exec_send_quorum_notification(conn, req_lib_votequorum_trackstart->context); + } + + /* + * Record requests for tracking + */ + if (req_lib_votequorum_trackstart->track_flags & CS_TRACK_CHANGES || + req_lib_votequorum_trackstart->track_flags & CS_TRACK_CHANGES_ONLY) { + + quorum_pd->track_flags = req_lib_votequorum_trackstart->track_flags; + quorum_pd->tracking_enabled = 1; + quorum_pd->tracking_context = req_lib_votequorum_trackstart->context; + + list_add (&quorum_pd->list, &trackers_list); + } + + res_lib_votequorum_status.header.size = sizeof(res_lib_votequorum_status); + res_lib_votequorum_status.header.id = MESSAGE_RES_VOTEQUORUM_STATUS; + res_lib_votequorum_status.header.error = CS_OK; + corosync_api->ipc_response_send(conn, &res_lib_votequorum_status, sizeof(res_lib_votequorum_status)); + + LEAVE(); +} + +static void message_handler_req_lib_votequorum_trackstop (void *conn, + const void *message) +{ + struct res_lib_votequorum_status res_lib_votequorum_status; + struct quorum_pd *quorum_pd = (struct quorum_pd *)corosync_api->ipc_private_data_get (conn); + int error = CS_OK; + + ENTER(); + + if (quorum_pd->tracking_enabled) { + error = CS_OK; + quorum_pd->tracking_enabled = 0; + list_del (&quorum_pd->list); + list_init (&quorum_pd->list); + } else { + error = CS_ERR_NOT_EXIST; + } + + res_lib_votequorum_status.header.size = sizeof(res_lib_votequorum_status); + res_lib_votequorum_status.header.id = MESSAGE_RES_VOTEQUORUM_STATUS; + res_lib_votequorum_status.header.error = error; + corosync_api->ipc_response_send(conn, &res_lib_votequorum_status, sizeof(res_lib_votequorum_status)); + + LEAVE(); +} + +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API static void message_handler_req_lib_votequorum_qdisk_register (void *conn, const void *message) { @@ -1561,68 +1641,4 @@ static void message_handler_req_lib_votequorum_qdisk_getinfo (void *conn, LEAVE(); } - -static void message_handler_req_lib_votequorum_trackstart (void *conn, - const void *message) -{ - const struct req_lib_votequorum_trackstart *req_lib_votequorum_trackstart = message; - struct res_lib_votequorum_status res_lib_votequorum_status; - struct quorum_pd *quorum_pd = (struct quorum_pd *)corosync_api->ipc_private_data_get (conn); - - ENTER(); - /* - * If an immediate listing of the current cluster membership - * is requested, generate membership list - */ - if (req_lib_votequorum_trackstart->track_flags & CS_TRACK_CURRENT || - req_lib_votequorum_trackstart->track_flags & CS_TRACK_CHANGES) { - log_printf(LOGSYS_LEVEL_DEBUG, "sending initial status to %p\n", conn); - votequorum_exec_send_quorum_notification(conn, req_lib_votequorum_trackstart->context); - } - - /* - * Record requests for tracking - */ - if (req_lib_votequorum_trackstart->track_flags & CS_TRACK_CHANGES || - req_lib_votequorum_trackstart->track_flags & CS_TRACK_CHANGES_ONLY) { - - quorum_pd->track_flags = req_lib_votequorum_trackstart->track_flags; - quorum_pd->tracking_enabled = 1; - quorum_pd->tracking_context = req_lib_votequorum_trackstart->context; - - list_add (&quorum_pd->list, &trackers_list); - } - - res_lib_votequorum_status.header.size = sizeof(res_lib_votequorum_status); - res_lib_votequorum_status.header.id = MESSAGE_RES_VOTEQUORUM_STATUS; - res_lib_votequorum_status.header.error = CS_OK; - corosync_api->ipc_response_send(conn, &res_lib_votequorum_status, sizeof(res_lib_votequorum_status)); - - LEAVE(); -} - -static void message_handler_req_lib_votequorum_trackstop (void *conn, - const void *message) -{ - struct res_lib_votequorum_status res_lib_votequorum_status; - struct quorum_pd *quorum_pd = (struct quorum_pd *)corosync_api->ipc_private_data_get (conn); - int error = CS_OK; - - ENTER(); - - if (quorum_pd->tracking_enabled) { - error = CS_OK; - quorum_pd->tracking_enabled = 0; - list_del (&quorum_pd->list); - list_init (&quorum_pd->list); - } else { - error = CS_ERR_NOT_EXIST; - } - - res_lib_votequorum_status.header.size = sizeof(res_lib_votequorum_status); - res_lib_votequorum_status.header.id = MESSAGE_RES_VOTEQUORUM_STATUS; - res_lib_votequorum_status.header.error = error; - corosync_api->ipc_response_send(conn, &res_lib_votequorum_status, sizeof(res_lib_votequorum_status)); - - LEAVE(); -} +#endif diff --git a/include/corosync/ipc_votequorum.h b/include/corosync/ipc_votequorum.h index 8a59d09..d083946 100644 --- a/include/corosync/ipc_votequorum.h +++ b/include/corosync/ipc_votequorum.h @@ -42,12 +42,15 @@ enum req_votequorum_types { MESSAGE_REQ_VOTEQUORUM_GETINFO = 0, MESSAGE_REQ_VOTEQUORUM_SETEXPECTED, MESSAGE_REQ_VOTEQUORUM_SETVOTES, + MESSAGE_REQ_VOTEQUORUM_TRACKSTART, + MESSAGE_REQ_VOTEQUORUM_TRACKSTOP +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API + , MESSAGE_REQ_VOTEQUORUM_QDISK_REGISTER, MESSAGE_REQ_VOTEQUORUM_QDISK_UNREGISTER, MESSAGE_REQ_VOTEQUORUM_QDISK_POLL, - MESSAGE_REQ_VOTEQUORUM_QDISK_GETINFO, - MESSAGE_REQ_VOTEQUORUM_TRACKSTART, - MESSAGE_REQ_VOTEQUORUM_TRACKSTOP + MESSAGE_REQ_VOTEQUORUM_QDISK_GETINFO +#endif }; enum res_votequorum_types { diff --git a/include/corosync/votequorum.h b/include/corosync/votequorum.h index 45ffddc..9292ca1 100644 --- a/include/corosync/votequorum.h +++ b/include/corosync/votequorum.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2011 Red Hat, Inc. + * Copyright (c) 2009-2012 Red Hat, Inc. * * All rights reserved. * @@ -42,7 +42,9 @@ extern "C" { typedef uint64_t votequorum_handle_t; +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API #define VOTEQUORUM_MAX_QDISK_NAME_LEN 255 +#endif #define VOTEQUORUM_INFO_FLAG_TWONODE 1 #define VOTEQUORUM_INFO_FLAG_QUORATE 2 @@ -70,11 +72,13 @@ struct votequorum_info { unsigned int flags; }; +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API struct votequorum_qdisk_info { unsigned int votes; unsigned int state; char name[VOTEQUORUM_MAX_QDISK_NAME_LEN]; }; +#endif typedef struct { uint32_t nodeid; @@ -154,6 +158,29 @@ cs_error_t votequorum_setvotes ( unsigned int votes); /** + * Track node and quorum changes + */ +cs_error_t votequorum_trackstart ( + votequorum_handle_t handle, + uint64_t context, + unsigned int flags ); + +cs_error_t votequorum_trackstop ( + votequorum_handle_t handle); + +/** + * Save and retrieve private data/context + */ +cs_error_t votequorum_context_get ( + votequorum_handle_t handle, + void **context); + +cs_error_t votequorum_context_set ( + votequorum_handle_t handle, + void *context); + +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API +/** * Register a quorum device * * it will be DEAD until polled @@ -183,27 +210,7 @@ cs_error_t votequorum_qdisk_getinfo ( votequorum_handle_t handle, struct votequorum_qdisk_info *info); -/** - * Track node and quorum changes - */ -cs_error_t votequorum_trackstart ( - votequorum_handle_t handle, - uint64_t context, - unsigned int flags ); - -cs_error_t votequorum_trackstop ( - votequorum_handle_t handle); - -/** - * Save and retrieve private data/context - */ -cs_error_t votequorum_context_get ( - votequorum_handle_t handle, - void **context); - -cs_error_t votequorum_context_set ( - votequorum_handle_t handle, - void *context); +#endif #ifdef __cplusplus } diff --git a/lib/votequorum.c b/lib/votequorum.c index 21468fe..e3ad3f9 100644 --- a/lib/votequorum.c +++ b/lib/votequorum.c @@ -272,182 +272,6 @@ error_exit: return (error); } -cs_error_t votequorum_qdisk_register ( - votequorum_handle_t handle, - const char *name, - unsigned int votes) -{ - cs_error_t error; - struct votequorum_inst *votequorum_inst; - struct iovec iov; - struct req_lib_votequorum_qdisk_register req_lib_votequorum_qdisk_register; - struct res_lib_votequorum_status res_lib_votequorum_status; - - if (strlen(name) > VOTEQUORUM_MAX_QDISK_NAME_LEN) - return CS_ERR_INVALID_PARAM; - - error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst)); - if (error != CS_OK) { - return (error); - } - - - req_lib_votequorum_qdisk_register.header.size = sizeof (struct req_lib_votequorum_qdisk_register); - req_lib_votequorum_qdisk_register.header.id = MESSAGE_REQ_VOTEQUORUM_QDISK_REGISTER; - strcpy(req_lib_votequorum_qdisk_register.name, name); - req_lib_votequorum_qdisk_register.votes = votes; - - iov.iov_base = (char *)&req_lib_votequorum_qdisk_register; - iov.iov_len = sizeof (struct req_lib_votequorum_qdisk_register); - - error = qb_to_cs_error(qb_ipcc_sendv_recv ( - votequorum_inst->c, - &iov, - 1, - &res_lib_votequorum_status, - sizeof (struct res_lib_votequorum_status), CS_IPC_TIMEOUT_MS)); - - if (error != CS_OK) { - goto error_exit; - } - - error = res_lib_votequorum_status.header.error; - -error_exit: - hdb_handle_put (&votequorum_handle_t_db, handle); - - return (error); -} - -cs_error_t votequorum_qdisk_poll ( - votequorum_handle_t handle, - unsigned int state) -{ - cs_error_t error; - struct votequorum_inst *votequorum_inst; - struct iovec iov; - struct req_lib_votequorum_qdisk_poll req_lib_votequorum_qdisk_poll; - struct res_lib_votequorum_status res_lib_votequorum_status; - - error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst)); - if (error != CS_OK) { - return (error); - } - - - req_lib_votequorum_qdisk_poll.header.size = sizeof (struct req_lib_votequorum_qdisk_poll); - req_lib_votequorum_qdisk_poll.header.id = MESSAGE_REQ_VOTEQUORUM_QDISK_POLL; - req_lib_votequorum_qdisk_poll.state = state; - - iov.iov_base = (char *)&req_lib_votequorum_qdisk_poll; - iov.iov_len = sizeof (struct req_lib_votequorum_qdisk_poll); - - error = qb_to_cs_error(qb_ipcc_sendv_recv ( - votequorum_inst->c, - &iov, - 1, - &res_lib_votequorum_status, - sizeof (struct res_lib_votequorum_status), CS_IPC_TIMEOUT_MS)); - - if (error != CS_OK) { - goto error_exit; - } - - error = res_lib_votequorum_status.header.error; - -error_exit: - hdb_handle_put (&votequorum_handle_t_db, handle); - - return (error); -} - -cs_error_t votequorum_qdisk_unregister ( - votequorum_handle_t handle) -{ - cs_error_t error; - struct votequorum_inst *votequorum_inst; - struct iovec iov; - struct req_lib_votequorum_general req_lib_votequorum_general; - struct res_lib_votequorum_status res_lib_votequorum_status; - - error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst)); - if (error != CS_OK) { - return (error); - } - - req_lib_votequorum_general.header.size = sizeof (struct req_lib_votequorum_general); - req_lib_votequorum_general.header.id = MESSAGE_REQ_VOTEQUORUM_QDISK_UNREGISTER; - - iov.iov_base = (char *)&req_lib_votequorum_general; - iov.iov_len = sizeof (struct req_lib_votequorum_general); - - error = qb_to_cs_error(qb_ipcc_sendv_recv ( - votequorum_inst->c, - &iov, - 1, - &res_lib_votequorum_status, - sizeof (struct res_lib_votequorum_status), CS_IPC_TIMEOUT_MS)); - - if (error != CS_OK) { - goto error_exit; - } - - error = res_lib_votequorum_status.header.error; - -error_exit: - hdb_handle_put (&votequorum_handle_t_db, handle); - - return (error); -} - - - -cs_error_t votequorum_qdisk_getinfo ( - votequorum_handle_t handle, - struct votequorum_qdisk_info *qinfo) -{ - cs_error_t error; - struct votequorum_inst *votequorum_inst; - struct iovec iov; - struct req_lib_votequorum_general req_lib_votequorum_general; - struct res_lib_votequorum_qdisk_getinfo res_lib_votequorum_qdisk_getinfo; - - error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst)); - if (error != CS_OK) { - return (error); - } - - - req_lib_votequorum_general.header.size = sizeof (struct req_lib_votequorum_general); - req_lib_votequorum_general.header.id = MESSAGE_REQ_VOTEQUORUM_QDISK_GETINFO; - - iov.iov_base = (char *)&req_lib_votequorum_general; - iov.iov_len = sizeof (struct req_lib_votequorum_general); - - error = qb_to_cs_error(qb_ipcc_sendv_recv ( - votequorum_inst->c, - &iov, - 1, - &res_lib_votequorum_qdisk_getinfo, - sizeof (struct res_lib_votequorum_qdisk_getinfo), CS_IPC_TIMEOUT_MS)); - - if (error != CS_OK) { - goto error_exit; - } - - error = res_lib_votequorum_qdisk_getinfo.header.error; - - qinfo->votes = res_lib_votequorum_qdisk_getinfo.votes; - qinfo->state = res_lib_votequorum_qdisk_getinfo.state; - strcpy(qinfo->name, res_lib_votequorum_qdisk_getinfo.name); - - -error_exit: - hdb_handle_put (&votequorum_handle_t_db, handle); - - return (error); -} - cs_error_t votequorum_trackstart ( votequorum_handle_t handle, uint64_t context, @@ -704,3 +528,180 @@ error_put: hdb_handle_put (&votequorum_handle_t_db, handle); return (error); } + +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API +cs_error_t votequorum_qdisk_register ( + votequorum_handle_t handle, + const char *name, + unsigned int votes) +{ + cs_error_t error; + struct votequorum_inst *votequorum_inst; + struct iovec iov; + struct req_lib_votequorum_qdisk_register req_lib_votequorum_qdisk_register; + struct res_lib_votequorum_status res_lib_votequorum_status; + + if (strlen(name) > VOTEQUORUM_MAX_QDISK_NAME_LEN) + return CS_ERR_INVALID_PARAM; + + error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst)); + if (error != CS_OK) { + return (error); + } + + + req_lib_votequorum_qdisk_register.header.size = sizeof (struct req_lib_votequorum_qdisk_register); + req_lib_votequorum_qdisk_register.header.id = MESSAGE_REQ_VOTEQUORUM_QDISK_REGISTER; + strcpy(req_lib_votequorum_qdisk_register.name, name); + req_lib_votequorum_qdisk_register.votes = votes; + + iov.iov_base = (char *)&req_lib_votequorum_qdisk_register; + iov.iov_len = sizeof (struct req_lib_votequorum_qdisk_register); + + error = qb_to_cs_error(qb_ipcc_sendv_recv ( + votequorum_inst->c, + &iov, + 1, + &res_lib_votequorum_status, + sizeof (struct res_lib_votequorum_status), CS_IPC_TIMEOUT_MS)); + + if (error != CS_OK) { + goto error_exit; + } + + error = res_lib_votequorum_status.header.error; + +error_exit: + hdb_handle_put (&votequorum_handle_t_db, handle); + + return (error); +} + +cs_error_t votequorum_qdisk_poll ( + votequorum_handle_t handle, + unsigned int state) +{ + cs_error_t error; + struct votequorum_inst *votequorum_inst; + struct iovec iov; + struct req_lib_votequorum_qdisk_poll req_lib_votequorum_qdisk_poll; + struct res_lib_votequorum_status res_lib_votequorum_status; + + error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst)); + if (error != CS_OK) { + return (error); + } + + + req_lib_votequorum_qdisk_poll.header.size = sizeof (struct req_lib_votequorum_qdisk_poll); + req_lib_votequorum_qdisk_poll.header.id = MESSAGE_REQ_VOTEQUORUM_QDISK_POLL; + req_lib_votequorum_qdisk_poll.state = state; + + iov.iov_base = (char *)&req_lib_votequorum_qdisk_poll; + iov.iov_len = sizeof (struct req_lib_votequorum_qdisk_poll); + + error = qb_to_cs_error(qb_ipcc_sendv_recv ( + votequorum_inst->c, + &iov, + 1, + &res_lib_votequorum_status, + sizeof (struct res_lib_votequorum_status), CS_IPC_TIMEOUT_MS)); + + if (error != CS_OK) { + goto error_exit; + } + + error = res_lib_votequorum_status.header.error; + +error_exit: + hdb_handle_put (&votequorum_handle_t_db, handle); + + return (error); +} + +cs_error_t votequorum_qdisk_unregister ( + votequorum_handle_t handle) +{ + cs_error_t error; + struct votequorum_inst *votequorum_inst; + struct iovec iov; + struct req_lib_votequorum_general req_lib_votequorum_general; + struct res_lib_votequorum_status res_lib_votequorum_status; + + error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst)); + if (error != CS_OK) { + return (error); + } + + req_lib_votequorum_general.header.size = sizeof (struct req_lib_votequorum_general); + req_lib_votequorum_general.header.id = MESSAGE_REQ_VOTEQUORUM_QDISK_UNREGISTER; + + iov.iov_base = (char *)&req_lib_votequorum_general; + iov.iov_len = sizeof (struct req_lib_votequorum_general); + + error = qb_to_cs_error(qb_ipcc_sendv_recv ( + votequorum_inst->c, + &iov, + 1, + &res_lib_votequorum_status, + sizeof (struct res_lib_votequorum_status), CS_IPC_TIMEOUT_MS)); + + if (error != CS_OK) { + goto error_exit; + } + + error = res_lib_votequorum_status.header.error; + +error_exit: + hdb_handle_put (&votequorum_handle_t_db, handle); + + return (error); +} + +cs_error_t votequorum_qdisk_getinfo ( + votequorum_handle_t handle, + struct votequorum_qdisk_info *qinfo) +{ + cs_error_t error; + struct votequorum_inst *votequorum_inst; + struct iovec iov; + struct req_lib_votequorum_general req_lib_votequorum_general; + struct res_lib_votequorum_qdisk_getinfo res_lib_votequorum_qdisk_getinfo; + + error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst)); + if (error != CS_OK) { + return (error); + } + + + req_lib_votequorum_general.header.size = sizeof (struct req_lib_votequorum_general); + req_lib_votequorum_general.header.id = MESSAGE_REQ_VOTEQUORUM_QDISK_GETINFO; + + iov.iov_base = (char *)&req_lib_votequorum_general; + iov.iov_len = sizeof (struct req_lib_votequorum_general); + + error = qb_to_cs_error(qb_ipcc_sendv_recv ( + votequorum_inst->c, + &iov, + 1, + &res_lib_votequorum_qdisk_getinfo, + sizeof (struct res_lib_votequorum_qdisk_getinfo), CS_IPC_TIMEOUT_MS)); + + if (error != CS_OK) { + goto error_exit; + } + + error = res_lib_votequorum_qdisk_getinfo.header.error; + + qinfo->votes = res_lib_votequorum_qdisk_getinfo.votes; + qinfo->state = res_lib_votequorum_qdisk_getinfo.state; + strcpy(qinfo->name, res_lib_votequorum_qdisk_getinfo.name); + + +error_exit: + hdb_handle_put (&votequorum_handle_t_db, handle); + + return (error); +} +#endif + diff --git a/test/testvotequorum2.c b/test/testvotequorum2.c index 0d81234..e702131 100644 --- a/test/testvotequorum2.c +++ b/test/testvotequorum2.c @@ -42,9 +42,9 @@ #include <corosync/corotypes.h> #include <corosync/votequorum.h> +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API static votequorum_handle_t handle; - static void print_info(int ok_to_fail) { struct votequorum_qdisk_info qinfo; @@ -59,9 +59,11 @@ static void print_info(int ok_to_fail) printf("\n"); } } +#endif int main(int argc, char *argv[]) { +#ifdef EXPERIMENTAL_QUORUM_DEVICE_API int pollcount=0, polltime=1; int err; @@ -95,5 +97,9 @@ int main(int argc, char *argv[]) } print_info(1); + votequorum_finalize(handle); +#else + fprintf(stderr, "qdisk support is not built in corosync/votequorum\n"); +#endif return 0; } -- 1.7.7.5 _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss