[SCM] CTDB repository - branch libctdb updated - ctdb-1.0.114-93-g7e9d5cf

Ronnie Sahlberg sahlberg at samba.org
Tue May 11 22:50:23 MDT 2010


The branch, libctdb has been updated
       via  7e9d5cf24672d50d95094cd5c52a901d38c65527 (commit)
       via  709615ac804b7d93082cdca5b43f292fc7caea17 (commit)
      from  0ecfea29e46dbb2c3892ddafddb82039c6416fe1 (commit)

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


- Log -----------------------------------------------------------------
commit 7e9d5cf24672d50d95094cd5c52a901d38c65527
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Wed May 12 14:34:17 2010 +1000

    remove the timeout parameter to ctdb_control_send() and
    have all callers set this explicitely when they need a timeout
    for the control

commit 709615ac804b7d93082cdca5b43f292fc7caea17
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Wed May 12 14:16:17 2010 +1000

    move some timed event calls out from libctdb and put it back in client/ctdb_client.c

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

Summary of changes:
 client/ctdb_client.c   |   99 +++++++++++++++++++++++++++++++++++++++++-------
 include/ctdb_private.h |    7 +++-
 libctdb/ctdb_client.c  |   30 +-------------
 libctdb/libctdb.c      |    6 +-
 server/ctdb_takeover.c |   26 ++++++++----
 5 files changed, 113 insertions(+), 55 deletions(-)


Changeset truncated at 500 lines:

diff --git a/client/ctdb_client.c b/client/ctdb_client.c
index a0d5997..7b49931 100644
--- a/client/ctdb_client.c
+++ b/client/ctdb_client.c
@@ -254,7 +254,11 @@ int ctdb_control(struct ctdb_context *ctdb, uint32_t destnode, uint64_t srvid,
 
 	state = ctdb_control_send(ctdb, destnode, srvid, opcode, 
 			flags, data, mem_ctx,
-			timeout, errormsg);
+			errormsg);
+	if (state != NULL && timeout && !timeval_is_zero(timeout)) {
+		event_add_timed(ctdb->ev, state, *timeout, ctdb_control_timeout_func, state);
+	}
+
 	return ctdb_control_recv(ctdb, state, mem_ctx, outdata, status, 
 			errormsg);
 }
@@ -323,11 +327,14 @@ int ctdb_ctrl_shutdown(struct ctdb_context *ctdb, struct timeval timeout, uint32
 
 	state = ctdb_control_send(ctdb, destnode, 0, 
 			   CTDB_CONTROL_SHUTDOWN, 0, tdb_null, 
-			   NULL, &timeout, NULL);
+			   NULL, NULL);
 	if (state == NULL) {
 		DEBUG(DEBUG_ERR,(__location__ " ctdb_control for shutdown failed\n"));
 		return -1;
 	}
+	if (!timeval_is_zero(&timeout)) {
+		event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+	}
 
 	return 0;
 }
@@ -377,9 +384,17 @@ int ctdb_ctrl_getvnnmap(struct ctdb_context *ctdb, struct timeval timeout, uint3
 struct ctdb_client_control_state *
 ctdb_ctrl_getrecmode_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct timeval timeout, uint32_t destnode)
 {
-	return ctdb_control_send(ctdb, destnode, 0, 
+	struct ctdb_client_control_state *state;
+
+	state = ctdb_control_send(ctdb, destnode, 0, 
 			   CTDB_CONTROL_GET_RECMODE, 0, tdb_null, 
-			   mem_ctx, &timeout, NULL);
+			   mem_ctx, NULL);
+
+	if (state != NULL && !timeval_is_zero(&timeout)) {
+		event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+	}
+
+	return state;
 }
 
 int ctdb_ctrl_getrecmode_recv(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct ctdb_client_control_state *state, uint32_t *recmode)
@@ -443,9 +458,16 @@ struct ctdb_client_control_state *
 ctdb_ctrl_getrecmaster_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, 
 			struct timeval timeout, uint32_t destnode)
 {
-	return ctdb_control_send(ctdb, destnode, 0, 
+	struct ctdb_client_control_state *state;
+
+	state = ctdb_control_send(ctdb, destnode, 0, 
 			   CTDB_CONTROL_GET_RECMASTER, 0, tdb_null, 
-			   mem_ctx, &timeout, NULL);
+			   mem_ctx, NULL);
+	if (state != NULL && !timeval_is_zero(&timeout)) {
+		event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+	}
+
+	return state;
 }
 
 int ctdb_ctrl_getrecmaster_recv(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct ctdb_client_control_state *state, uint32_t *recmaster)
@@ -672,7 +694,11 @@ struct ctdb_client_control_state *ctdb_ctrl_pulldb_send(
 
 	state = ctdb_control_send(ctdb, destnode, 0, 
 				  CTDB_CONTROL_PULL_DB, 0, indata, 
-				  mem_ctx, &timeout, NULL);
+				  mem_ctx, NULL);
+	if (state != NULL && !timeval_is_zero(&timeout)) {
+		event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+	}
+
 	talloc_free(pull);
 
 	return state;
@@ -1278,9 +1304,16 @@ int ctdb_ctrl_getpid(struct ctdb_context *ctdb, struct timeval timeout, uint32_t
 struct ctdb_client_control_state *
 ctdb_ctrl_freeze_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct timeval timeout, uint32_t destnode, uint32_t priority)
 {
-	return ctdb_control_send(ctdb, destnode, priority, 
+	struct ctdb_client_control_state *state;
+
+	state = ctdb_control_send(ctdb, destnode, priority, 
 			   CTDB_CONTROL_FREEZE, 0, tdb_null, 
-			   mem_ctx, &timeout, NULL);
+			   mem_ctx, NULL);
+	if (state != NULL && !timeval_is_zero(&timeout)) {
+		event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+	}
+
+	return state;
 }
 
 /* 
@@ -2243,9 +2276,16 @@ uint32_t ctdb_get_pnn(struct ctdb_context *ctdb)
 struct ctdb_client_control_state *
 ctdb_ctrl_uptime_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct timeval timeout, uint32_t destnode)
 {
-	return ctdb_control_send(ctdb, destnode, 0, 
+	struct ctdb_client_control_state *state;
+
+	state = ctdb_control_send(ctdb, destnode, 0, 
 			   CTDB_CONTROL_UPTIME, 0, tdb_null, 
-			   mem_ctx, &timeout, NULL);
+			   mem_ctx, NULL);
+	if (state != NULL && !timeval_is_zero(&timeout)) {
+		event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+	}
+
+	return state;
 }
 
 int ctdb_ctrl_uptime_recv(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct ctdb_client_control_state *state, struct ctdb_uptime **uptime)
@@ -2407,12 +2447,15 @@ int ctdb_client_async_control(struct ctdb_context *ctdb,
 		uint32_t pnn = nodes[j];
 
 		state = ctdb_control_send(ctdb, pnn, srvid, opcode, 
-					  0, data, async_data, &timeout, NULL);
+					  0, data, async_data, NULL);
 		if (state == NULL) {
 			DEBUG(DEBUG_ERR,(__location__ " Failed to call async control %u\n", (unsigned)opcode));
 			talloc_free(async_data);
 			return -1;
 		}
+		if (!timeval_is_zero(&timeout)) {
+			event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+		}
 		
 		ctdb_client_async_add(async_data, state);
 	}
@@ -2596,9 +2639,16 @@ ctdb_read_pnn_lock(int fd, int32_t pnn)
 struct ctdb_client_control_state *
 ctdb_ctrl_getcapabilities_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct timeval timeout, uint32_t destnode)
 {
-	return ctdb_control_send(ctdb, destnode, 0, 
+	struct ctdb_client_control_state *state;
+
+	state = ctdb_control_send(ctdb, destnode, 0, 
 			   CTDB_CONTROL_GET_CAPABILITIES, 0, tdb_null, 
-			   mem_ctx, &timeout, NULL);
+			   mem_ctx, NULL);
+	if (state != NULL && !timeval_is_zero(&timeout)) {
+		event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+	}
+
+	return state;
 }
 
 int ctdb_ctrl_getcapabilities_recv(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct ctdb_client_control_state *state, uint32_t *capabilities)
@@ -3480,3 +3530,24 @@ int ctdb_ctrl_get_db_priority(struct ctdb_context *ctdb, struct timeval timeout,
 
 	return 0;
 }
+
+/* time out handler for ctdb_control */
+void ctdb_control_timeout_func(struct event_context *ev, struct timed_event *te, 
+	struct timeval t, void *private_data)
+{
+	struct ctdb_client_control_state *state = talloc_get_type(private_data, struct ctdb_client_control_state);
+
+	DEBUG(DEBUG_ERR,(__location__ " control timed out. reqid:%u opcode:%u "
+			 "dstnode:%u\n", state->reqid, state->c->opcode,
+			 state->c->hdr.destnode));
+
+	state->state = CTDB_CONTROL_TIMEOUT;
+
+	/* if we had a callback registered for this control, pull the response
+	   and call the callback.
+	*/
+	if (state->async.fn) {
+		event_add_timed(state->ctdb->ev, state, timeval_zero(), ctdb_invoke_control_callback, state);
+	}
+}
+
diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index 685048b..90d4c13 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -1075,7 +1075,6 @@ ctdb_control_send(struct ctdb_context *ctdb,
 		uint32_t destnode, uint64_t srvid, 
 		uint32_t opcode, uint32_t flags, TDB_DATA data, 
 		TALLOC_CTX *mem_ctx,
-		struct timeval *timeout,
 		char **errormsg);
 
 
@@ -1647,4 +1646,10 @@ int verify_remote_ip_allocation(struct ctdb_context *ctdb,
 int update_ip_assignment_tree(struct ctdb_context *ctdb,
 				struct ctdb_public_ip *ip);
 
+void ctdb_control_timeout_func(struct event_context *ev,
+			       struct timed_event *te, 
+			       struct timeval t, void *private_data);
+
+void ctdb_invoke_control_callback(struct event_context *ev, struct timed_event *te, struct timeval t, void *private_data);
+
 #endif
diff --git a/libctdb/ctdb_client.c b/libctdb/ctdb_client.c
index c7ce138..23faa4b 100644
--- a/libctdb/ctdb_client.c
+++ b/libctdb/ctdb_client.c
@@ -216,7 +216,7 @@ int ctdb_control_recv(struct ctdb_context *ctdb,
    called when a control completes or timesout to invoke the callback
    function the user provided
 */
-static void invoke_control_callback(struct event_context *ev, struct timed_event *te, 
+void ctdb_invoke_control_callback(struct event_context *ev, struct timed_event *te, 
 	struct timeval t, void *private_data)
 {
 	struct ctdb_client_control_state *state;
@@ -278,7 +278,7 @@ static void ctdb_client_reply_control(struct ctdb_context *ctdb,
 	   and call the callback.
 	*/
 	if (state->async.fn) {
-		event_add_timed(ctdb->ev, state, timeval_zero(), invoke_control_callback, state);
+		event_add_timed(ctdb->ev, state, timeval_zero(), ctdb_invoke_control_callback, state);
 	}
 }
 
@@ -436,32 +436,11 @@ static int ctdb_client_queue_pkt(struct ctdb_context *ctdb, struct ctdb_req_head
 }
 
 
-/* time out handler for ctdb_control */
-static void control_timeout_func(struct event_context *ev, struct timed_event *te, 
-	struct timeval t, void *private_data)
-{
-	struct ctdb_client_control_state *state = talloc_get_type(private_data, struct ctdb_client_control_state);
-
-	DEBUG(DEBUG_ERR,(__location__ " control timed out. reqid:%u opcode:%u "
-			 "dstnode:%u\n", state->reqid, state->c->opcode,
-			 state->c->hdr.destnode));
-
-	state->state = CTDB_CONTROL_TIMEOUT;
-
-	/* if we had a callback registered for this control, pull the response
-	   and call the callback.
-	*/
-	if (state->async.fn) {
-		event_add_timed(state->ctdb->ev, state, timeval_zero(), invoke_control_callback, state);
-	}
-}
-
 /* async version of send control request */
 struct ctdb_client_control_state *ctdb_control_send(struct ctdb_context *ctdb, 
 		uint32_t destnode, uint64_t srvid, 
 		uint32_t opcode, uint32_t flags, TDB_DATA data, 
 		TALLOC_CTX *mem_ctx,
-		struct timeval *timeout,
 		char **errormsg)
 {
 	struct ctdb_client_control_state *state;
@@ -504,11 +483,6 @@ struct ctdb_client_control_state *ctdb_control_send(struct ctdb_context *ctdb,
 		memcpy(&c->data[0], data.dptr, data.dsize);
 	}
 
-	/* timeout */
-	if (timeout && !timeval_is_zero(timeout)) {
-		event_add_timed(ctdb->ev, state, *timeout, control_timeout_func, state);
-	}
-
 	ret = ctdb_client_queue_pkt(ctdb, &(c->hdr));
 	if (ret != 0) {
 		talloc_free(state);
diff --git a/libctdb/libctdb.c b/libctdb/libctdb.c
index 254be93..638874c 100644
--- a/libctdb/libctdb.c
+++ b/libctdb/libctdb.c
@@ -164,7 +164,7 @@ ctdb_getrecmaster_send(struct ctdb_context *ctdb,
 
 	state = ctdb_control_send(ctdb, destnode, 0, 
 			   CTDB_CONTROL_GET_RECMASTER, 0, tdb_null, 
-			   ctdb, NULL, NULL);
+			   ctdb, NULL);
 
 	if (state == NULL) {
 		DEBUG(DEBUG_ERR,(__location__ " Failed to send GET_RECMASTER control\n"));
@@ -246,7 +246,7 @@ ctdb_set_message_handler_send(struct ctdb_context *ctdb, uint64_t srvid,
 
 	state = ctdb_control_send(ctdb, CTDB_CURRENT_NODE, srvid, 
 			   CTDB_CONTROL_REGISTER_SRVID, 0, tdb_null, 
-			   ctdb, NULL, NULL);
+			   ctdb, NULL);
 
 	if (state == NULL) {
 		DEBUG(DEBUG_ERR,(__location__ " Failed to send REGISTER_SRVID control\n"));
@@ -320,7 +320,7 @@ ctdb_remove_message_handler_send(struct ctdb_context *ctdb, uint64_t srvid,
 
 	state = ctdb_control_send(ctdb, CTDB_CURRENT_NODE, srvid, 
 			   CTDB_CONTROL_DEREGISTER_SRVID, 0, tdb_null, 
-			   ctdb, NULL, NULL);
+			   ctdb, NULL);
 
 	if (state == NULL) {
 		DEBUG(DEBUG_ERR,(__location__ " Failed to send DEREGISTER_SRVID control\n"));
diff --git a/server/ctdb_takeover.c b/server/ctdb_takeover.c
index 6857f37..596a7ee 100644
--- a/server/ctdb_takeover.c
+++ b/server/ctdb_takeover.c
@@ -1218,7 +1218,6 @@ int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map *nodemap)
 	struct ctdb_public_ip_list *all_ips, *tmp_ip;
 	int maxnode, maxnum=0, minnode, minnum=0, num;
 	TDB_DATA data;
-	struct timeval timeout;
 	struct client_async_data *async_data;
 	struct ctdb_client_control_state *state;
 	TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
@@ -1442,24 +1441,29 @@ finished:
 				ipv4.pnn = tmp_ip->pnn;
 				ipv4.sin = tmp_ip->addr.ip;
 
-				timeout = TAKEOVER_TIMEOUT();
+				
 				data.dsize = sizeof(ipv4);
 				data.dptr  = (uint8_t *)&ipv4;
 				state = ctdb_control_send(ctdb, nodemap->nodes[i].pnn,
 						0, CTDB_CONTROL_RELEASE_IPv4, 0,
 						data, async_data,
-						&timeout, NULL);
+						NULL);
+				if (state != NULL) {
+					event_add_timed(ctdb->ev, state, TAKEOVER_TIMEOUT(), ctdb_control_timeout_func, state);
+				}
 			} else {
 				ip.pnn  = tmp_ip->pnn;
 				ip.addr = tmp_ip->addr;
 
-				timeout = TAKEOVER_TIMEOUT();
 				data.dsize = sizeof(ip);
 				data.dptr  = (uint8_t *)&ip;
 				state = ctdb_control_send(ctdb, nodemap->nodes[i].pnn,
 						0, CTDB_CONTROL_RELEASE_IP, 0,
 						data, async_data,
-						&timeout, NULL);
+						NULL);
+				if (state != NULL) {
+					event_add_timed(ctdb->ev, state, TAKEOVER_TIMEOUT(), ctdb_control_timeout_func, state);
+				}
 			}
 
 			if (state == NULL) {
@@ -1492,24 +1496,28 @@ finished:
 			ipv4.pnn = tmp_ip->pnn;
 			ipv4.sin = tmp_ip->addr.ip;
 
-			timeout = TAKEOVER_TIMEOUT();
 			data.dsize = sizeof(ipv4);
 			data.dptr  = (uint8_t *)&ipv4;
 			state = ctdb_control_send(ctdb, tmp_ip->pnn,
 					0, CTDB_CONTROL_TAKEOVER_IPv4, 0,
 					data, async_data,
-					&timeout, NULL);
+					NULL);
+			if (state != NULL) {
+				event_add_timed(ctdb->ev, state, TAKEOVER_TIMEOUT(), ctdb_control_timeout_func, state);
+			}
 		} else {
 			ip.pnn  = tmp_ip->pnn;
 			ip.addr = tmp_ip->addr;
 
-			timeout = TAKEOVER_TIMEOUT();
 			data.dsize = sizeof(ip);
 			data.dptr  = (uint8_t *)&ip;
 			state = ctdb_control_send(ctdb, tmp_ip->pnn,
 					0, CTDB_CONTROL_TAKEOVER_IP, 0,
 					data, async_data,
-					&timeout, NULL);
+					NULL);
+			if (state != NULL) {
+				event_add_timed(ctdb->ev, state, TAKEOVER_TIMEOUT(), ctdb_control_timeout_func, state);
+			}
 		}
 		if (state == NULL) {
 			DEBUG(DEBUG_ERR,(__location__ " Failed to call async control CTDB_CONTROL_TAKEOVER_IP to node %u\n", tmp_ip->pnn));


-- 
CTDB repository


More information about the samba-cvs mailing list