From: Yunkai Zhang <qiushu.zyk at taobao.com> Since sheeps in delayed_nodes list won't cause recovery when the cluster in WAIT_FOR_JOIN state, it's safe to put sheeps with smaller epoch into delayed_nodes list, regardless of whether it once belonged to the cluster. Benifit from this change, we needn't to restart sheep in the following scenario: 1) Start [0,1,2,3] sheeps: epoch of [0,1,2,3] sheeps = 1 2) Kill [0] sheep, and then Shutdown [1,2,3] sheeps epoch of [0] sheep = 1 epoch of [1,2,3] sheeps = 2 3) Start [1,2] sheeps: epoch of [0] sheep = 1 epoch of [1,2,3] sheeps = 2 cluster status = WAIT_FOR_JOIN (waits [3] sheep) 4) Start [0] sheep: [0] sheep will be added into delayed_nodes list, needn't to restart epoch of [0] sheep = 1 epoch of [1,2,3] sheeps = 2 cluster status = WAIT_FOR_JOIN (waits [3] sheep) 5) Start [3] sheep: epoch of [0,1,2,3] sheeps = 3 cluster status = OK Now cluster start working... Signed-off-by: Yunkai Zhang <qiushu.zyk at taobao.com> --- sheep/group.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sheep/group.c b/sheep/group.c index f7c8ca7..bac371b 100644 --- a/sheep/group.c +++ b/sheep/group.c @@ -423,7 +423,6 @@ static bool add_delayed_node(uint32_t epoch, struct sd_node *node) if (find_entry_list(node, &sys->delayed_nodes)) return false; - assert(!find_entry_epoch(node, epoch)); n = xmalloc(sizeof(*n)); n->ent = *node; @@ -558,10 +557,6 @@ static int cluster_wait_for_join_check(struct sd_node *joined, eprintf("joining node epoch too small: %" PRIu32 " vs %" PRIu32 "\n", jm->epoch, local_epoch); - - if (bsearch(joined, local_entries, nr_local_entries, - sizeof(struct sd_node), node_id_cmp)) - return CJ_RES_FAIL; return CJ_RES_JOIN_LATER; } -- 1.7.11.2 |