39 #include <sys/types.h> 43 #include <sys/socket.h> 46 #include <sys/resource.h> 47 #include <netinet/in.h> 48 #include <arpa/inet.h> 59 #include <qb/qbipc_common.h> 62 #include <qb/qblist.h> 78 struct qb_list_head
list;
88 static void message_handler_req_lib_quorum_getquorate (
void *
conn,
90 static void message_handler_req_lib_quorum_trackstart (
void *
conn,
92 static void message_handler_req_lib_quorum_trackstop (
void *
conn,
94 static void message_handler_req_lib_quorum_gettype (
void *
conn,
96 static void send_library_notification(
void *
conn);
97 static void send_internal_notification(
void);
99 static int quorum_lib_init_fn (
void *
conn);
100 static int quorum_lib_exit_fn (
void *
conn);
102 static int primary_designated = 0;
103 static int quorum_type = 0;
105 static struct qb_list_head lib_trackers_list;
106 static struct qb_list_head internal_trackers_list;
108 static size_t quorum_view_list_entries = 0;
111 static char view_buf[64];
113 static void log_view_list(
const unsigned int *view_list,
size_t view_list_entries)
115 int total = (int)view_list_entries;
120 len =
sizeof(view_buf);
122 memset(view_buf, 0, len);
124 for (; i < total; i++) {
125 ret = snprintf(view_buf + pos, len - pos,
" %u", view_list[i]);
126 if (ret >= len - pos)
131 total, view_buf, i < total ?
"\\" :
"");
139 static void quorum_api_set_quorum(
const unsigned int *view_list,
140 size_t view_list_entries,
143 int old_quorum = primary_designated;
144 primary_designated = quorum;
146 if (primary_designated && !old_quorum) {
148 }
else if (!primary_designated && old_quorum) {
152 quorum_view_list_entries = view_list_entries;
153 memcpy(&quorum_ring_id, ring_id,
sizeof (quorum_ring_id));
154 memcpy(quorum_view_list, view_list,
sizeof(
unsigned int)*view_list_entries);
156 log_view_list(view_list, view_list_entries);
159 send_internal_notification();
162 send_library_notification(NULL);
172 .lib_handler_fn = message_handler_req_lib_quorum_trackstart,
176 .lib_handler_fn = message_handler_req_lib_quorum_trackstop,
180 .lib_handler_fn = message_handler_req_lib_quorum_gettype,
186 .
name =
"corosync cluster quorum service v0.1",
189 .private_data_size =
sizeof (
struct quorum_pd),
192 .lib_init_fn = quorum_lib_init_fn,
193 .lib_exit_fn = quorum_lib_exit_fn,
194 .lib_engine = quorum_lib_service,
195 .exec_init_fn = quorum_exec_init_fn,
201 return (&quorum_service_handler);
211 static int quorum_quorate(
void)
213 return primary_designated;
225 qb_list_add (&pd->
list, &internal_trackers_list);
233 struct qb_list_head *tmp, *tmp_iter;
235 qb_list_for_each_safe(tmp, tmp_iter, &internal_trackers_list) {
238 qb_list_del(&pd->
list);
248 .register_callback = quorum_register_callback,
249 .unregister_callback = quorum_unregister_callback
256 char *quorum_module = NULL;
260 qb_list_init (&lib_trackers_list);
261 qb_list_init (&internal_trackers_list);
273 "Using quorum provider %s", quorum_module);
275 error = (
char *)
"Invalid quorum provider";
277 if (strcmp (quorum_module,
"corosync_votequorum") == 0) {
281 if (strcmp (quorum_module,
"corosync_ykd") == 0) {
282 error =
ykd_init (api, quorum_api_set_quorum);
287 "Quorum provider: %s failed to initialize.",
296 quorum_module = NULL;
304 if (quorum_type == 0) {
305 primary_designated = 1;
311 static int quorum_lib_init_fn (
void *
conn)
317 qb_list_init (&pd->
list);
323 static int quorum_lib_exit_fn (
void *
conn)
330 qb_list_del (&quorum_pd->
list);
331 qb_list_init (&quorum_pd->
list);
337 static void send_internal_notification(
void)
339 struct qb_list_head *tmp;
342 qb_list_for_each(tmp, &internal_trackers_list) {
349 static void send_library_notification(
void *
conn)
354 struct qb_list_head *tmp;
359 res_lib_quorum_notification->quorate = primary_designated;
360 res_lib_quorum_notification->ring_seq = quorum_ring_id.
seq;
361 res_lib_quorum_notification->view_list_entries = quorum_view_list_entries;
362 for (i=0; i<quorum_view_list_entries; i++) {
363 res_lib_quorum_notification->
view_list[i] = quorum_view_list[i];
367 res_lib_quorum_notification->header.size = size;
368 res_lib_quorum_notification->header.error =
CS_OK;
377 qb_list_for_each(tmp, &lib_trackers_list) {
381 res_lib_quorum_notification, size);
387 static void message_handler_req_lib_quorum_getquorate (
void *
conn,
395 res_lib_quorum_getquorate.
quorate = primary_designated;
396 res_lib_quorum_getquorate.header.size =
sizeof(res_lib_quorum_getquorate);
398 res_lib_quorum_getquorate.header.error =
CS_OK;
399 corosync_api->
ipc_response_send(
conn, &res_lib_quorum_getquorate,
sizeof(res_lib_quorum_getquorate));
402 static void message_handler_req_lib_quorum_trackstart (
void *
conn,
406 struct qb_ipc_response_header res;
419 send_library_notification(
conn);
436 qb_list_add (&quorum_pd->
list, &lib_trackers_list);
441 res.size =
sizeof(res);
447 static void message_handler_req_lib_quorum_trackstop (
void *
conn,
const void *msg)
449 struct qb_ipc_response_header res;
457 qb_list_del (&quorum_pd->
list);
458 qb_list_init (&quorum_pd->
list);
464 res.size =
sizeof(res);
470 static void message_handler_req_lib_quorum_gettype (
void *
conn,
479 res_lib_quorum_gettype.header.size =
sizeof(res_lib_quorum_gettype);
481 res_lib_quorum_gettype.header.error =
CS_OK;
void *(* ipc_private_data_get)(void *conn)
The res_lib_quorum_getquorate struct.
The corosync_service_engine struct.
The req_lib_quorum_trackstart struct.
int(* ipc_response_send)(void *conn, const void *msg, size_t mlen)
char * votequorum_init(struct corosync_api_v1 *api, quorum_set_quorate_fn_t q_set_quorate_fn)
char * ykd_init(struct corosync_api_v1 *corosync_api, quorum_set_quorate_fn_t set_primary)
quorum_callback_fn_t callback
struct quorum_services_api_ver1 * quorum_iface
The corosync_lib_handler struct.
The res_lib_quorum_notification struct.
The quorum_callin_functions struct.
#define log_printf(level, format, args...)
LOGSYS_DECLARE_SUBSYS("QUORUM")
#define CS_TRACK_CHANGES_ONLY
int(* quorum_initialize)(struct quorum_callin_functions *fns)
cs_error_t
The cs_error_t enum.
unsigned char track_flags
#define LOGSYS_LEVEL_DEBUG
The corosync_api_v1 struct.
void(* quorum_callback_fn_t)(int quorate, void *context)
The quorum_callback_fn_t callback.
The res_lib_quorum_gettype struct.
#define PROCESSOR_COUNT_MAX
cs_error_t icmap_get_string(const char *key_name, char **str)
Shortcut for icmap_get for string type.
#define LOGSYS_LEVEL_CRIT
#define LOGSYS_LEVEL_NOTICE
void(* lib_handler_fn)(void *conn, const void *msg)
int(* ipc_dispatch_send)(void *conn, const void *msg, size_t mlen)
struct memb_ring_id ring_id
struct corosync_service_engine * vsf_quorum_get_service_engine_ver0(void)