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>
89 static void message_handler_req_lib_quorum_getquorate (
void *conn,
91 static void message_handler_req_lib_quorum_trackstart (
void *conn,
93 static void message_handler_req_lib_quorum_trackstop (
void *conn,
95 static void message_handler_req_lib_quorum_gettype (
void *conn,
97 static void send_library_notification(
void *conn);
98 static void send_internal_notification(
void);
100 static int quorum_lib_init_fn (
void *conn);
101 static int quorum_lib_exit_fn (
void *conn);
103 static int primary_designated = 0;
104 static int quorum_type = 0;
106 static struct list_head lib_trackers_list;
107 static struct list_head internal_trackers_list;
109 static size_t quorum_view_list_entries = 0;
112 static char view_buf[64];
114 static void log_view_list(
const unsigned int *view_list,
size_t view_list_entries)
116 int total = (int)view_list_entries;
121 len =
sizeof(view_buf);
123 memset(view_buf, 0, len);
125 for (; i < total; i++) {
126 ret = snprintf(view_buf + pos, len - pos,
" %d", view_list[i]);
127 if (ret >= len - pos)
132 total, view_buf, i < total ?
"\\" :
"");
140 static void quorum_api_set_quorum(
const unsigned int *view_list,
141 size_t view_list_entries,
144 int old_quorum = primary_designated;
145 primary_designated = quorum;
147 if (primary_designated && !old_quorum) {
149 }
else if (!primary_designated && old_quorum) {
153 quorum_view_list_entries = view_list_entries;
154 memcpy(&quorum_ring_id, ring_id,
sizeof (quorum_ring_id));
155 memcpy(quorum_view_list, view_list,
sizeof(
unsigned int)*view_list_entries);
157 log_view_list(view_list, view_list_entries);
160 send_internal_notification();
163 send_library_notification(NULL);
173 .lib_handler_fn = message_handler_req_lib_quorum_trackstart,
177 .lib_handler_fn = message_handler_req_lib_quorum_trackstop,
181 .lib_handler_fn = message_handler_req_lib_quorum_gettype,
187 .
name =
"corosync cluster quorum service v0.1",
190 .private_data_size =
sizeof (
struct quorum_pd),
193 .lib_init_fn = quorum_lib_init_fn,
194 .lib_exit_fn = quorum_lib_exit_fn,
195 .lib_engine = quorum_lib_service,
196 .exec_init_fn = quorum_exec_init_fn,
202 return (&quorum_service_handler);
212 static int quorum_quorate(
void)
214 return primary_designated;
226 list_add (&pd->
list, &internal_trackers_list);
236 for (tmp = internal_trackers_list.
next; tmp != &internal_trackers_list; tmp = tmp->
next) {
249 .register_callback = quorum_register_callback,
250 .unregister_callback = quorum_unregister_callback
257 char *quorum_module = NULL;
261 list_init (&lib_trackers_list);
262 list_init (&internal_trackers_list);
274 "Using quorum provider %s", quorum_module);
276 error = (
char *)
"Invalid quorum provider";
278 if (strcmp (quorum_module,
"corosync_votequorum") == 0) {
282 if (strcmp (quorum_module,
"corosync_ykd") == 0) {
283 error =
ykd_init (api, quorum_api_set_quorum);
288 "Quorum provider: %s failed to initialize.",
297 quorum_module = NULL;
305 if (quorum_type == 0) {
306 primary_designated = 1;
312 static int quorum_lib_init_fn (
void *conn)
318 list_init (&pd->
list);
324 static int quorum_lib_exit_fn (
void *conn)
331 list_del (&quorum_pd->
list);
332 list_init (&quorum_pd->
list);
338 static void send_internal_notification(
void)
343 for (tmp = internal_trackers_list.
next; tmp != &internal_trackers_list; tmp = tmp->
next) {
351 static void send_library_notification(
void *conn)
361 res_lib_quorum_notification->quorate = primary_designated;
362 res_lib_quorum_notification->ring_seq = quorum_ring_id.
seq;
363 res_lib_quorum_notification->view_list_entries = quorum_view_list_entries;
364 for (i=0; i<quorum_view_list_entries; i++) {
365 res_lib_quorum_notification->
view_list[i] = quorum_view_list[i];
369 res_lib_quorum_notification->header.size = size;
370 res_lib_quorum_notification->header.error =
CS_OK;
377 struct quorum_pd *qpd;
379 for (tmp = lib_trackers_list.
next; tmp != &lib_trackers_list; tmp = tmp->
next) {
384 res_lib_quorum_notification, size);
390 static void message_handler_req_lib_quorum_getquorate (
void *conn,
405 static void message_handler_req_lib_quorum_trackstart (
void *conn,
409 struct qb_ipc_response_header res;
421 send_library_notification(conn);
433 list_add (&quorum_pd->
list, &lib_trackers_list);
437 res.size =
sizeof(res);
440 corosync_api->
ipc_response_send(conn, &res,
sizeof(
struct qb_ipc_response_header));
443 static void message_handler_req_lib_quorum_trackstop (
void *conn,
const void *msg)
445 struct qb_ipc_response_header res;
453 list_del (&quorum_pd->
list);
454 list_init (&quorum_pd->
list);
460 res.size =
sizeof(res);
463 corosync_api->
ipc_response_send(conn, &res,
sizeof(
struct qb_ipc_response_header));
466 static void message_handler_req_lib_quorum_gettype (
void *conn,