static void DeliverCallback ( cpg_handle_t handle, const struct cpg_name *groupName, uint32_t nodeid, uint32_t pid, void *msg, size_t msg_len) { printf("DeliverCallback: message (len=%lu)from %s: '%s'\n", (unsigned long int) msg_len, node_pid_format(nodeid, pid), (const char *)msg); }
static void ConfchgCallback ( cpg_handle_t handle, const struct cpg_name *groupName, const struct cpg_address *member_list, size_t member_list_entries, const struct cpg_address *left_list, size_t left_list_entries, const struct cpg_address *joined_list, size_t joined_list_entries) { int i; printf("\nConfchgCallback: group '"); print_cpgname(groupName); printf("'\n"); for (i=0; i<joined_list_entries; i++) { printf("joined %s reason: %d\n", node_pid_format(joined_list[i].nodeid, joined_list[i].pid), joined_list[i].reason); } for (i=0; i<left_list_entries; i++) { printf("left %s reason: %d\n", node_pid_format(left_list[i].nodeid, left_list[i].pid), left_list[i].reason); } printf("nodes in group now %lu\n", (unsigned long int) member_list_entries); for (i=0; i<member_list_entries; i++) { printf("%s\n", node_pid_format(member_list[i].nodeid, member_list[i].pid)); } /* Is it us?? NOTE: in reality we should also check the nodeid */ if (left_list_entries && left_list[0].pid == getpid()) { printf("We have left the building\n"); quit = 1; } }
static void ConfchgCallback ( cpg_handle_t handle, const struct cpg_name *groupName, const struct cpg_address *member_list, size_t member_list_entries, const struct cpg_address *left_list, size_t left_list_entries, const struct cpg_address *joined_list, size_t joined_list_entries) { unsigned int i; int result; uint32_t nodeid; print_time(); printf("ConfchgCallback: group '"); print_cpgname(groupName); printf("'\n"); print_localnodeid(handle); for (i=0; i<joined_list_entries; i++) { printf("joined %s reason: %d\n", node_pid_format(joined_list[i].nodeid, joined_list[i].pid), joined_list[i].reason); } for (i=0; i<left_list_entries; i++) { printf("left %s reason: %d\n", node_pid_format(left_list[i].nodeid, left_list[i].pid), left_list[i].reason); } printf("nodes in group now %lu\n", (unsigned long int) member_list_entries); for (i=0; i<member_list_entries; i++) { printf("%s\n", node_pid_format(member_list[i].nodeid, member_list[i].pid)); } result = cpg_local_get(handle, &nodeid); if(result != CS_OK) { printf("failed to get local nodeid %d\n", result); nodeid = 0; } /* Is it us?? NOTE: in reality we should also check the nodeid */ if (left_list_entries && (pid_t)left_list[0].pid == getpid()) { printf("We might have left the building pid %d\n", left_list[0].pid); /* can only use nodeidStart as a reliable check (version <= 1.4.2) */ if(nodeidStart) { /* report dynamic nature of nodeid returned from local_get */ /* local get of nodeid might change identity from original! */ if(htonl((uint32_t)nodeid) == INADDR_LOOPBACK) { printf("We probably left the building switched identity? start nodeid %d nodeid %d current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid); } else if(htonl((uint32_t)left_list[0].nodeid) == INADDR_LOOPBACK) { printf("We probably left the building started alone? start nodeid %d nodeid %d current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid); } /* a possibly reliable way to check is based on original address */ if(left_list[0].nodeid == nodeidStart) { printf("We have left the building direct match start nodeid %d nodeid %d local get current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid); // quit = 1; restart = 1; } else { printf("Probably another node with matching pid start nodeid %d nodeid %d current nodeid %d pid %d\n", nodeidStart, left_list[0].nodeid, nodeid, left_list[0].pid); } } } }