42#include <sys/socket.h>
45#include <netinet/in.h>
61#include <qb/qbipc_common.h>
70#define MAP_ANONYMOUS MAP_ANON
77#define GROUP_HASH_SIZE 32
138static struct qb_list_head joinlist_messages_head;
166static unsigned int my_member_list_entries;
170static unsigned int my_old_member_list_entries = 0;
202static int cpg_lib_init_fn (
void *conn);
204static int cpg_lib_exit_fn (
void *conn);
206static void message_handler_req_exec_cpg_procjoin (
210static void message_handler_req_exec_cpg_procleave (
214static void message_handler_req_exec_cpg_joinlist (
218static void message_handler_req_exec_cpg_mcast (
222static void message_handler_req_exec_cpg_partial_mcast (
226static void message_handler_req_exec_cpg_downlist_old (
230static void message_handler_req_exec_cpg_downlist (
234static void exec_cpg_procjoin_endian_convert (
void *msg);
236static void exec_cpg_joinlist_endian_convert (
void *msg);
238static void exec_cpg_mcast_endian_convert (
void *msg);
240static void exec_cpg_partial_mcast_endian_convert (
void *msg);
242static void exec_cpg_downlist_endian_convert_old (
void *msg);
244static void exec_cpg_downlist_endian_convert (
void *msg);
246static void message_handler_req_lib_cpg_null (
void *conn,
const void *message);
248static void message_handler_req_lib_cpg_join (
void *conn,
const void *message);
250static void message_handler_req_lib_cpg_leave (
void *conn,
const void *message);
252static void message_handler_req_lib_cpg_finalize (
void *conn,
const void *message);
254static void message_handler_req_lib_cpg_mcast (
void *conn,
const void *message);
256static void message_handler_req_lib_cpg_partial_mcast (
void *conn,
const void *message);
258static void message_handler_req_lib_cpg_membership (
void *conn,
259 const void *message);
261static void message_handler_req_lib_cpg_local_get (
void *conn,
262 const void *message);
264static void message_handler_req_lib_cpg_iteration_initialize (
266 const void *message);
268static void message_handler_req_lib_cpg_iteration_next (
270 const void *message);
272static void message_handler_req_lib_cpg_iteration_finalize (
274 const void *message);
276static int cpg_node_joinleave_send (
unsigned int pid,
const mar_cpg_name_t *group_name,
int fn,
int reason);
278static int cpg_exec_send_downlist(
void);
280static int cpg_exec_send_joinlist(
void);
282static void downlist_inform_clients (
void);
284static void joinlist_inform_clients (
void);
286static void joinlist_messages_delete (
void);
288static void cpg_sync_init (
289 const unsigned int *trans_list,
290 size_t trans_list_entries,
291 const unsigned int *member_list,
292 size_t member_list_entries,
295static int cpg_sync_process (
void);
297static void cpg_sync_activate (
void);
299static void cpg_sync_abort (
void);
301static void do_proc_join(
306 qb_map_t *group_notify_map);
308static void do_proc_leave(
314static int notify_lib_totem_membership (
316 int member_list_entries,
317 const unsigned int *member_list);
319static char *cpg_print_group_name (
328 .lib_handler_fn = message_handler_req_lib_cpg_join,
332 .lib_handler_fn = message_handler_req_lib_cpg_leave,
336 .lib_handler_fn = message_handler_req_lib_cpg_mcast,
340 .lib_handler_fn = message_handler_req_lib_cpg_membership,
344 .lib_handler_fn = message_handler_req_lib_cpg_local_get,
348 .lib_handler_fn = message_handler_req_lib_cpg_iteration_initialize,
352 .lib_handler_fn = message_handler_req_lib_cpg_iteration_next,
356 .lib_handler_fn = message_handler_req_lib_cpg_iteration_finalize,
360 .lib_handler_fn = message_handler_req_lib_cpg_finalize,
364 .lib_handler_fn = message_handler_req_lib_cpg_null,
368 .lib_handler_fn = message_handler_req_lib_cpg_null,
372 .lib_handler_fn = message_handler_req_lib_cpg_null,
376 .lib_handler_fn = message_handler_req_lib_cpg_partial_mcast,
385 .exec_handler_fn = message_handler_req_exec_cpg_procjoin,
386 .exec_endian_convert_fn = exec_cpg_procjoin_endian_convert
389 .exec_handler_fn = message_handler_req_exec_cpg_procleave,
390 .exec_endian_convert_fn = exec_cpg_procjoin_endian_convert
393 .exec_handler_fn = message_handler_req_exec_cpg_joinlist,
394 .exec_endian_convert_fn = exec_cpg_joinlist_endian_convert
397 .exec_handler_fn = message_handler_req_exec_cpg_mcast,
398 .exec_endian_convert_fn = exec_cpg_mcast_endian_convert
401 .exec_handler_fn = message_handler_req_exec_cpg_downlist_old,
402 .exec_endian_convert_fn = exec_cpg_downlist_endian_convert_old
405 .exec_handler_fn = message_handler_req_exec_cpg_downlist,
406 .exec_endian_convert_fn = exec_cpg_downlist_endian_convert
409 .exec_handler_fn = message_handler_req_exec_cpg_partial_mcast,
410 .exec_endian_convert_fn = exec_cpg_partial_mcast_endian_convert
415 .name =
"corosync cluster closed process group service v1.01",
418 .private_data_size =
sizeof (
struct cpg_pd),
421 .lib_init_fn = cpg_lib_init_fn,
422 .lib_exit_fn = cpg_lib_exit_fn,
423 .lib_engine = cpg_lib_engine,
425 .exec_init_fn = cpg_exec_init_fn,
426 .exec_dump_fn = NULL,
427 .exec_engine = cpg_exec_engine,
430 .sync_process = cpg_sync_process,
431 .sync_activate = cpg_sync_activate,
432 .sync_abort = cpg_sync_abort
501 for (i = 0; i < group->length; i++) {
504 if (c >=
' ' && c < 0x7f && c !=
'\\') {
508 res[dest_pos++] =
'\\';
509 res[dest_pos++] =
'\\';
511 snprintf(res + dest_pos,
sizeof(res) - dest_pos,
"\\x%02X", c);
521static void cpg_sync_init (
522 const unsigned int *trans_list,
523 size_t trans_list_entries,
524 const unsigned int *member_list,
525 size_t member_list_entries,
534 memcpy (my_member_list, member_list, member_list_entries *
535 sizeof (
unsigned int));
536 my_member_list_entries = member_list_entries;
538 last_sync_ring_id.nodeid =
ring_id->nodeid;
539 last_sync_ring_id.seq =
ring_id->seq;
545 for (i = 0; i < my_old_member_list_entries; i++) {
547 for (j = 0; j < trans_list_entries; j++) {
548 if (my_old_member_list[i] == trans_list[j]) {
554 g_req_exec_cpg_downlist.nodeids[entries++] =
555 my_old_member_list[i];
558 g_req_exec_cpg_downlist.left_nodes = entries;
561static int cpg_sync_process (
void)
566 res = cpg_exec_send_downlist();
573 res = cpg_exec_send_joinlist();
578static void cpg_sync_activate (
void)
580 memcpy (my_old_member_list, my_member_list,
581 my_member_list_entries *
sizeof (
unsigned int));
582 my_old_member_list_entries = my_member_list_entries;
584 downlist_inform_clients ();
586 joinlist_inform_clients ();
588 joinlist_messages_delete ();
590 notify_lib_totem_membership (NULL, my_member_list_entries, my_member_list);
593static void cpg_sync_abort (
void)
596 joinlist_messages_delete ();
599static int notify_lib_totem_membership (
601 int member_list_entries,
602 const unsigned int *member_list)
604 struct qb_list_head *iter;
616 res->member_list_entries = member_list_entries;
617 res->header.size = size;
619 res->header.error =
CS_OK;
625 qb_list_for_each(iter, &cpg_pd_list_head) {
627 api->ipc_dispatch_send (
cpg_pd->
conn, buf, size);
630 api->ipc_dispatch_send (
conn, buf, size);
644static void notify_lib_joinlist_fill_member_list(
646 int left_list_entries,
648 int *member_list_entries,
651 struct qb_list_head *iter;
654 if (member_list_entries != NULL) {
655 *member_list_entries = 0;
658 qb_list_for_each(iter, &process_info_list_head) {
661 if (mar_name_compare (&pi->
group, group_name) == 0) {
662 int in_left_list = 0;
664 for (i = 0; i < left_list_entries; i++) {
665 if (left_list[i].
nodeid == pi->
nodeid && left_list[i].pid == pi->
pid) {
672 if (member_list_entries != NULL) {
673 (*member_list_entries)++;
676 if (member_list != NULL) {
677 (*member_list)->nodeid = pi->
nodeid;
678 (*member_list)->pid = pi->
pid;
687static int notify_lib_joinlist(
689 int joined_list_entries,
691 int left_list_entries,
697 struct qb_list_head *iter;
698 int member_list_entries;
706 notify_lib_joinlist_fill_member_list(group_name, left_list_entries, left_list,
707 &member_list_entries, NULL);
710 sizeof(
mar_cpg_address_t) * (member_list_entries + left_list_entries + joined_list_entries);
716 res->joined_list_entries = joined_list_entries;
717 res->left_list_entries = left_list_entries;
718 res->member_list_entries = member_list_entries;
720 res->header.size = size;
722 res->header.error =
CS_OK;
728 notify_lib_joinlist_fill_member_list(group_name, left_list_entries, left_list,
734 if (left_list_entries) {
736 retgi += left_list_entries;
739 if (joined_list_entries) {
744 retgi += joined_list_entries;
749 for (i = 0; i < joined_list_entries; i++) {
750 if (joined_list[i].
nodeid == api->totem_nodeid_get()) {
751 qb_list_for_each(iter, &cpg_pd_list_head) {
753 if (joined_list[i].
pid == cpd->
pid &&
765 qb_list_for_each(iter, &cpg_pd_list_head) {
771 api->ipc_dispatch_send (cpd->
conn, buf, size);
777 if (left_list_entries) {
784 for (i = 0; i < joined_list_entries; i++) {
785 if (left_list[i].
nodeid == api->totem_nodeid_get() &&
787 qb_list_for_each(iter, &cpg_pd_list_head) {
789 if (left_list[i].
pid == cpd->
pid &&
803 qb_list_for_each(iter, &cpg_pd_list_head) {
809 notify_lib_totem_membership (cpd->
conn, my_old_member_list_entries, my_old_member_list);
819 "%s: members(old:%d left:%d)",
825static void downlist_inform_clients (
void)
827 struct qb_list_head *iter, *tmp_iter;
833 struct cpg_name cpg_group;
835 int left_list_entries;
836 struct qb_list_head list;
838 qb_map_iter_t *miter;
841 downlist_log(
"my downlist", &g_req_exec_cpg_downlist);
843 group_map = qb_skiplist_create();
850 qb_list_for_each_safe(iter, tmp_iter, &process_info_list_head) {
854 for (i = 0; i < g_req_exec_cpg_downlist.left_nodes; i++) {
856 if (pi->
nodeid == g_req_exec_cpg_downlist.nodeids[i]) {
863 marshall_from_mar_cpg_name_t(&cpg_group, &left_pi->
group);
864 cpg_group.value[cpg_group.length] = 0;
866 pcd = (
struct confchg_data *)qb_map_get(group_map, cpg_group.value);
868 pcd = (
struct confchg_data *)calloc(1,
sizeof(
struct confchg_data));
869 memcpy(&pcd->cpg_group, &cpg_group,
sizeof(
struct cpg_name));
870 qb_map_put(group_map, pcd->cpg_group.value, pcd);
872 size = pcd->left_list_entries;
873 pcd->left_list[size].nodeid = left_pi->
nodeid;
874 pcd->left_list[size].pid = left_pi->
pid;
876 pcd->left_list_entries++;
877 qb_list_del (&left_pi->
list);
883 miter = qb_map_iter_create(group_map);
884 while (qb_map_iter_next(miter, (
void **)&pcd)) {
885 marshall_to_mar_cpg_name_t(&group, &pcd->cpg_group);
887 log_printf (LOG_DEBUG,
"left_list_entries:%d", pcd->left_list_entries);
888 for (i=0; i<pcd->left_list_entries; i++) {
889 log_printf (LOG_DEBUG,
"left_list[%d] group:%s, ip:%s, pid:%d",
890 i, cpg_print_group_name(&group),
891 (
char*)api->totem_ifaces_print(pcd->left_list[i].nodeid),
892 pcd->left_list[i].pid);
896 notify_lib_joinlist(&group,
898 pcd->left_list_entries,
904 qb_map_iter_free(miter);
905 qb_map_destroy(group_map);
911static void joinlist_remove_zombie_pi_entries (
void)
913 struct qb_list_head *pi_iter, *tmp_iter;
914 struct qb_list_head *jl_iter;
919 qb_list_for_each_safe(pi_iter, tmp_iter, &process_info_list_head) {
925 if (pi->
nodeid == api->totem_nodeid_get()) {
933 qb_list_for_each(jl_iter, &joinlist_messages_head) {
941 pi->
pid == stored_msg->
pid &&
954static void joinlist_inform_clients (
void)
957 struct qb_list_head *iter;
959 qb_map_t *group_notify_map;
960 qb_map_iter_t *miter;
963 group_notify_map = qb_skiplist_create();
966 qb_list_for_each(iter, &joinlist_messages_head) {
967 stored_msg = qb_list_entry(iter,
struct joinlist_msg, list);
969 log_printf (LOG_DEBUG,
"joinlist_messages[%u] group:%s, ip:%s, pid:%d",
970 i++, cpg_print_group_name(&stored_msg->
group_name),
983 miter = qb_map_iter_create(group_notify_map);
984 while (qb_map_iter_next(miter, (
void **)&jld)) {
985 notify_lib_joinlist(&jld->cpg_group,
986 jld->join_list_entries, jld->join_list,
991 qb_map_iter_free(miter);
992 qb_map_destroy(group_notify_map);
994 joinlist_remove_zombie_pi_entries ();
997static void joinlist_messages_delete (
void)
1000 struct qb_list_head *iter, *tmp_iter;
1002 qb_list_for_each_safe(iter, tmp_iter, &joinlist_messages_head) {
1003 stored_msg = qb_list_entry(iter,
struct joinlist_msg, list);
1004 qb_list_del (&stored_msg->
list);
1007 qb_list_init (&joinlist_messages_head);
1012 qb_list_init (&joinlist_messages_head);
1019 struct qb_list_head *iter, *tmp_iter;
1024 qb_list_del (&pi->
list);
1032static void cpg_pd_finalize (
struct cpg_pd *cpd)
1034 struct qb_list_head *iter, *tmp_iter;
1040 cpg_iteration_instance_finalize (cpii);
1043 qb_list_del (&cpd->
list);
1046static int cpg_lib_exit_fn (
void *conn)
1057 cpg_pd_finalize (cpd);
1059 api->ipc_refcnt_dec (
conn);
1066 struct iovec req_exec_cpg_iovec;
1081 result = api->totem_mcast (&req_exec_cpg_iovec, 1,
TOTEM_AGREED);
1087static void exec_cpg_procjoin_endian_convert (
void *msg)
1096static void exec_cpg_joinlist_endian_convert (
void *msg_v)
1099 struct qb_ipc_response_header *res = (
struct qb_ipc_response_header *)msg;
1102 swab_mar_int32_t (&res->size);
1104 while ((
const char*)jle < msg + res->size) {
1111static void exec_cpg_downlist_endian_convert_old (
void *msg)
1115static void exec_cpg_downlist_endian_convert (
void *msg)
1129static void exec_cpg_mcast_endian_convert (
void *msg)
1140static void exec_cpg_partial_mcast_endian_convert (
void *msg)
1154 struct qb_list_head *iter;
1156 qb_list_for_each(iter, &process_info_list_head) {
1160 mar_name_compare (&pi->
group, group_name) == 0) {
1168static void do_proc_join(
1173 qb_map_t *group_notify_map)
1178 struct qb_list_head *list;
1179 struct qb_list_head *list_to_add = NULL;
1182 if (process_info_find (name, pid,
nodeid) != NULL) {
1192 memcpy(&pi->
group, name,
sizeof(*name));
1193 qb_list_init(&pi->
list);
1198 list_to_add = &process_info_list_head;
1199 qb_list_for_each(list, &process_info_list_head) {
1200 pi_entry = qb_list_entry(list,
struct process_info, list);
1208 qb_list_add (&pi->
list, list_to_add);
1210 notify_info.pid = pi->
pid;
1211 notify_info.nodeid =
nodeid;
1212 notify_info.reason = reason;
1214 if (group_notify_map == NULL) {
1215 notify_lib_joinlist(&pi->
group,
1224 qb_map_put(group_notify_map, jld->
cpg_group.value, jld);
1227 jld->
join_list[size].nodeid = notify_info.nodeid;
1228 jld->
join_list[size].pid = notify_info.pid;
1229 jld->
join_list[size].reason = notify_info.reason;
1234static void do_proc_leave(
1241 struct qb_list_head *iter, *tmp_iter;
1244 notify_info.pid = pid;
1245 notify_info.nodeid =
nodeid;
1246 notify_info.reason = reason;
1248 notify_lib_joinlist(name,
1253 qb_list_for_each_safe(iter, tmp_iter, &process_info_list_head) {
1257 mar_name_compare (&pi->
group, name)==0) {
1258 qb_list_del (&pi->
list);
1264static void message_handler_req_exec_cpg_downlist_old (
1265 const void *message,
1272static void message_handler_req_exec_cpg_downlist(
1273 const void *message,
1283static void message_handler_req_exec_cpg_procjoin (
1284 const void *message,
1291 api->totem_ifaces_print(
nodeid),
1299static void message_handler_req_exec_cpg_procleave (
1300 const void *message,
1307 api->totem_ifaces_print(
nodeid),
1317static void message_handler_req_exec_cpg_joinlist (
1318 const void *message_v,
1321 const char *message = message_v;
1322 const struct qb_ipc_response_header *res = (
const struct qb_ipc_response_header *)message;
1329 while ((
const char*)jle < message + res->size) {
1333 stored_msg->
pid = jle->
pid;
1335 qb_list_init (&stored_msg->
list);
1336 qb_list_add (&stored_msg->
list, &joinlist_messages_head);
1341static void message_handler_req_exec_cpg_mcast (
1342 const void *message,
1348 struct qb_list_head *iter, *pi_iter, *tmp_iter;
1350 struct iovec iovec[2];
1365 iovec[1].iov_len = msglen;
1367 qb_list_for_each_safe(iter, tmp_iter, &cpg_pd_list_head) {
1368 cpd = qb_list_entry(iter,
struct cpg_pd, list);
1374 qb_list_for_each(pi_iter, &process_info_list_head) {
1390 api->ipc_dispatch_iov_send (cpd->
conn, iovec, 2);
1395static void message_handler_req_exec_cpg_partial_mcast (
1396 const void *message,
1402 struct qb_list_head *iter, *pi_iter, *tmp_iter;
1404 struct iovec iovec[2];
1423 iovec[1].iov_len = msglen;
1425 qb_list_for_each_safe(iter, tmp_iter, &cpg_pd_list_head) {
1426 cpd = qb_list_entry(iter,
struct cpg_pd, list);
1433 qb_list_for_each(pi_iter, &process_info_list_head) {
1449 api->ipc_dispatch_iov_send (cpd->
conn, iovec, 2);
1455static int cpg_exec_send_downlist(
void)
1462 g_req_exec_cpg_downlist.old_members = my_old_member_list_entries;
1464 iov.iov_base = (
void *)&g_req_exec_cpg_downlist;
1465 iov.iov_len = g_req_exec_cpg_downlist.header.size;
1470static int cpg_exec_send_joinlist(
void)
1473 struct qb_list_head *iter;
1474 struct qb_ipc_response_header *res;
1478 struct iovec req_exec_cpg_iovec;
1480 qb_list_for_each(iter, &process_info_list_head) {
1483 if (pi->
nodeid == api->totem_nodeid_get ()) {
1492 buf_size =
sizeof(
struct qb_ipc_response_header) + sizeof(struct
join_list_entry) * count;
1493 buf = alloca(buf_size);
1498 memset(buf, 0, buf_size);
1500 jle = (
struct join_list_entry *)(buf +
sizeof(
struct qb_ipc_response_header));
1501 res = (
struct qb_ipc_response_header *)buf;
1503 qb_list_for_each(iter, &process_info_list_head) {
1506 if (pi->
nodeid == api->totem_nodeid_get ()) {
1514 res->size =
sizeof(
struct qb_ipc_response_header)+sizeof(struct
join_list_entry) * count;
1516 req_exec_cpg_iovec.iov_base = buf;
1517 req_exec_cpg_iovec.iov_len = res->size;
1519 return (api->totem_mcast (&req_exec_cpg_iovec, 1,
TOTEM_AGREED));
1522static int cpg_lib_init_fn (
void *conn)
1525 memset (cpd, 0,
sizeof(
struct cpg_pd));
1527 qb_list_add (&cpd->
list, &cpg_pd_list_head);
1531 api->ipc_refcnt_inc (
conn);
1538static void message_handler_req_lib_cpg_null (
void *
conn,
const void *message)
1549static void message_handler_req_lib_cpg_join (
void *conn,
const void *message)
1555 struct qb_list_head *iter;
1558 qb_list_for_each(iter, &cpg_pd_list_head) {
1574 qb_list_for_each(iter, &process_info_list_head) {
1622static void message_handler_req_lib_cpg_leave (
void *conn,
const void *message)
1659static void message_handler_req_lib_cpg_finalize (
1661 const void *message)
1673 qb_list_del (&cpd->
list);
1674 qb_list_init (&cpd->
list);
1686static void message_handler_req_lib_cpg_partial_mcast (
void *conn,
const void *message)
1692 struct iovec req_exec_cpg_iovec[2];
1727 if (error ==
CS_OK) {
1742 req_exec_cpg_iovec[1].iov_len = msglen;
1744 result = api->totem_mcast (req_exec_cpg_iovec, 2,
TOTEM_AGREED);
1745 assert(result == 0);
1748 conn, group_name.value, cpd->
cpd_state, error);
1757static void message_handler_req_lib_cpg_mcast (
void *conn,
const void *message)
1763 struct iovec req_exec_cpg_iovec[2];
1786 if (error ==
CS_OK) {
1801 req_exec_cpg_iovec[1].iov_len = msglen;
1803 result = api->totem_mcast (req_exec_cpg_iovec, 2,
TOTEM_AGREED);
1804 assert(result == 0);
1807 conn, group_name.value, cpd->
cpd_state, error);
1811static void message_handler_req_lib_cpg_membership (
void *conn,
1812 const void *message)
1817 struct qb_list_head *iter;
1818 int member_count = 0;
1825 qb_list_for_each(iter, &process_info_list_head) {
1839static void message_handler_req_lib_cpg_local_get (
void *conn,
1840 const void *message)
1853static void message_handler_req_lib_cpg_iteration_initialize (
1855 const void *message)
1861 struct qb_list_head *iter, *iter2;
1876 &cpg_iteration_handle);
1883 res = hdb_handle_get (&cpg_iteration_handle_t_db, cpg_iteration_handle, (
void *)&
cpg_iteration_instance);
1896 qb_list_for_each(iter, &process_info_list_head) {
1909 if (mar_name_compare (&pi2->
group, &pi->
group) == 0) {
1938 goto error_put_destroy;
1942 qb_list_init (&new_pi->
list);
1957 if (mar_name_compare (&pi2->
group, &pi->
group) == 0) {
1962 qb_list_add (&new_pi->
list, iter2);
1978 hdb_handle_put (&cpg_iteration_handle_t_db, cpg_iteration_handle);
1980 if (error !=
CS_OK) {
1981 hdb_handle_destroy (&cpg_iteration_handle_t_db, cpg_iteration_handle);
1994static void message_handler_req_lib_cpg_iteration_next (
1996 const void *message)
2007 res = hdb_handle_get (&cpg_iteration_handle_t_db,
2047static void message_handler_req_lib_cpg_iteration_finalize (
2049 const void *message)
2059 res = hdb_handle_get (&cpg_iteration_handle_t_db,
#define SERVICE_ID_MAKE(a, b)
unsigned int nodeid
the ID of the node whose info needs updating
@ CS_LIB_FLOW_CONTROL_REQUIRED
@ CS_LIB_FLOW_CONTROL_NOT_REQUIRED
#define PROCESSOR_COUNT_MAX
cs_error_t
The cs_error_t enum.
struct corosync_service_engine cpg_service_engine
QB_LIST_DECLARE(cpg_pd_list_head)
@ MESSAGE_REQ_EXEC_CPG_JOINLIST
@ MESSAGE_REQ_EXEC_CPG_PARTIAL_MCAST
@ MESSAGE_REQ_EXEC_CPG_PROCLEAVE
@ MESSAGE_REQ_EXEC_CPG_DOWNLIST_OLD
@ MESSAGE_REQ_EXEC_CPG_MCAST
@ MESSAGE_REQ_EXEC_CPG_PROCJOIN
@ MESSAGE_REQ_EXEC_CPG_DOWNLIST
@ CPD_STATE_LEAVE_STARTED
@ CPD_STATE_JOIN_COMPLETED
struct corosync_service_engine * cpg_get_service_engine_ver0(void)
#define CPG_MAX_NAME_LENGTH
#define CPG_MODEL_V1_DELIVER_INITIAL_TOTEM_CONF
@ CPG_ITERATION_ONE_GROUP
@ CPG_ITERATION_NAME_ONLY
#define DECLARE_HDB_DATABASE
@ MESSAGE_RES_CPG_ITERATIONFINALIZE
@ MESSAGE_RES_CPG_MEMBERSHIP
@ MESSAGE_RES_CPG_PARTIAL_DELIVER_CALLBACK
@ MESSAGE_RES_CPG_FINALIZE
@ MESSAGE_RES_CPG_DELIVER_CALLBACK
@ MESSAGE_RES_CPG_TOTEM_CONFCHG_CALLBACK
@ MESSAGE_RES_CPG_ITERATIONNEXT
@ MESSAGE_RES_CPG_CONFCHG_CALLBACK
@ MESSAGE_RES_CPG_PARTIAL_SEND
@ MESSAGE_RES_CPG_ITERATIONINITIALIZE
@ MESSAGE_RES_CPG_LOCAL_GET
@ CONFCHG_CPG_REASON_LEAVE
@ CONFCHG_CPG_REASON_PROCDOWN
@ CONFCHG_CPG_REASON_NODEUP
@ CONFCHG_CPG_REASON_JOIN
@ CONFCHG_CPG_REASON_NODEDOWN
#define LOGSYS_LEVEL_ERROR
#define log_printf(level, format, args...)
#define LOGSYS_DECLARE_SUBSYS(subsys)
The LOGSYS_DECLARE_SUBSYS macro.
#define LOGSYS_LEVEL_WARNING
#define LOGSYS_LEVEL_DEBUG
#define LOGSYS_LEVEL_TRACE
The corosync_api_v1 struct.
The corosync_exec_handler struct.
The corosync_lib_handler struct.
The corosync_service_engine struct.
struct qb_list_head items_list_head
struct qb_list_head * current_pointer
uint64_t transition_counter
int initial_totem_conf_sent
mar_cpg_name_t group_name
struct qb_list_head iteration_instance_list_head
uint64_t initial_transition_counter
mar_cpg_address_t join_list[CPG_MEMBERS_MAX]
mar_cpg_name_t group_name
mar_uint32_t sender_nodeid
mar_cpg_name_t group_name
The mar_message_source_t struct.
struct qb_ipc_request_header header __attribute__((aligned(8)))
mar_uint32_t nodeids[PROCESSOR_COUNT_MAX] __attribute__((aligned(8)))
mar_uint32_t left_nodes __attribute__((aligned(8)))
mar_uint32_t old_members __attribute__((aligned(8)))
mar_uint32_t left_nodes __attribute__((aligned(8)))
struct qb_ipc_request_header header __attribute__((aligned(8)))
mar_uint32_t nodeids[PROCESSOR_COUNT_MAX] __attribute__((aligned(8)))
struct qb_ipc_request_header header __attribute__((aligned(8)))
mar_cpg_name_t group_name __attribute__((aligned(8)))
mar_uint32_t pid __attribute__((aligned(8)))
mar_uint32_t msglen __attribute__((aligned(8)))
mar_message_source_t source __attribute__((aligned(8)))
mar_uint8_t message[] __attribute__((aligned(8)))
mar_uint32_t type __attribute__((aligned(8)))
mar_message_source_t source __attribute__((aligned(8)))
mar_cpg_name_t group_name __attribute__((aligned(8)))
mar_uint32_t pid __attribute__((aligned(8)))
mar_uint8_t message[] __attribute__((aligned(8)))
struct qb_ipc_request_header header __attribute__((aligned(8)))
mar_uint32_t msglen __attribute__((aligned(8)))
mar_uint32_t fraglen __attribute__((aligned(8)))
mar_uint32_t pid __attribute__((aligned(8)))
mar_uint32_t reason __attribute__((aligned(8)))
struct qb_ipc_request_header header __attribute__((aligned(8)))
mar_cpg_name_t group_name __attribute__((aligned(8)))
The req_lib_cpg_iterationfinalize struct.
The req_lib_cpg_iterationinitialize struct.
The req_lib_cpg_iterationnext struct.
The req_lib_cpg_join struct.
The req_lib_cpg_leave struct.
The req_lib_cpg_mcast struct.
The req_lib_cpg_membership_get struct.
The req_lib_cpg_partial_mcast struct.
The res_lib_cpg_confchg_callback struct.
mar_cpg_address_t member_list[]
Message from another node.
The res_lib_cpg_finalize struct.
The res_lib_cpg_iterationfinalize struct.
The res_lib_cpg_iterationinitialize struct.
The res_lib_cpg_iterationnext struct.
The res_lib_cpg_join struct.
The res_lib_cpg_leave struct.
The res_lib_cpg_local_get struct.
The res_lib_cpg_mcast struct.
The res_lib_cpg_membership_get struct.
mar_cpg_address_t member_list[PROCESSOR_COUNT_MAX]
The res_lib_cpg_null struct.
The res_lib_cpg_partial_deliver_callback struct.
The res_lib_cpg_partial_send struct.
The res_lib_cpg_totem_confchg_callback struct.
mar_uint32_t member_list[]
#define swab32(x)
The swab32 macro.
int sync_init(int(*sync_callbacks_retrieve)(int service_id, struct sync_callbacks *callbacks), void(*synchronization_completed)(void))
struct memb_ring_id ring_id
struct totem_message_header header