[SCM] CTDB repository - branch libctdb updated - ctdb-1.0.114-107-g3e9720d

Ronnie Sahlberg sahlberg at samba.org
Sun May 16 22:27:46 MDT 2010


The branch, libctdb has been updated
       via  3e9720d1dea95daf0c442eb2fbcbc1c90a0ccc47 (commit)
       via  b70bae2884a1594aea10001975f286e598f34746 (commit)
      from  3bda422d53c481c4df638f95425e956651368819 (commit)

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


- Log -----------------------------------------------------------------
commit 3e9720d1dea95daf0c442eb2fbcbc1c90a0ccc47
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Mon May 17 14:26:19 2010 +1000

    remove the old ctdb_attach() function and move all callers over to the new ctdb_attachdb() in libctdb

commit b70bae2884a1594aea10001975f286e598f34746
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Mon May 17 14:01:49 2010 +1000

    create a ctdb_attachdb_recv() function for libctdb.

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

Summary of changes:
 client/ctdb_client.c         |   94 -------------------------------------
 include/ctdb.h               |    4 +-
 include/ctdb_protocol.h      |    5 --
 libctdb/libctdb.c            |  106 ++++++++++++++++++++++++++++++++----------
 libctdb/tst.c                |   13 +++--
 server/ctdb_recoverd.c       |    4 +-
 tests/src/ctdb_bench.c       |    4 +-
 tests/src/ctdb_fetch.c       |    6 +-
 tests/src/ctdb_fetch_one.c   |    6 +-
 tests/src/ctdb_persistent.c  |    8 ++--
 tests/src/ctdb_randrec.c     |    6 +-
 tests/src/ctdb_store.c       |    6 +-
 tests/src/ctdb_transaction.c |    8 ++--
 tests/src/ctdb_traverse.c    |    6 +-
 tools/ctdb.c                 |   21 ++++----
 tools/ctdb_vacuum.c          |   13 ++---
 16 files changed, 134 insertions(+), 176 deletions(-)


Changeset truncated at 500 lines:

diff --git a/client/ctdb_client.c b/client/ctdb_client.c
index 1552c41..56d8b5a 100644
--- a/client/ctdb_client.c
+++ b/client/ctdb_client.c
@@ -1022,100 +1022,6 @@ int ctdb_statistics_reset(struct ctdb_context *ctdb, uint32_t destnode)
 	return 0;
 }
 
-/*
-  this is the dummy null procedure that all databases support
-*/
-static int ctdb_null_func(struct ctdb_call_info *call)
-{
-	return 0;
-}
-
-/*
-  this is a plain fetch procedure that all databases support
-*/
-static int ctdb_fetch_func(struct ctdb_call_info *call)
-{
-	call->reply_data = &call->record_data;
-	return 0;
-}
-
-
-
-/*
-  attach to a specific database - client call
-*/
-struct ctdb_db_context *ctdb_attach(struct ctdb_context *ctdb, const char *name, bool persistent, uint32_t tdb_flags)
-{
-	struct ctdb_db_context *ctdb_db;
-	int ret;
-	uint32_t db_id;
-	ctdb_handle *handle;
-
-	ctdb_db = ctdb_db_handle(ctdb, name);
-	if (ctdb_db) {
-		return ctdb_db;
-	}
-
-	ctdb_db = talloc_zero(ctdb, struct ctdb_db_context);
-	CTDB_NO_MEMORY_NULL(ctdb, ctdb_db);
-
-	ctdb_db->ctdb = ctdb;
-	ctdb_db->db_name = talloc_strdup(ctdb_db, name);
-	CTDB_NO_MEMORY_NULL(ctdb, ctdb_db->db_name);
-
-	/* tell ctdb daemon to attach */
-	handle = ctdb_createdb_send(ctdb, CTDB_CURRENT_NODE,
-				    name, persistent, tdb_flags,
-				    NULL, NULL);
-	if (handle == NULL) {
-		DEBUG(DEBUG_ERR, (__location__ " Failed to send CREATEDB control\n"));
-		talloc_free(ctdb_db);
-		return NULL;
-	}
-
-	ret = ctdb_createdb_recv(ctdb, handle, &db_id);
-	if (ret != 0) {
-		DEBUG(DEBUG_ERR,("Failed to attach to database '%s'\n", name));
-		talloc_free(ctdb_db);
-		return NULL;
-	}
-	
-	ctdb_db->db_id = db_id;
-
-	ret = ctdb_ctrl_getdbpath(ctdb, timeval_current_ofs(2, 0), CTDB_CURRENT_NODE, ctdb_db->db_id, ctdb_db, &ctdb_db->db_path);
-	if (ret != 0) {
-		DEBUG(DEBUG_ERR,("Failed to get dbpath for database '%s'\n", name));
-		talloc_free(ctdb_db);
-		return NULL;
-	}
-
-	tdb_flags = persistent?TDB_DEFAULT:TDB_NOSYNC;
-	if (ctdb->valgrinding) {
-		tdb_flags |= TDB_NOMMAP;
-	}
-	tdb_flags |= TDB_DISALLOW_NESTING;
-
-	ctdb_db->ltdb = tdb_wrap_open(ctdb, ctdb_db->db_path, 0, tdb_flags, O_RDWR, 0);
-	if (ctdb_db->ltdb == NULL) {
-		ctdb_set_error(ctdb, "Failed to open tdb '%s'\n", ctdb_db->db_path);
-		talloc_free(ctdb_db);
-		return NULL;
-	}
-
-	ctdb_db->persistent = persistent;
-
-	DLIST_ADD(ctdb->db_list, ctdb_db);
-
-	/* add well known functions */
-	ctdb_set_call(ctdb_db, ctdb_null_func, CTDB_NULL_FUNC);
-	ctdb_set_call(ctdb_db, ctdb_fetch_func, CTDB_FETCH_FUNC);
-
-	return ctdb_db;
-}
-
-
-
-
 struct traverse_state {
 	bool done;
 	uint32_t count;
diff --git a/include/ctdb.h b/include/ctdb.h
index 7ccedaa..678189e 100644
--- a/include/ctdb.h
+++ b/include/ctdb.h
@@ -75,13 +75,13 @@ struct ctdb_db_context;
 typedef void (*ctdb_attachdb_cb)(int32_t status, struct ctdb_db_context *ctdb_db, void *private_data);
 
 ctdb_handle *
-ctdb_attachdb_send(struct ctdb_context *ctdb, uint32_t destnode,
+ctdb_attachdb_send(struct ctdb_context *ctdb,
 		   const char *name, int persistent, uint32_t tdb_flags,
 		   ctdb_attachdb_cb callback,
 		   void *private_data);
 int ctdb_attachdb_recv(struct ctdb_context *ctdb,
 		       ctdb_handle *handle, struct ctdb_db_context **);
-int ctdb_attachdb(struct ctdb_context *ctdb, uint32_t destnode,
+int ctdb_attachdb(struct ctdb_context *ctdb,
 		  const char *name, int persistent, uint32_t tdb_flags,
 		  struct ctdb_db_context **);
 
diff --git a/include/ctdb_protocol.h b/include/ctdb_protocol.h
index 16f8d1e..694fdae 100644
--- a/include/ctdb_protocol.h
+++ b/include/ctdb_protocol.h
@@ -214,11 +214,6 @@ int ctdb_start(struct ctdb_context *ctdb);
 int ctdb_start_daemon(struct ctdb_context *ctdb, bool do_fork, bool use_syslog);
 
 /*
-  attach to a ctdb database
-*/
-struct ctdb_db_context *ctdb_attach(struct ctdb_context *ctdb, const char *name, bool persistent, uint32_t tdb_flags);
-
-/*
   find an attached ctdb_db handle given a name
  */
 struct ctdb_db_context *ctdb_db_handle(struct ctdb_context *ctdb, const char *name);
diff --git a/libctdb/libctdb.c b/libctdb/libctdb.c
index 3f8ac64..7e95431 100644
--- a/libctdb/libctdb.c
+++ b/libctdb/libctdb.c
@@ -728,13 +728,14 @@ int ctdb_getdbpath(struct ctdb_context *ctdb, uint32_t destnode,
  */
 
 struct ctdb_attachdb_state {
-	uint32_t destnode;
+	enum control_state state;
 	struct ctdb_context *ctdb;
 	struct ctdb_db_context *ctdb_db;
 	struct ctdb_client_control_state *cdb_state;
 	struct ctdb_client_control_state *gdp_state;
 	bool persistent;
 	uint32_t tdb_flags;
+
 	ctdb_attachdb_cb callback;
 	void *private_data;
 };	
@@ -760,8 +761,11 @@ ctdb_attachdb_recv2_cb(struct ctdb_client_control_state *state)
 
 	if (state->state != CTDB_CONTROL_DONE || state->status != 0) {
 		DEBUG(DEBUG_ERR,(__location__ " getdbpath control failed with state:%d and status:%d\n", state->state, state->status));
-		callback(-1, NULL, adb_state->private_data);
-		talloc_free(adb_state);
+		adb_state->state = CTDB_CONTROL_ERROR;
+		if (callback != NULL) {
+			callback(-1, NULL, adb_state->private_data);
+			talloc_free(adb_state);
+		}
 		return;
 	}
 	ctdb_db->db_path = talloc_strdup(ctdb_db, (char *)state->outdata.dptr);
@@ -775,8 +779,11 @@ ctdb_attachdb_recv2_cb(struct ctdb_client_control_state *state)
 	ctdb_db->ltdb = tdb_wrap_open(ctdb, ctdb_db->db_path, 0, tdb_flags, O_RDWR, 0);
 	if (ctdb_db->ltdb == NULL) {
 		DEBUG(DEBUG_ERR, (__location__ " Failed to open tdb '%s'\n", ctdb_db->db_path));
-		callback(-1, NULL, adb_state->private_data);
-		talloc_free(adb_state);
+		adb_state->state = CTDB_CONTROL_ERROR;
+		if (callback != NULL) {
+			callback(-1, NULL, adb_state->private_data);
+			talloc_free(adb_state);
+		}
 		return;
 	}
 
@@ -790,9 +797,12 @@ ctdb_attachdb_recv2_cb(struct ctdb_client_control_state *state)
 
 
 	talloc_steal(ctdb, ctdb_db);
-	callback(0, ctdb_db, adb_state->private_data);
 
-	talloc_free(adb_state);
+	adb_state->state = CTDB_CONTROL_DONE;
+	if (callback != NULL) {
+		callback(0, ctdb_db, adb_state->private_data);
+		talloc_free(adb_state);
+	}
 }
 
 static void
@@ -805,25 +815,34 @@ ctdb_attachdb_recv1_cb(struct ctdb_client_control_state *state)
 
 	if (state->state != CTDB_CONTROL_DONE) {
 		DEBUG(DEBUG_ERR,(__location__ " createdb control failed with state:%d and status:%d\n", state->state, state->status));
-		callback(-1, NULL, adb_state->private_data);
-		talloc_free(adb_state);
+		adb_state->state = CTDB_CONTROL_ERROR;
+		if (callback != NULL) {
+			callback(-1, NULL, adb_state->private_data);
+			talloc_free(adb_state);
+		}
 		return;
 	}
 
 	if (state->outdata.dsize != sizeof(uint32_t)) {
 		DEBUG(DEBUG_ERR, (__location__ " Wrong size of data returned for CREATEDB control. Got %zd bytes but expected %zd\n", state->outdata.dsize, sizeof(uint32_t)));
-		callback(-1, NULL, adb_state->private_data);
-		talloc_free(adb_state);
+		adb_state->state = CTDB_CONTROL_ERROR;
+		if (callback != NULL) {
+			callback(-1, NULL, adb_state->private_data);
+			talloc_free(adb_state);
+		}
 		return;
 	}
 
 	adb_state->ctdb_db->db_id = *(uint32_t *)state->outdata.dptr;
 
-	adb_state->gdp_state = ctdb_getdbpath_send(adb_state->ctdb, adb_state->destnode, adb_state->ctdb_db->db_id, NULL, NULL);
+	adb_state->gdp_state = ctdb_getdbpath_send(adb_state->ctdb, CTDB_CURRENT_NODE, adb_state->ctdb_db->db_id, NULL, NULL);
 	if (state == NULL) {
 		DEBUG(DEBUG_ERR,(__location__ " ctdb_getdbpath_send() failed.\n"));
-		callback(-1, NULL, adb_state->private_data);
-		talloc_free(adb_state);
+		adb_state->state = CTDB_CONTROL_ERROR;
+		if (callback != NULL) {
+			callback(-1, NULL, adb_state->private_data);
+			talloc_free(adb_state);
+		}
 		return;
 	}
 	talloc_steal(adb_state, adb_state->gdp_state);
@@ -833,7 +852,7 @@ ctdb_attachdb_recv1_cb(struct ctdb_client_control_state *state)
 }
 
 ctdb_handle *
-ctdb_attachdb_send(struct ctdb_context *ctdb, uint32_t destnode,
+ctdb_attachdb_send(struct ctdb_context *ctdb,
 		   const char *name, int persistent, uint32_t tdb_flags,
 		   ctdb_attachdb_cb callback,
 		   void *private_data)
@@ -841,10 +860,10 @@ ctdb_attachdb_send(struct ctdb_context *ctdb, uint32_t destnode,
 	struct ctdb_attachdb_state *state;
 	struct ctdb_db_context *ctdb_db;
 
-
 	ctdb_db = ctdb_db_handle(ctdb, name);
 	if (ctdb_db != NULL) {
-		return ctdb_db;
+		DEBUG(DEBUG_ERR, (__location__ " There is already a database with this name. Can not attach twice.\n"));
+		return NULL;
 	}
 
 	state = talloc_zero(ctdb, struct ctdb_attachdb_state);
@@ -860,9 +879,9 @@ ctdb_attachdb_send(struct ctdb_context *ctdb, uint32_t destnode,
 		return NULL;
 	}
 
+	state->state      = CTDB_CONTROL_WAIT;
 	state->ctdb       = ctdb;	
 	state->ctdb_db    = ctdb_db;
-	state->destnode   = destnode;
 	state->tdb_flags  = tdb_flags;
 	state->persistent = persistent?True:False;
 
@@ -884,23 +903,60 @@ ctdb_attachdb_send(struct ctdb_context *ctdb, uint32_t destnode,
 	}
 	talloc_steal(state, state->cdb_state);
 
+	state->cdb_state->async.fn           = ctdb_attachdb_recv1_cb;
+	state->cdb_state->async.private_data = state;
+
 	if (callback != NULL) {
 		state->callback     = callback;
 		state->private_data = private_data;
-
-		state->cdb_state->async.fn           = ctdb_attachdb_recv1_cb;
-		state->cdb_state->async.private_data = state;
 	}
 
 	return (ctdb_handle *)state;
 }
 
+int ctdb_attachdb_recv(struct ctdb_context *ctdb,
+		       ctdb_handle *handle, struct ctdb_db_context **ctdb_db)
+{
+	struct ctdb_attachdb_state *state = talloc_get_type(handle, struct ctdb_attachdb_state);
+
+	while (state->state == CTDB_CONTROL_WAIT) {
+		event_loop_once(ctdb->ev);
+	}
+
+	if (state->state != CTDB_CONTROL_DONE) {
+		if (ctdb_db != NULL) {
+			*ctdb_db = NULL;
+		}
+		return -1;
+	}
 
+	if (ctdb_db != NULL) {
+		*ctdb_db = state->ctdb_db;
+	}
 
+	talloc_free(state);
+	return 0;
+}
 
-int ctdb_attachdb_recv(struct ctdb_context *ctdb,
-		       ctdb_handle *handle, struct ctdb_db_context **);
-int ctdb_attachdb(struct ctdb_context *ctdb, uint32_t destnode,
+int ctdb_attachdb(struct ctdb_context *ctdb,
 		  const char *name, int persistent, uint32_t tdb_flags,
-		  struct ctdb_db_context **);
+		  struct ctdb_db_context **ctdb_db)
+{
+	ctdb_handle *handle;
+	int ret;
+
+	handle = ctdb_attachdb_send(ctdb, name, persistent, tdb_flags, NULL, NULL);
+	if (handle == NULL) {
+		DEBUG(DEBUG_ERR, (__location__ " Failed to send attachdb control\n"));
+		return -1;
+	}
+
+	ret = ctdb_attachdb_recv(ctdb, handle, ctdb_db);
+	if (ret != 0) {
+		DEBUG(DEBUG_ERR, (__location__ " receive of attachdb reply failed\n"));
+		return -1;
+	}
+
+	return 0;
+}
 
diff --git a/libctdb/tst.c b/libctdb/tst.c
index 08d515e..dc030fe 100644
--- a/libctdb/tst.c
+++ b/libctdb/tst.c
@@ -32,6 +32,7 @@ void adb_cb(int32_t status, struct ctdb_db_context *ctdb_db, void *private_data)
 int main(int argc, char *argv[])
 {
 	struct ctdb_context *ctdb_context;
+	struct ctdb_db_context *ctdb_db_context;
 	ctdb_handle *handle;
 	struct pollfd pfd;
 	int ret;
@@ -59,21 +60,21 @@ int main(int argc, char *argv[])
 		exit(10);
 	}
 
-	handle = ctdb_getpnn_send(ctdb_context, CTDB_CURRENT_NODE, pnn_cb, NULL);
+	handle = ctdb_attachdb_send(ctdb_context, CTDB_CURRENT_NODE, "test_test.tdb", 0, 0, adb_cb, NULL);
 	if (handle == NULL) {
-		printf("Failed to send get_pnn control\n");
+		printf("Failed to send attachdb control\n");
 		exit(10);
 	}
 
-	handle = ctdb_getrecmaster_send(ctdb_context, CTDB_CURRENT_NODE, rm_cb, NULL);
+	handle = ctdb_getpnn_send(ctdb_context, CTDB_CURRENT_NODE, pnn_cb, NULL);
 	if (handle == NULL) {
-		printf("Failed to send get_recmaster control\n");
+		printf("Failed to send get_pnn control\n");
 		exit(10);
 	}
 
-	handle = ctdb_attachdb_send(ctdb_context, CTDB_CURRENT_NODE, "test_test.tdb", 0,0, adb_cb, NULL);
+	handle = ctdb_getrecmaster_send(ctdb_context, CTDB_CURRENT_NODE, rm_cb, NULL);
 	if (handle == NULL) {
-		printf("Failed to send attachdb control\n");
+		printf("Failed to send get_recmaster control\n");
 		exit(10);
 	}
 
diff --git a/server/ctdb_recoverd.c b/server/ctdb_recoverd.c
index 0174509..db0372c 100644
--- a/server/ctdb_recoverd.c
+++ b/server/ctdb_recoverd.c
@@ -839,8 +839,8 @@ static void vacuum_fetch_handler(struct ctdb_context *ctdb, uint64_t srvid,
 	}
 
 	/* attach to it */
-	ctdb_db = ctdb_attach(ctdb, name, persistent, 0);
-	if (ctdb_db == NULL) {
+	ret = ctdb_attachdb(ctdb, name, persistent, 0, &ctdb_db);
+	if (ret != 0) {
 		DEBUG(DEBUG_ERR,(__location__ " Failed to attach to database '%s'\n", name));
 		talloc_free(tmp_ctx);
 		return;
diff --git a/tests/src/ctdb_bench.c b/tests/src/ctdb_bench.c
index b03868a..d94a292 100644
--- a/tests/src/ctdb_bench.c
+++ b/tests/src/ctdb_bench.c
@@ -220,8 +220,8 @@ int main(int argc, const char *argv[])
 	ctdb = ctdb_cmdline_client(ev);
 
 	/* attach to a specific database */
-	ctdb_db = ctdb_attach(ctdb, "test.tdb", false, 0);
-	if (!ctdb_db) {
+	ret = ctdb_attachdb(ctdb, "test.tdb", false, 0, &ctdb_db);
+	if (ret) {
 		printf("ctdb_attach failed - %s\n", ctdb_errstr(ctdb));
 		exit(1);
 	}
diff --git a/tests/src/ctdb_fetch.c b/tests/src/ctdb_fetch.c
index d53bfb9..2cb6ff0 100644
--- a/tests/src/ctdb_fetch.c
+++ b/tests/src/ctdb_fetch.c
@@ -172,7 +172,7 @@ int main(int argc, const char *argv[])
 		{ NULL, 'n', POPT_ARG_INT, &num_nodes, 0, "num_nodes", "integer" },
 		POPT_TABLEEND
 	};
-	int opt;
+	int ret, opt;
 	const char **extra_argv;
 	int extra_argc = 0;
 	poptContext pc;
@@ -214,8 +214,8 @@ int main(int argc, const char *argv[])
 				 &cluster_ready);
 
 	/* attach to a specific database */
-	ctdb_db = ctdb_attach(ctdb, "test.tdb", false, 0);
-	if (!ctdb_db) {
+	ret = ctdb_attachdb(ctdb, "test.tdb", false, 0, &ctdb_db);
+	if (ret) {
 		printf("ctdb_attach failed - %s\n", ctdb_errstr(ctdb));
 		exit(1);
 	}
diff --git a/tests/src/ctdb_fetch_one.c b/tests/src/ctdb_fetch_one.c
index 70b617d..b6b5a82 100644
--- a/tests/src/ctdb_fetch_one.c
+++ b/tests/src/ctdb_fetch_one.c
@@ -89,7 +89,7 @@ int main(int argc, const char *argv[])
 		{ "timelimit", 't', POPT_ARG_INT, &timelimit, 0, "timelimit", "integer" },
 		POPT_TABLEEND
 	};
-	int opt;
+	int ret, opt;
 	const char **extra_argv;
 	int extra_argc = 0;
 	poptContext pc;
@@ -118,8 +118,8 @@ int main(int argc, const char *argv[])
 	ctdb = ctdb_cmdline_client(ev);
 
 	/* attach to a specific database */
-	ctdb_db = ctdb_attach(ctdb, "test.tdb", false, 0);
-	if (!ctdb_db) {
+	ret = ctdb_attachdb(ctdb, "test.tdb", false, 0, &ctdb_db);
+	if (ret) {
 		printf("ctdb_attach failed - %s\n", ctdb_errstr(ctdb));
 		exit(1);
 	}
diff --git a/tests/src/ctdb_persistent.c b/tests/src/ctdb_persistent.c
index 4ae782b..87a629e 100644
--- a/tests/src/ctdb_persistent.c
+++ b/tests/src/ctdb_persistent.c
@@ -193,7 +193,7 @@ int main(int argc, const char *argv[])
 		{ "unsafe-writes", 'u', POPT_ARG_NONE, &unsafe_writes, 0, "do not use tdb transactions when writing", NULL },
 		POPT_TABLEEND
 	};
-	int opt;
+	int ret, opt;
 	const char **extra_argv;
 	int extra_argc = 0;
 	poptContext pc;
@@ -229,12 +229,12 @@ int main(int argc, const char *argv[])
 
 	/* attach to a specific database */
 	if (unsafe_writes == 1) {
-		ctdb_db = ctdb_attach(ctdb, "persistent.tdb", true, TDB_NOSYNC);
+	  ret = ctdb_attachdb(ctdb, "persistent.tdb", true, TDB_NOSYNC, &ctdb_db);
 	} else {
-		ctdb_db = ctdb_attach(ctdb, "persistent.tdb", true, 0);
+	  ret = ctdb_attachdb(ctdb, "persistent.tdb", true, 0, &ctdb_db);
 	}
 
-	if (!ctdb_db) {
+	if (ret) {
 		printf("ctdb_attach failed - %s\n", ctdb_errstr(ctdb));
 		exit(1);
 	}
diff --git a/tests/src/ctdb_randrec.c b/tests/src/ctdb_randrec.c
index a11cfba..6fb02f9 100644
--- a/tests/src/ctdb_randrec.c
+++ b/tests/src/ctdb_randrec.c
@@ -115,7 +115,7 @@ int main(int argc, const char *argv[])
 		{ "delete-pct", 'p', POPT_ARG_INT, &delete_pct, 0, "delete_pct", "integer" },


-- 
CTDB repository


More information about the samba-cvs mailing list