[SCM] CTDB repository - branch master updated - ctdb-1.0.105-48-g4f50aa8

Ronnie Sahlberg sahlberg at samba.org
Mon Nov 30 22:08:36 MST 2009


The branch, master has been updated
       via  4f50aa8bb8be544058523f2f544109a26c2b3b51 (commit)
      from  821333afb458358f90446062b0242790695e5060 (commit)

http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 4f50aa8bb8be544058523f2f544109a26c2b3b51
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Tue Dec 1 16:06:59 2009 +1100

    when we detect a ip-allocation mismatch, just force a new ip reassignment
    instead of a full blown recovery

-----------------------------------------------------------------------

Summary of changes:
 server/ctdb_recoverd.c |   51 ++++++++++++++++++++++++-----------------------
 1 files changed, 26 insertions(+), 25 deletions(-)


Changeset truncated at 500 lines:

diff --git a/server/ctdb_recoverd.c b/server/ctdb_recoverd.c
index d304e24..a227dba 100644
--- a/server/ctdb_recoverd.c
+++ b/server/ctdb_recoverd.c
@@ -1855,6 +1855,11 @@ static void process_ipreallocate_requests(struct ctdb_context *ctdb, struct ctdb
 	result.dptr  = (uint8_t *)&ret;
 
 	for (callers=rec->reallocate_callers; callers; callers=callers->next) {
+
+		/* Someone that sent srvid==0 does not want a reply */
+		if (callers->rd->srvid == 0) {
+			continue;
+		}
 		DEBUG(DEBUG_INFO,("Sending ip reallocate reply message to "
 				  "%u:%llu\n", (unsigned)callers->rd->pnn,
 				  (unsigned long long)callers->rd->srvid));
@@ -2286,7 +2291,7 @@ static enum monitor_result verify_recmaster(struct ctdb_recoverd *rec, struct ct
 
 /* called to check that the allocation of public ip addresses is ok.
 */
-static int verify_ip_allocation(struct ctdb_context *ctdb, uint32_t pnn)
+static int verify_ip_allocation(struct ctdb_context *ctdb, struct ctdb_recoverd *rec, uint32_t pnn)
 {
 	TALLOC_CTX *mem_ctx = talloc_new(NULL);
 	struct ctdb_all_public_ips *ips = NULL;
@@ -2352,41 +2357,38 @@ static int verify_ip_allocation(struct ctdb_context *ctdb, uint32_t pnn)
 	for (j=0; j<ips->num; j++) {
 		if (ips->ips[j].pnn == pnn) {
 			if (!ctdb_sys_have_ip(&ips->ips[j].addr)) {
+				struct takeover_run_reply rd;
+				TDB_DATA data;
+
 				DEBUG(DEBUG_CRIT,("Public address '%s' is missing and we should serve this ip\n",
 					ctdb_addr_to_str(&ips->ips[j].addr)));
-				ret = ctdb_ctrl_freeze_priority(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, 1);
-				if (ret != 0) {
-					DEBUG(DEBUG_ERR,(__location__ " Failed to freeze node due to public ip address mismatches\n"));
 
-					talloc_free(mem_ctx);
-					return -1;
-				}
-				ret = ctdb_ctrl_setrecmode(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, CTDB_RECOVERY_ACTIVE);
-				if (ret != 0) {
-					DEBUG(DEBUG_ERR,(__location__ " Failed to activate recovery mode due to public ip address mismatches\n"));
+				rd.pnn   = ctdb->pnn;
+				rd.srvid = 0;
+				data.dptr = (uint8_t *)&rd;
+				data.dsize = sizeof(rd);
 
-					talloc_free(mem_ctx);
-					return -1;
+			        ret = ctdb_send_message(ctdb, rec->recmaster, CTDB_SRVID_TAKEOVER_RUN, data);
+				if (ret != 0) {
+					DEBUG(DEBUG_ERR,(__location__ " Failed to send ipreallocate to recmaster :%d\n", (int)rec->recmaster));
 				}
 			}
 		} else {
 			if (ctdb_sys_have_ip(&ips->ips[j].addr)) {
+				struct takeover_run_reply rd;
+				TDB_DATA data;
+
 				DEBUG(DEBUG_CRIT,("We are still serving a public address '%s' that we should not be serving.\n", 
 					ctdb_addr_to_str(&ips->ips[j].addr)));
 
-				ret = ctdb_ctrl_freeze_priority(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, 1);
-				if (ret != 0) {
-					DEBUG(DEBUG_ERR,(__location__ " Failed to freeze node due to public ip address mismatches\n"));
+				rd.pnn   = ctdb->pnn;
+				rd.srvid = 0;
+				data.dptr = (uint8_t *)&rd;
+				data.dsize = sizeof(rd);
 
-					talloc_free(mem_ctx);
-					return -1;
-				}
-				ret = ctdb_ctrl_setrecmode(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, CTDB_RECOVERY_ACTIVE);
+			        ret = ctdb_send_message(ctdb, rec->recmaster, CTDB_SRVID_TAKEOVER_RUN, data);
 				if (ret != 0) {
-					DEBUG(DEBUG_ERR,(__location__ " Failed to activate recovery mode due to public ip address mismatches\n"));
-
-					talloc_free(mem_ctx);
-					return -1;
+					DEBUG(DEBUG_ERR,(__location__ " Failed to send ipreallocate to recmaster :%d\n", (int)rec->recmaster));
 				}
 			}
 		}
@@ -2939,9 +2941,8 @@ again:
 	 */ 
 	if (ctdb->do_checkpublicip) {
 		if (rec->ip_check_disable_ctx == NULL) {
-			if (verify_ip_allocation(ctdb, pnn) != 0) {
+			if (verify_ip_allocation(ctdb, rec, pnn) != 0) {
 				DEBUG(DEBUG_ERR, (__location__ " Public IPs were inconsistent.\n"));
-				goto again;
 			}
 		}
 	}


-- 
CTDB repository


More information about the samba-cvs mailing list