int log_current_epoch(void) { if (!current_vnode_info) return update_epoch_log(sys->epoch, NULL, 0); return update_epoch_log(sys->epoch, current_vnode_info->nodes, current_vnode_info->nr_nodes); }
static void update_cluster_info(struct join_message *msg, struct sd_node *joined, struct sd_node *nodes, size_t nr_nodes) { eprintf("status = %d, epoch = %d, %x, %d\n", msg->cluster_status, msg->epoch, msg->result, sys->join_finished); if (sys_stat_join_failed()) return; if (!sys->join_finished) finish_join(msg, joined, nodes, nr_nodes); sys->nodes[sys->nr_nodes++] = *joined; qsort(sys->nodes, sys->nr_nodes, sizeof(*sys->nodes), node_cmp); if (msg->cluster_status == SD_STATUS_OK || msg->cluster_status == SD_STATUS_HALT) { if (msg->inc_epoch) { sys->epoch++; update_epoch_log(sys->epoch); update_epoch_store(sys->epoch); } /* Fresh node */ if (!sys_stat_ok() && !sys_stat_halt()) { set_cluster_copies(sys->nr_copies); set_cluster_flags(sys->flags); set_cluster_ctime(msg->ctime); } } update_vnode_info(); sys_stat_set(msg->cluster_status); print_node_list(sys->nodes, sys->nr_nodes); }
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); } }