Test scenario is follows: - node 1, node 2 - node 1 is paused - node 2 sees node 1 dead - node 1 unpaused - node 1 and 2 both choose same dowlist message which includes node 2 -> node 2 is efectivelly disconnected Patch includes additional test if left_node is localnode. If so, such downlist is ignored. Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx> (backported to flatiron) --- services/cpg.c | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-) diff --git a/services/cpg.c b/services/cpg.c index d7a26f2..dbd61c5 100644 --- a/services/cpg.c +++ b/services/cpg.c @@ -729,6 +729,8 @@ static struct downlist_msg* downlist_master_choose (void) struct list_head *iter; uint32_t cmp_members; uint32_t best_members; + uint32_t i; + int ignore_msg; for (iter = downlist_messages_head.next; iter != &downlist_messages_head; @@ -736,10 +738,26 @@ static struct downlist_msg* downlist_master_choose (void) cmp = list_entry(iter, struct downlist_msg, list); downlist_log(LOGSYS_LEVEL_DEBUG, "comparing", cmp); + + ignore_msg = 0; + for (i = 0; i < cmp->left_nodes; i++) { + if (cmp->nodeids[i] == api->totem_nodeid_get()) { + log_printf (LOG_DEBUG, "Ignoring this entry because I'm in the left list\n"); + + ignore_msg = 1; + break; + } + } + + if (ignore_msg) { + continue ; + } + if (best == NULL) { best = cmp; continue; } + best_members = best->old_members - best->left_nodes; cmp_members = cmp->old_members - cmp->left_nodes; @@ -754,6 +772,9 @@ static struct downlist_msg* downlist_master_choose (void) } } + + assert (best != NULL); + return best; } -- 1.7.1 _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss