On 04/27/2012 11:35 PM, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig <hch at lst.de> > > Index: sheepdog/sheep/group.c > =================================================================== > --- sheepdog.orig/sheep/group.c 2012-04-27 17:19:46.000000000 +0200 > +++ sheepdog/sheep/group.c 2012-04-27 17:20:05.912081474 +0200 > @@ -524,22 +524,10 @@ static void get_vdi_bitmap_from_sd_list( > get_vdi_bitmap_from(sys->nodes + i); > } > > -static void update_cluster_info(struct join_message *msg, > - struct sd_node *joined, > - struct sd_node *nodes, > - size_t nr_nodes) > -{ > - int i, le; > - int nr_leave_nodes; > - struct node *n; > - > - 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) > - goto join_finished; > +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; > @@ -554,29 +542,30 @@ static void update_cluster_info(struct j > qsort(sys->nodes, sys->nr_nodes, sizeof(*sys->nodes), node_cmp); > > if (msg->cluster_status != SD_STATUS_OK) { > + int nr_leave_nodes, le; > + > nr_leave_nodes = msg->nr_leave_nodes; > le = get_latest_epoch(); > for (i = 0; i < nr_leave_nodes; i++) { > - n = zalloc(sizeof(*n)); > - if (!n) > - panic("failed to allocate memory\n"); > + struct node *n; > > - if (find_entry_list(&msg->leave_nodes[i], &sys->leave_list) > - || !find_entry_epoch(&msg->leave_nodes[i], le)) { > - free(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) > + 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)) { > @@ -588,8 +577,20 @@ static void update_cluster_info(struct j > } else > panic("backend store %s not supported\n", msg->store); > } > +} > + > +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); > > -join_finished: > sys->nodes[sys->nr_nodes++] = *joined; > qsort(sys->nodes, sys->nr_nodes, sizeof(*sys->nodes), node_cmp); > > @@ -608,11 +609,9 @@ join_finished: > } > } > update_vnode_info(); > + sys_stat_set(msg->cluster_status); > > print_node_list(sys->nodes, sys->nr_nodes); > - > - sys_stat_set(msg->cluster_status); > - return; > } > > static void __sd_notify(struct event_struct *cevent) > @@ -831,7 +830,10 @@ static void __sd_join_done(struct event_ > > print_node_list(sys->nodes, sys->nr_nodes); > > - update_cluster_info(jm, &w->joined, w->member_list, w->member_list_entries); > + if (!sys_stat_join_failed()) { > + update_cluster_info(jm, &w->joined, w->member_list, > + w->member_list_entries); > + } > > if (sys_can_recover() && jm->inc_epoch) { > list_for_each_entry_safe(node, t, &sys->leave_list, list) { Applied, thanks Yuan |