static void finish_join(struct join_message *msg, struct sd_node *joined, struct sd_node *nodes, size_t nr_nodes) { sys->join_finished = 1; sys->epoch = msg->epoch; if (msg->cluster_status != SD_STATUS_OK) update_exceptional_node_list(get_latest_epoch(), msg); /* We don't need backend for gateway-only node */ if (!sys->gateway_only && !sd_store && strlen((char *)msg->store)) { sd_store = find_store_driver((char *)msg->store); if (sd_store) { if (sd_store->init(obj_path) != SD_RES_SUCCESS) panic("failed to initialize store\n"); 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); } /* We need to purge the stale objects for sheep joining back * after crash */ if (msg->inc_epoch) if (!sys->gateway_only && sd_store->purge_obj && sd_store->purge_obj() != SD_RES_SUCCESS) panic("can't remove stale objects\n"); sockfd_cache_add_group(nodes, nr_nodes); }
/* * If the node is gateway, this function only finds the store driver. * Otherwise, this function initializes the backend store */ int init_store_driver(bool is_gateway) { char driver_name[STORE_LEN], *p; pstrcpy(driver_name, sizeof(driver_name), (char *)sys->cinfo.store); p = memchr(driver_name, '\0', STORE_LEN); if (!p) { /* * If the driver name is not NUL terminated we are in deep * trouble, let's get out here. */ sd_debug("store name not NUL terminated"); return SD_RES_NO_STORE; } /* * The store file might not exist in case this is a new sheep that * never joined a cluster before. */ if (p == driver_name) return 0; sd_store = find_store_driver(driver_name); if (!sd_store) { sd_debug("store %s not found", driver_name); return SD_RES_NO_STORE; } if (is_gateway) return SD_RES_SUCCESS; return sd_store->init(); }
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); } }