47#include <sys/socket.h>
50#include <sys/resource.h>
51#include <netinet/in.h>
63#include <qb/qbipc_common.h>
93static void quorum_sync_init (
96 const unsigned int *member_list,
97 size_t member_list_entries,
100static int quorum_sync_process (
void);
102static void quorum_sync_activate (
void);
104static void quorum_sync_abort (
void);
106static void message_handler_req_lib_quorum_getquorate (
void *conn,
108static void message_handler_req_lib_quorum_trackstart (
void *conn,
110static void message_handler_req_lib_quorum_trackstop (
void *conn,
112static void message_handler_req_lib_quorum_gettype (
void *conn,
114static void message_handler_req_lib_quorum_model_gettype (
void *conn,
116static void send_library_notification(
void *conn);
117static void send_internal_notification(
void);
120static int quorum_lib_init_fn (
void *conn);
121static int quorum_lib_exit_fn (
void *conn);
123static int primary_designated = 0;
124static int quorum_type = 0;
130static size_t quorum_view_list_entries = 0;
134static char view_buf[64];
137static size_t my_member_list_entries;
139static size_t my_old_member_list_entries = 0;
141static size_t my_left_list_entries;
143static size_t my_joined_list_entries;
145static void log_view_list(
const unsigned int *view_list,
size_t view_list_entries,
153 len =
sizeof(view_buf);
172static void quorum_api_set_quorum(
const unsigned int *view_list,
177 primary_designated = quorum;
181 }
else if (!primary_designated &&
old_quorum) {
192 send_internal_notification();
195 send_library_notification(
NULL);
205 .lib_handler_fn = message_handler_req_lib_quorum_trackstart,
209 .lib_handler_fn = message_handler_req_lib_quorum_trackstop,
213 .lib_handler_fn = message_handler_req_lib_quorum_gettype,
217 .lib_handler_fn = message_handler_req_lib_quorum_model_gettype,
223 .
name =
"corosync cluster quorum service v0.1",
226 .private_data_size =
sizeof (
struct quorum_pd),
229 .lib_init_fn = quorum_lib_init_fn,
230 .lib_exit_fn = quorum_lib_exit_fn,
231 .lib_engine = quorum_lib_service,
232 .exec_init_fn = quorum_exec_init_fn,
233 .sync_init = quorum_sync_init,
234 .sync_process = quorum_sync_process,
235 .sync_activate = quorum_sync_activate,
236 .sync_abort = quorum_sync_abort,
242 return (&quorum_service_handler);
252static int quorum_quorate(
void)
254 return primary_designated;
278 if (
pd->callback ==
function &&
pd->context == context) {
289 .register_callback = quorum_register_callback,
290 .unregister_callback = quorum_unregister_callback
295static void quorum_sync_init (
298 const unsigned int *member_list,
299 size_t member_list_entries,
307 memcpy (my_member_list, member_list, member_list_entries *
308 sizeof (
unsigned int));
309 my_member_list_entries = member_list_entries;
317 for (
i = 0;
i < my_old_member_list_entries;
i++) {
327 my_left_list[entries++] = my_old_member_list[
i];
334 for (
j = 0;
j < my_member_list_entries;
j++) {
335 if (my_old_member_list[
i] == my_member_list[
j]) {
346 my_left_list[entries++] = my_old_member_list[
i];
350 my_left_list_entries = entries;
356 for (
i = 0;
i < my_member_list_entries;
i++) {
358 for (
j = 0;
j < my_old_member_list_entries;
j++) {
359 if (my_member_list[
i] == my_old_member_list[
j]) {
373 for (
j = 0;
j < my_left_list_entries;
j++) {
374 if (my_member_list[
i] == my_left_list[
j]) {
385 my_joined_list[entries++] = my_member_list[
i];
388 my_joined_list_entries = entries;
390 log_view_list(my_member_list, my_member_list_entries,
"Sync members");
392 if (my_joined_list_entries > 0) {
393 log_view_list(my_joined_list, my_joined_list_entries,
"Sync joined");
396 if (my_left_list_entries > 0) {
397 log_view_list(my_left_list, my_left_list_entries,
"Sync left");
401static int quorum_sync_process (
void)
407static void quorum_sync_activate (
void)
410 memcpy (my_old_member_list, my_member_list,
411 my_member_list_entries *
sizeof (
unsigned int));
412 my_old_member_list_entries = my_member_list_entries;
415 send_nodelist_library_notification(
NULL, 1);
418static void quorum_sync_abort (
void)
444 error = (
char *)
"Invalid quorum provider";
456 "Quorum provider: %s failed to initialize.",
473 if (quorum_type == 0) {
474 primary_designated = 1;
480static int quorum_lib_init_fn (
void *conn)
493static int quorum_lib_exit_fn (
void *
conn)
507static void send_internal_notification(
void)
515 pd->callback(primary_designated,
pd->context);
519static void prepare_library_notification_v0(
char *
buf,
size_t size)
527 for (
i=0;
i<quorum_view_list_entries;
i++) {
536static void prepare_library_notification_v1(
char *
buf,
size_t size)
546 for (
i=0;
i<quorum_view_list_entries;
i++) {
555static void send_library_notification(
void *conn)
636 for (
i=0;
i<my_member_list_entries;
i++,
ptr++) {
637 *
ptr = my_member_list[
i];
641 for (
i=0;
i<my_joined_list_entries;
i++,
ptr++) {
642 *
ptr = my_joined_list[
i];
645 for (
i=0;
i<my_left_list_entries;
i++,
ptr++) {
646 *
ptr = my_left_list[
i];
678static void message_handler_req_lib_quorum_getquorate (
void *
conn,
693static void message_handler_req_lib_quorum_trackstart (
void *conn,
710 send_nodelist_library_notification(
conn, 0);
711 send_library_notification(
conn);
739static void message_handler_req_lib_quorum_trackstop (
void *
conn,
const void *msg)
762static void message_handler_req_lib_quorum_gettype (
void *
conn,
777static void message_handler_req_lib_quorum_model_gettype (
void *conn,
void(* quorum_callback_fn_t)(int quorate, void *context)
The quorum_callback_fn_t callback.
@ CS_LIB_FLOW_CONTROL_NOT_REQUIRED
#define PROCESSOR_COUNT_MAX
#define CS_TRACK_CHANGES_ONLY
cs_error_t
The cs_error_t enum.
char * votequorum_init(struct corosync_api_v1 *api, quorum_set_quorate_fn_t q_set_quorate_fn)
cs_error_t icmap_get_string(const char *key_name, char **str)
Shortcut for icmap_get for string type.
@ MESSAGE_RES_QUORUM_TRACKSTART
@ MESSAGE_RES_QUORUM_V1_QUORUM_NOTIFICATION
@ MESSAGE_RES_QUORUM_TRACKSTOP
@ MESSAGE_RES_QUORUM_V1_NODELIST_NOTIFICATION
@ MESSAGE_RES_QUORUM_GETTYPE
@ MESSAGE_RES_QUORUM_NOTIFICATION
@ MESSAGE_RES_QUORUM_MODEL_GETTYPE
@ MESSAGE_RES_QUORUM_GETQUORATE
#define LOGSYS_LEVEL_ERROR
#define log_printf(level, format, args...)
#define LOGSYS_LEVEL_CRIT
#define LOGSYS_LEVEL_NOTICE
#define LOGSYS_DECLARE_SUBSYS(subsys)
The LOGSYS_DECLARE_SUBSYS macro.
#define LOGSYS_LEVEL_DEBUG
The corosync_api_v1 struct.
int(* quorum_initialize)(struct quorum_callin_functions *fns)
void *(* ipc_private_data_get)(void *conn)
int(* ipc_dispatch_send)(void *conn, const void *msg, size_t mlen)
int(* ipc_response_send)(void *conn, const void *msg, size_t mlen)
The corosync_lib_handler struct.
void(* lib_handler_fn)(void *conn, const void *msg)
The corosync_service_engine struct.
quorum_callback_fn_t callback
The quorum_callin_functions struct.
unsigned char track_flags
enum lib_quorum_model model
The req_lib_quorum_trackstart struct.
The res_lib_quorum_getquorate struct.
The res_lib_quorum_gettype struct.
The res_lib_quorum_notification struct.
mar_uint32_t member_list[]
struct memb_ring_id ring_id
struct corosync_service_engine * vsf_quorum_get_service_engine_ver0(void)
struct quorum_services_api_ver1 * quorum_iface
char * ykd_init(struct corosync_api_v1 *corosync_api, quorum_set_quorate_fn_t set_primary)