/* keep track of the nodes */ static void statechange(void) { int i, rv; old_node_count = cman_node_count; memcpy(&old_nodes, &cman_nodes, sizeof(old_nodes)); cman_node_count = 0; memset(&cman_nodes, 0, sizeof(cman_nodes)); rv = cman_get_nodes(ch, O2NM_MAX_NODES, &cman_node_count, cman_nodes); if (rv < 0) { log_debug("cman_get_nodes error %d %d", rv, errno); return; } for (i = 0; i < old_node_count; i++) { if (old_nodes[i].cn_member && !is_cman_member(old_nodes[i].cn_nodeid)) { log_debug("cman: node %d removed", old_nodes[i].cn_nodeid); } } for (i = 0; i < cman_node_count; i++) { if (cman_nodes[i].cn_member && !is_old_member(cman_nodes[i].cn_nodeid)) { log_debug("cman: node %d added", cman_nodes[i].cn_nodeid); } } }
static int all_nodeids_are_members(void) { int i, j, rv, found; memset(&cman_nodes, 0, sizeof(cman_nodes)); cman_nodes_count = 0; rv = cman_get_nodes(ch, MAX_NODES, &cman_nodes_count, cman_nodes); if (rv < 0) return -1; for (i = 0; i < all_nodeids_count; i++) { found = 0; for (j = 0; j < cman_nodes_count; j++) { if (cman_nodes[j].cn_nodeid == all_nodeids[i] && cman_nodes[j].cn_member) { found = 1; break; } } if (!found) return 0; } return 1; }
int member_list_nodes(clv_clnode_head_t *cn_head) { int node_count, i; cman_handle_t cman_handle; cman_node_t *cman_nodes, local_node; if ((cman_handle = cman_init(0)) == 0) { return -1; } if ((node_count = cman_get_node_count(cman_handle)) < 0) { return -1; } cman_nodes = calloc((size_t) node_count, sizeof(cman_node_t)); cman_get_nodes(cman_handle, node_count, &node_count, cman_nodes); local_node.cn_name[0] = '\0'; /* init cn_name for cman_get_node */ if (cman_get_node(cman_handle, CMAN_NODEID_US, &local_node) != 0) { return -1; } for (i = 0; i < node_count; i++) { clv_clnode_t *n; n = malloc(sizeof(clv_clnode_t)); STAILQ_INSERT_TAIL(cn_head, n, next); n->id = (uint32_t) cman_nodes[i].cn_nodeid; n->host = strdup(cman_nodes[i].cn_name); n->status = 0; if (cman_nodes[i].cn_member != 0) { n->status |= CLUSTER_NODE_ONLINE; } if (cman_nodes[i].cn_nodeid == local_node.cn_nodeid) { n->status |= CLUSTER_NODE_LOCAL; } } free(cman_nodes); cman_finish(cman_handle); return 0; }
static void statechange(void) { cman_cluster_t info; cman_node_t *old; int i, j, rv; struct cman_node_address addrs[MAX_NODE_ADDRESSES]; int num_addrs; struct cman_node_address *addrptr = addrs; rv = cman_get_cluster(ch, &info); if (rv < 0) { log_error("cman_get_cluster error %d %d", rv, errno); /* keep going, this is just informational */ memset(&info, 0, sizeof(info)); } cluster_ringid_seq = info.ci_generation; cluster_quorate = cman_is_quorate(ch); old_node_count = cman_node_count; memcpy(&old_nodes, &cman_nodes, sizeof(old_nodes)); cman_node_count = 0; memset(&cman_nodes, 0, sizeof(cman_nodes)); rv = cman_get_nodes(ch, MAX_NODES, &cman_node_count, cman_nodes); if (rv < 0) { log_debug("cman_get_nodes error %d %d", rv, errno); return; } /* Never allow node ID 0 to be considered a member #315711 */ for (i = 0; i < cman_node_count; i++) { if (cman_nodes[i].cn_nodeid == 0) { cman_nodes[i].cn_member = 0; break; } } for (i = 0; i < old_node_count; i++) { if (old_nodes[i].cn_member && !is_cluster_member(old_nodes[i].cn_nodeid)) { log_debug("cluster node %d removed seq %u", old_nodes[i].cn_nodeid, cluster_ringid_seq); node_history_cluster_remove(old_nodes[i].cn_nodeid); del_configfs_node(old_nodes[i].cn_nodeid); } } for (i = 0; i < cman_node_count; i++) { if (cman_nodes[i].cn_member && !is_old_member(cman_nodes[i].cn_nodeid)) { log_debug("cluster node %d added seq %u", cman_nodes[i].cn_nodeid, cluster_ringid_seq); rv = cman_get_node_addrs(ch, cman_nodes[i].cn_nodeid, MAX_NODE_ADDRESSES, &num_addrs, addrs); if (rv < 0) { log_debug("cman_get_node_addrs failed, falling back to single-homed. "); num_addrs = 1; addrptr = &cman_nodes[i].cn_address; } node_history_cluster_add(cman_nodes[i].cn_nodeid); for (j = 0; j < num_addrs; j++) { add_configfs_node(cman_nodes[i].cn_nodeid, addrptr[j].cna_address, addrptr[j].cna_addrlen, (cman_nodes[i].cn_nodeid == our_nodeid)); } } else { /* look for any nodes that were members of both * old and new but have a new incarnation number * from old to new, indicating they left and rejoined * in between */ old = get_node(old_nodes, old_node_count, cman_nodes[i].cn_nodeid); if (!old) continue; if (cman_nodes[i].cn_incarnation == old->cn_incarnation) continue; log_debug("cluster node %d removed and added seq %u " "old %u new %u", cman_nodes[i].cn_nodeid, cluster_ringid_seq, old->cn_incarnation, cman_nodes[i].cn_incarnation); /* * remove (copied from above) */ node_history_cluster_remove(old_nodes[i].cn_nodeid); del_configfs_node(old_nodes[i].cn_nodeid); /* * add (copied from above) */ rv = cman_get_node_addrs(ch, cman_nodes[i].cn_nodeid, MAX_NODE_ADDRESSES, &num_addrs, addrs); if (rv < 0) { log_debug("cman_get_node_addrs failed, falling back to single-homed. "); num_addrs = 1; addrptr = &cman_nodes[i].cn_address; } node_history_cluster_add(cman_nodes[i].cn_nodeid); for (j = 0; j < num_addrs; j++) { add_configfs_node(cman_nodes[i].cn_nodeid, addrptr[j].cna_address, addrptr[j].cna_addrlen, (cman_nodes[i].cn_nodeid == our_nodeid)); } } } }