[PATCH] cpg: Never choose downlist with localnode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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>
---
 exec/cpg.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/exec/cpg.c b/exec/cpg.c
index da60d80..f7acbc8 100644
--- a/exec/cpg.c
+++ b/exec/cpg.c
@@ -724,6 +724,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;
@@ -731,10 +733,26 @@ static struct downlist_msg* downlist_master_choose (void)
 
 		cmp = list_entry(iter, struct downlist_msg, list);
 		downlist_log("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;
 
@@ -749,6 +767,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


[Index of Archives]     [Linux Clusters]     [Corosync Project]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Linux Kernel]     [Linux SCSI]     [X.Org]

  Powered by Linux