Просмотр исходного кода

votequorum: fix auto_tie_breaker design and simplify code a lot

auto_tie_breaker requires to know the lowest node id in the currently
quorate partition and not of the whole cluster.

this allow us to determine the lowest node id as soon as we are quorate
and remove the complexity to read it from WFA or nodelist. Add
the same time it adds the flexibility for dynamic nodeids in a cluster.

drop requirement on WFA if nodelist is not specified

update man page

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
Fabio M. Di Nitto 14 лет назад
Родитель
Сommit
88e6830df1
2 измененных файлов с 7 добавлено и 68 удалено
  1. 7 31
      exec/votequorum.c
  2. 0 37
      man/votequorum.5

+ 7 - 31
exec/votequorum.c

@@ -447,7 +447,8 @@ static void get_lowest_node_id(void)
 
 	list_iterate(tmp, &cluster_members_list) {
 		node = list_entry(tmp, struct cluster_node, list);
-		if (node->node_id < lowest_node_id) {
+		if ((node->state == NODESTATE_MEMBER) &&
+		    (node->node_id < lowest_node_id)) {
 			lowest_node_id = node->node_id;
 		}
 	}
@@ -466,10 +467,9 @@ static int check_low_node_id_partition(void)
 
 	list_iterate(tmp, &cluster_members_list) {
 		node = list_entry(tmp, struct cluster_node, list);
-		if (node->state == NODESTATE_MEMBER) {
-			if (node->node_id == lowest_node_id) {
+		if ((node->state == NODESTATE_MEMBER) &&
+		    (node->node_id == lowest_node_id)) {
 				found = 1;
-			}
 		}
 	}
 
@@ -573,13 +573,13 @@ static void are_we_quorate(unsigned int total_votes)
 			return;
 		}
 		wait_for_all_status = 0;
-		get_lowest_node_id();
 	}
 
 	if (quorum > total_votes) {
 		quorate = 0;
 	} else {
 		quorate = 1;
+		get_lowest_node_id();
 	}
 
 	if ((auto_tie_breaker) &&
@@ -664,8 +664,8 @@ static int votequorum_read_nodelist_configuration(uint32_t *votes,
 	char tmp_key[ICMAP_KEYNAME_MAXLEN];
 	uint32_t our_pos, node_pos;
 	uint32_t nodelist_expected_votes = 0;
-	uint32_t nodeid, node_votes = 0;
-	int res = 0, nodeid_found = 1;
+	uint32_t node_votes = 0;
+	int res = 0;
 
 	ENTER();
 
@@ -698,26 +698,6 @@ static int votequorum_read_nodelist_configuration(uint32_t *votes,
 		if (node_pos == our_pos) {
 			*votes = node_votes;
 		}
-
-		if (nodeid_found == 0) {
-			continue;
-		}
-
-		snprintf(tmp_key, ICMAP_KEYNAME_MAXLEN, "nodelist.node.%u.nodeid", node_pos);
-		if (icmap_get_uint32(tmp_key, &nodeid) != CS_OK) {
-			nodeid_found = 0;
-			lowest_node_id = -1;
-			continue;
-		}
-
-		if (lowest_node_id == -1) {
-			lowest_node_id = nodeid;
-			continue;
-		}
-
-		if (nodeid < lowest_node_id) {
-			lowest_node_id = nodeid;
-		}
 	}
 
 	*expected_votes = nodelist_expected_votes;
@@ -760,10 +740,6 @@ static int votequorum_readconfig_static(void)
 		return -1;
 	}
 
-	if ((auto_tie_breaker) && (lowest_node_id == -1)) {
-		wait_for_all = 1;
-	}
-
 	if (wait_for_all) {
 		wait_for_all_status = 1;
 	}

+ 0 - 37
man/votequorum.5

@@ -260,12 +260,6 @@ at the same time, in a deterministic fashion. The cluster partition, or the
 set of nodes that are still in contact with the node that has the lowest
 nodeid will remain quorate. The other nodes will be inquorate.
 .PP
-NOTES: For ATB to work, the lowest nodeid in the cluster needs to be known.
-corosync can automatically generate a nodeid or it can be overridden manually.
-If nodeids are not known at startup, ATB will automatically enable WFA.
-WFA will guarantee that all nodeids in the cluster are known before ATB can
-operate correctly.
-.PP
 Example configuration 1:
 .nf
 
@@ -276,37 +270,6 @@ quorum {
 }
 
 .fi
-this will also automatically enable WFA.
-.PP
-Example configuration 2:
-.nf
-
-quorum {
-    provider: corosync_votequorum
-    auto_tie_breaker: 1
-}
-
-nodelist {
-    node {
-        ring0_addr: 192.168.1.1
-        nodeid: 1
-    }
-    node {
-        ring0_addr: 192.168.1.2
-        nodeid: 2
-    }
-    node {
-        ring0_addr: 192.168.1.3
-        nodeid: 3
-    }
-    node {
-        ring0_addr: 192.168.1.4
-        nodeid: 4
-    }
-}
-
-.fi
-this will allow ATB to work without WFA as all nodeids are known at startup.
 .SH VARIOUS NOTES
 .PP
 * WFA / LMS / ATB can be used combined together.