[SCM] CTDB repository - branch libctdb updated - ctdb-1.0.114-119-g6cb61b1

Ronnie Sahlberg sahlberg at samba.org
Wed May 19 00:15:00 MDT 2010


The branch, libctdb has been updated
       via  6cb61b1629e95aaa49d96857d97ec603e891370b (commit)
       via  758eae0ee95ec045f56633ea588acd5b098cd781 (commit)
      from  8143148ebb2337ad8125aa97474b3ad1ce8bdeca (commit)

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


- Log -----------------------------------------------------------------
commit 6cb61b1629e95aaa49d96857d97ec603e891370b
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Wed May 19 10:56:57 2010 +1000

    change the controls to return a struct ctdb_client_control_state* instead of a handle
    and use a dedicated cancel fucntion for these   ctdb_cancel_control()

commit 758eae0ee95ec045f56633ea588acd5b098cd781
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Wed May 19 10:43:40 2010 +1000

    change ...generic_callback to ...control_callback

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

Summary of changes:
 include/ctdb.h    |   31 +++++++++++++++-------
 libctdb/libctdb.c |   75 ++++++++++++++++++++++++----------------------------
 libctdb/tst.c     |   20 +++++++-------
 3 files changed, 66 insertions(+), 60 deletions(-)


Changeset truncated at 500 lines:

diff --git a/include/ctdb.h b/include/ctdb.h
index dc24499..716e2a1 100644
--- a/include/ctdb.h
+++ b/include/ctdb.h
@@ -75,9 +75,9 @@ int ctdb_service(struct ctdb_context *ctdb);
 
 
 typedef void ctdb_handle;
+struct ctdb_client_control_state;
 
-
-typedef void (*ctdb_generic_callback)(int32_t status, struct ctdb_context *ctdb, ctdb_handle *, void *private_data);
+typedef void (*ctdb_control_callback)(int32_t status, struct ctdb_context *ctdb, struct ctdb_client_control_state *state, void *private_data);
 
 
 /*
@@ -290,14 +290,17 @@ int ctdb_send_message(struct ctdb_context *ctdb, uint32_t pnn, uint64_t srvid, T
 
 /*
  * functions to read the pnn number of the local node
+ *
+ * ctdb_cancel_control(state) is used
+ * to abort this command before it completes.
  */
-ctdb_handle *
+struct ctdb_client_control_state *
 ctdb_getpnn_send(struct ctdb_context *ctdb,
 		 uint32_t destnode,
-		 ctdb_generic_callback callback,
+		 ctdb_control_callback callback,
 		 void *private_data);
 int ctdb_getpnn_recv(struct ctdb_context *ctdb,
-		     ctdb_handle *handle,
+		     struct ctdb_client_control_state *state,
 		     uint32_t *pnn);
 int ctdb_getpnn(struct ctdb_context *ctdb,
 		uint32_t destnode,
@@ -308,24 +311,32 @@ int ctdb_getpnn(struct ctdb_context *ctdb,
 
 /*
  * functions to read the recovery master of a node
+ *
+ * ctdb_cancel_control(state) is used
+ * to abort this command before it completes.
  */
-ctdb_handle *
+struct ctdb_client_control_state *
 ctdb_getrecmaster_send(struct ctdb_context *ctdb,
 			uint32_t destnode,
-			ctdb_generic_callback callback,
+			ctdb_control_callback callback,
 			void *private_data);
 int ctdb_getrecmaster_recv(struct ctdb_context *ctdb,
-			ctdb_handle *handle,
-			uint32_t *recmaster);
+			   struct ctdb_client_control_state *state,
+			   uint32_t *recmaster);
 int ctdb_getrecmaster(struct ctdb_context *ctdb,
 			uint32_t destnode,
 			uint32_t *recmaster);
 
 
 
+/*
+ * Cancel a control before it has completed
+ */
+int ctdb_cancel_control(struct ctdb_client_control_state *state);
+
 
 /*
- * cancel a request/call or release a resource
+ * release a handle
  */
 int ctdb_free(ctdb_handle *);
 
diff --git a/libctdb/libctdb.c b/libctdb/libctdb.c
index c9cc4d8..25d60b7 100644
--- a/libctdb/libctdb.c
+++ b/libctdb/libctdb.c
@@ -45,7 +45,7 @@ static void
 ctdb_control_cb(struct ctdb_client_control_state *state)
 {
 	struct ctdb_control_cb_data *cb_data = state->async.private_data;
-	ctdb_generic_callback callback = (ctdb_generic_callback)cb_data->callback;
+	ctdb_control_callback callback = (ctdb_control_callback)cb_data->callback;
 
 	/* dont recurse */
 	state->async.fn = NULL;
@@ -64,40 +64,32 @@ ctdb_control_cb(struct ctdb_client_control_state *state)
  * This function is used to set the callback action for a handle
  */
 static int
-ctdb_set_generic_callback(ctdb_handle *handle, ctdb_generic_callback callback, void *private_data)
+ctdb_set_control_callback(struct ctdb_client_control_state *state, ctdb_control_callback callback, void *private_data)
 {
-	struct ctdb_client_control_state *control_state = talloc_get_type(handle, struct ctdb_client_control_state);
-
-	if (control_state != NULL) {
-		struct ctdb_control_cb_data *cb_data;
-
-		if (callback == NULL) {
-			if (control_state->async.private_data != NULL) {
-				talloc_free(control_state->async.private_data);
-				control_state->async.private_data = NULL;
-			}
-			control_state->async.fn           = NULL;
-
-			return 0;
-		}
+	struct ctdb_control_cb_data *cb_data;
 
-		cb_data = talloc(control_state, struct ctdb_control_cb_data);
-		if (cb_data == NULL) {
-			DEBUG(DEBUG_ERR, (__location__ " Failed to alloc cb_data\n"));
-			return -1;
+	if (callback == NULL) {
+		if (state->async.private_data != NULL) {
+			talloc_free(state->async.private_data);
+			state->async.private_data = NULL;
 		}
+		state->async.fn           = NULL;
+		return 0;
+	}
 
-		cb_data->callback     = callback;
-		cb_data->private_data = private_data;
+	cb_data = talloc(state, struct ctdb_control_cb_data);
+	if (cb_data == NULL) {
+		DEBUG(DEBUG_ERR, (__location__ " Failed to alloc cb_data\n"));
+		return -1;
+	}
 
-		control_state->async.fn           = ctdb_control_cb;
-		control_state->async.private_data = cb_data;
+	cb_data->callback     = callback;
+	cb_data->private_data = private_data;
 
-		return 0;
-	}
+	state->async.fn           = ctdb_control_cb;
+	state->async.private_data = cb_data;
 
-	DEBUG(DEBUG_ERR, (__location__ " Unknown type of handle passed to ctdb_set_callback.\n"));
-	return -1;
+	return 0;
 }
 
 
@@ -226,6 +218,11 @@ int ctdb_service(struct ctdb_context *ctdb)
 }
 
 
+int ctdb_cancel_control(struct ctdb_client_control_state *state)
+{
+	talloc_free(state);
+	return 0;
+}
 
 int ctdb_free(ctdb_handle *handle)
 {
@@ -239,10 +236,10 @@ int ctdb_free(ctdb_handle *handle)
 /*************************
  * GET PNN of local node *
  *************************/
-ctdb_handle *
+struct ctdb_client_control_state *
 ctdb_getpnn_send(struct ctdb_context *ctdb,
 			uint32_t destnode,
-			ctdb_generic_callback callback,
+			ctdb_control_callback callback,
 			void *private_data)
 {
 	struct ctdb_client_control_state *state;
@@ -257,15 +254,14 @@ ctdb_getpnn_send(struct ctdb_context *ctdb,
 	}
 
 	if (callback != NULL) {
-		ctdb_set_generic_callback(state, callback, private_data);
+		ctdb_set_control_callback(state, callback, private_data);
 	}
 
-	return (ctdb_handle *)state;
+	return state;
 }
 
-int ctdb_getpnn_recv(struct ctdb_context *ctdb, ctdb_handle *handle, uint32_t *pnn)
+int ctdb_getpnn_recv(struct ctdb_context *ctdb, struct ctdb_client_control_state *state, uint32_t *pnn)
 {
-	struct ctdb_client_control_state *state = talloc_get_type(handle, struct ctdb_client_control_state);
 	int ret;
 
 	if (state->c->opcode != CTDB_CONTROL_GET_PNN) {
@@ -303,10 +299,10 @@ int ctdb_getpnn(struct ctdb_context *ctdb, uint32_t destnode, uint32_t *pnn)
 /***********************
  * GET RECOVERY MASTER *
  ***********************/
-ctdb_handle *
+struct ctdb_client_control_state *
 ctdb_getrecmaster_send(struct ctdb_context *ctdb,
 			uint32_t destnode,
-			ctdb_generic_callback callback,
+			ctdb_control_callback callback,
 			void *private_data)
 {
 	struct ctdb_client_control_state *state;
@@ -321,15 +317,14 @@ ctdb_getrecmaster_send(struct ctdb_context *ctdb,
 	}
 
 	if (callback != NULL) {
-		ctdb_set_generic_callback(state, callback, private_data);
+		ctdb_set_control_callback(state, callback, private_data);
 	}
 
-	return (ctdb_handle *)state;
+	return state;
 }
 
-int ctdb_getrecmaster_recv(struct ctdb_context *ctdb, ctdb_handle *handle, uint32_t *recmaster)
+int ctdb_getrecmaster_recv(struct ctdb_context *ctdb, struct ctdb_client_control_state *state, uint32_t *recmaster)
 {
-	struct ctdb_client_control_state *state = talloc_get_type(handle, struct ctdb_client_control_state);
 	int ret;
 
 	if (state->c->opcode != CTDB_CONTROL_GET_RECMASTER) {
diff --git a/libctdb/tst.c b/libctdb/tst.c
index abedd20..c66d4d5 100644
--- a/libctdb/tst.c
+++ b/libctdb/tst.c
@@ -15,7 +15,7 @@ void msg_h(struct ctdb_context *ctdb, uint64_t srvid, TDB_DATA data, void *priva
 }
 
 
-void pnn_cb(int32_t status, struct ctdb_context *ctdb, ctdb_handle *handle, void *private_data)
+void pnn_cb(int32_t status, struct ctdb_context *ctdb, struct ctdb_client_control_state *state, void *private_data)
 {
 	uint32_t pnn;
 	int ret;
@@ -25,7 +25,7 @@ void pnn_cb(int32_t status, struct ctdb_context *ctdb, ctdb_handle *handle, void
 		return;
 	}
 
-	ret = ctdb_getpnn_recv(ctdb, handle, &pnn);
+	ret = ctdb_getpnn_recv(ctdb, state, &pnn);
 	if (ret != 0) {
 		printf("Failed to read getpnn reply\n");
 		return;
@@ -34,7 +34,7 @@ void pnn_cb(int32_t status, struct ctdb_context *ctdb, ctdb_handle *handle, void
 	printf("status:%d pnn:%d\n", status, pnn);
 }
 
-void rm_cb(int32_t status, struct ctdb_context *ctdb, ctdb_handle *handle, void *private_data)
+void rm_cb(int32_t status, struct ctdb_context *ctdb, struct ctdb_client_control_state *state, void *private_data)
 {
 	uint32_t rm;
 	int ret;
@@ -44,7 +44,7 @@ void rm_cb(int32_t status, struct ctdb_context *ctdb, ctdb_handle *handle, void
 		return;
 	}
 
-	ret = ctdb_getrecmaster_recv(ctdb, handle, &rm);
+	ret = ctdb_getrecmaster_recv(ctdb, state, &rm);
 	if (ret != 0) {
 		printf("Failed to read getpnn reply\n");
 		return;
@@ -98,6 +98,7 @@ int main(int argc, char *argv[])
 {
 	struct ctdb_context *ctdb;
 	struct ctdb_db_context *ctdb_db_context;
+	struct ctdb_client_control_state *control_state;
 	ctdb_handle *handle;
 	struct pollfd pfd;
 	int ret;
@@ -146,8 +147,8 @@ int main(int argc, char *argv[])
 	 * ASYNC call with callback to read the recmaster
 	 * this is the preferred way to use libctdb
 	 */
-	handle = ctdb_getrecmaster_send(ctdb, CTDB_CURRENT_NODE, rm_cb, NULL);
-	if (handle == NULL) {
+	control_state = ctdb_getrecmaster_send(ctdb, CTDB_CURRENT_NODE, rm_cb, NULL);
+	if (control_state == NULL) {
 		printf("Failed to send get_recmaster control\n");
 		exit(10);
 	}
@@ -157,15 +158,14 @@ int main(int argc, char *argv[])
 	 * calls the blocking *_recv() function.
 	 * Avoid this mode for performance critical tasks
 	 */
-	handle = ctdb_getrecmaster_send(ctdb, CTDB_CURRENT_NODE, NULL, NULL);
-	if (handle == NULL) {
+	control_state = ctdb_getrecmaster_send(ctdb, CTDB_CURRENT_NODE, NULL, NULL);
+	if (control_state == NULL) {
 		printf("Failed to send get_recmaster control\n");
 		exit(10);
 	}
-	ret = ctdb_getrecmaster_recv(ctdb, handle, &recmaster);
+	ret = ctdb_getrecmaster_recv(ctdb, control_state, &recmaster);
 	if (ret != 0) {
 		printf("Failed to receive response to getrecmaster\n");
-		ctdb_free(handle);
 		exit(10);
 	}
 	printf("GETRECMASTER SEMI-SYNC: status:%d recmaster:%d\n", ret, recmaster);


-- 
CTDB repository


More information about the samba-cvs mailing list