From mboxrd@z Thu Jan 1 00:00:00 1970 From: pcaulfield@sourceware.org Date: 17 Sep 2007 13:35:36 -0000 Subject: [Cluster-devel] cluster/cman/daemon commands.c Message-ID: <20070917133536.26467.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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: