[Cluster-devel] cluster/cman/daemon commands.c

pcaulfield at sourceware.org pcaulfield at sourceware.org
Mon Sep 17 13:35:36 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	RHEL5
Changes by:	pcaulfield at sourceware.org	2007-09-17 13:35:35

Modified files:
	cman/daemon    : commands.c 

Log message:
	Correctly reduce quorum when a node leaves using "cman_tool leave remove"
	bz#271701

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/daemon/commands.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.55.2.10&r2=1.55.2.11

--- cluster/cman/daemon/commands.c	2007/09/17 13:22:31	1.55.2.10
+++ cluster/cman/daemon/commands.c	2007/09/17 13:35:35	1.55.2.11
@@ -95,7 +95,7 @@
 static int send_port_open_msg(unsigned char port);
 static int send_port_enquire(int nodeid);
 static void process_internal_message(char *data, int len, int nodeid, int byteswap);
-static void recalculate_quorum(int allow_decrease);
+static void recalculate_quorum(int allow_decrease, int by_current_nodes);
 static void send_kill(int nodeid, uint16_t reason);
 static char *killmsg_reason(int reason);
 
@@ -326,11 +326,11 @@
 }
 
 /* Recalculate cluster quorum, set quorate and notify changes */
-static void recalculate_quorum(int allow_decrease)
+static void recalculate_quorum(int allow_decrease, int by_current_nodes)
 {
 	unsigned int total_votes;
 
-	quorum = calculate_quorum(allow_decrease, 0, &total_votes);
+	quorum = calculate_quorum(allow_decrease, by_current_nodes?cluster_members:0, &total_votes);
 	set_quorate(total_votes);
 	notify_listeners(NULL, EVENT_REASON_STATECHANGE, 0);
 }
@@ -790,7 +790,7 @@
 		return -EINVAL;
 	}
 
-	recalculate_quorum(1);
+	recalculate_quorum(1, 0);
 
 	send_reconfigure(arg.nodeid, RECONFIG_PARAM_NODE_VOTES, arg.newvotes);
 
@@ -1033,7 +1033,7 @@
 	else {
 		log_msg(LOG_ERR, "Now got CCS information version %d, continuing\n", config_version);
 		config_error = 0;
-		recalculate_quorum(0);
+		recalculate_quorum(0, 0);
 	}
 }
 
@@ -1048,7 +1048,7 @@
 	if (quorum_device->last_hello.tv_sec + quorumdev_poll/1000 < now.tv_sec) {
 		quorum_device->state = NODESTATE_DEAD;
 		log_msg(LOG_INFO, "lost contact with quorum device\n");
-		recalculate_quorum(0);
+		recalculate_quorum(0, 0);
 	}
 	else {
 		openais_timer_add_duration((unsigned long long)quorumdev_poll*1000000, quorum_device,
@@ -1069,7 +1069,7 @@
 		gettimeofday(&quorum_device->last_hello, NULL);
                 if (quorum_device->state == NODESTATE_DEAD) {
                         quorum_device->state = NODESTATE_MEMBER;
-                        recalculate_quorum(0);
+                        recalculate_quorum(0, 0);
 
 			openais_timer_add_duration((unsigned long long)quorumdev_poll*1000000, quorum_device,
 						   quorum_device_timer_fn, &quorum_device_timer);
@@ -1078,7 +1078,7 @@
         else {
                 if (quorum_device->state == NODESTATE_MEMBER) {
                         quorum_device->state = NODESTATE_DEAD;
-                        recalculate_quorum(0);
+                        recalculate_quorum(0, 0);
 			openais_timer_delete(quorum_device_timer);
                 }
         }
@@ -1504,7 +1504,7 @@
 		if (config_version > msg->config_version) {
 			// TODO tell everyone else to update...
 		}
-		recalculate_quorum(0);
+		recalculate_quorum(0, 0);
 	}
 
 
@@ -1641,12 +1641,12 @@
 				node->expected_votes = msg->value;
 			}
 		}
-		recalculate_quorum(1);  /* Allow decrease */
+		recalculate_quorum(1, 0);  /* Allow decrease */
 		break;
 
 	case RECONFIG_PARAM_NODE_VOTES:
 		node->votes = msg->value;
-		recalculate_quorum(1);  /* Allow decrease */
+		recalculate_quorum(1, 0);  /* Allow decrease */
 		break;
 
 	case RECONFIG_PARAM_CONFIG_VERSION:
@@ -1655,7 +1655,7 @@
 				msg->value);
 
 			config_error = 1;
-			recalculate_quorum(0);
+			recalculate_quorum(0, 0);
 
 			wanted_config_version = config_version;
 			openais_timer_add_duration((unsigned long long)ccsd_poll_interval*1000000, NULL,
@@ -1968,7 +1968,7 @@
 		node->incarnation = incarnation;
 		node->state = NODESTATE_MEMBER;
 		cluster_members++;
-		recalculate_quorum(0);
+		recalculate_quorum(0, 0);
 	}
 }
 
@@ -1998,7 +1998,7 @@
 	case NODESTATE_MEMBER:
 		node->state = NODESTATE_DEAD;
 		cluster_members--;
-		recalculate_quorum(0);
+		recalculate_quorum(0, 0);
 		break;
 
 	case NODESTATE_AISONLY:
@@ -2009,10 +2009,10 @@
 		node->state = NODESTATE_DEAD;
 		cluster_members--;
 
-		if ((node->leave_reason & 0xF) == CLUSTER_LEAVEFLAG_REMOVED)
-			recalculate_quorum(1);
-		else
-			recalculate_quorum(0);
+		if ((node->leave_reason & 0xF) & CLUSTER_LEAVEFLAG_REMOVED) 
+			recalculate_quorum(1, 1);
+		else 
+			recalculate_quorum(0, 0);
 		break;
 
 	case NODESTATE_JOINING:




More information about the Cluster-devel mailing list