static void finish_join(struct join_message *msg, struct sd_node *joined, struct sd_node *nodes, size_t nr_nodes) { int i; sys->nr_copies = msg->nr_copies; sys->epoch = msg->epoch; /* add nodes execept for newly joined one */ for (i = 0; i < nr_nodes; i++) { if (node_eq(nodes + i, joined)) continue; sys->nodes[sys->nr_nodes++] = nodes[i]; } qsort(sys->nodes, sys->nr_nodes, sizeof(*sys->nodes), node_cmp); if (msg->cluster_status != SD_STATUS_OK) { int nr_leave_nodes; uint32_t le; nr_leave_nodes = msg->nr_leave_nodes; le = get_latest_epoch(); for (i = 0; i < nr_leave_nodes; i++) { struct node *n; if (find_entry_list(&msg->leave_nodes[i], &sys->leave_list) || !find_entry_epoch(&msg->leave_nodes[i], le)) { continue; } n = zalloc(sizeof(*n)); if (!n) panic("failed to allocate memory\n"); n->ent = msg->leave_nodes[i]; list_add_tail(&n->list, &sys->leave_list); } } sys->join_finished = 1; if ((msg->cluster_status == SD_STATUS_OK || msg->cluster_status == SD_STATUS_HALT) && msg->inc_epoch) update_epoch_log(sys->epoch); if (!sd_store && strlen((char *)msg->store)) { sd_store = find_store_driver((char *)msg->store); if (sd_store) { sd_store->init(obj_path); if (set_cluster_store(sd_store->name) != SD_RES_SUCCESS) panic("failed to store into config file\n"); } else panic("backend store %s not supported\n", msg->store); } }
/* * Add a node to the list of nodes that weren't part of the cluster before * it shut down, and thus do not count toward the nodes required to allow * an automated restart. These nodes will become part of the cluster by * the time it does get restarted. */ static bool add_delayed_node(uint32_t epoch, struct sd_node *node) { struct node *n; if (find_entry_list(node, &sys->delayed_nodes)) return false; n = xmalloc(sizeof(*n)); n->ent = *node; list_add_tail(&n->list, &sys->delayed_nodes); return true; }
/* * For a node that failed to join check if was part of the original * epoch, and if so add it to the list of node expected to be present * but failing to join. */ static bool add_failed_node(uint32_t epoch, const struct sd_node *node) { struct node *n; if (find_entry_list(node, &sys->failed_nodes)) return false; if (!find_entry_epoch(node, epoch)) return false; n = xmalloc(sizeof(*n)); n->ent = *node; list_add_tail(&n->list, &sys->failed_nodes); return true; }