[SCM] Samba Shared Repository - branch master updated

Amitay Isaacs amitay at samba.org
Sun Mar 4 18:48:03 MST 2012


The branch, master has been updated
       via  5c5111c s3-ctdb: Enable CTDB readonly support only if CTDB supports it
       via  5bda068 dbwrap_ctdb: only fetch a read-only copy if we had a record already.
       via  67bb5ab ctdbd_conn: fetch read-only copies of records.
       via  a3e6f55 dbwrap_ctdb: handle read-only records.
      from  c23b2bd selftest: remove unused config.h check

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


- Log -----------------------------------------------------------------
commit 5c5111ca0319ad3fdd2c27a0bd3c06b576921d08
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 21 17:30:53 2012 +1100

    s3-ctdb: Enable CTDB readonly support only if CTDB supports it
    
    Autobuild-User: Amitay Isaacs <amitay at samba.org>
    Autobuild-Date: Mon Mar  5 02:47:36 CET 2012 on sn-devel-104

commit 5bda06877303b4ac01081b12f889db1409c0a6f6
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Fri Feb 3 11:00:54 2012 +1100

    dbwrap_ctdb: only fetch a read-only copy if we had a record already.
    
    Because revoking read-only copies of records is expensive, we only
    want ctdbd to do it for high-turnover records.  A basic heuristic is
    that if we don't find a local copy of the record, don't ask for a
    read-only copy.
    
    The fetch itself will cause ctdbd to migrate the record, so eventually
    we will have a local copy.  Next time it gets migrated away, we'll
    call ctdbd_fetch() with local_copy = true.
    
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>

commit 67bb5abe81dc64758a792060673b923cd77a018a
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Fri Feb 3 10:54:53 2012 +1100

    ctdbd_conn: fetch read-only copies of records.
    
    This means we try to get a read-only copy of a record, which we can
    then place in the local tdb.
    
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>

commit a3e6f550657f2b71634ae87f0d8c7bd9e6eef921
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Fri Feb 3 10:53:27 2012 +1100

    dbwrap_ctdb: handle read-only records.
    
    The new read-only record flags make determining if we can use a record
    a bit more complex, so extract it into its own function.
    
    The OLD logic was:
    1) If the record doesn't exist, we can't use it.
    2) If we are the dmaster for the record, we can use it.
    
    The new logic is:
    1) If the record doesn't exist, we can't use it.
    2) If we are the dmaster for the record, we can use it IF we only
       want read-only access, OR there are no read-only delegations.
    3) If we are not dmaster, we can only use it if we want read-only
       access and it is marked as a read-only copy.
    
    This logic is unused until the next patches which begin to ask
    for read-only copies of records.
    
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>

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

Summary of changes:
 source3/configure.in             |   28 ++++++++++++++++++++++
 source3/include/ctdbd_conn.h     |    3 +-
 source3/lib/ctdbd_conn.c         |   14 ++++++++--
 source3/lib/dbwrap/dbwrap_ctdb.c |   48 +++++++++++++++++++++++++++++--------
 4 files changed, 78 insertions(+), 15 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/configure.in b/source3/configure.in
index 937867d..8c069a0 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -5612,6 +5612,34 @@ if test "x$have_cluster_support" = "xyes" ; then
 	fi
 fi
 
+AC_ARG_ENABLE([ctdb-readonly-records],
+	AS_HELP_STRING([--enable-ctdb-readonly-records],
+		[Turn on CTDB readonly records support (default=yes)]),
+	[want_ctdb_readonly=$enableval],
+	[want_ctdb_readonly=yes])
+
+if test "x$have_cluster_support" = "xyes" -a "x$want_ctdb_readonly" = "xyes" ; then
+	AC_HAVE_DECL(CTDB_WANT_READONLY,[
+	#include "confdefs.h"
+	#define NO_CONFIG_H
+	#include "replace.h"
+	#include "system/wait.h"
+	#include "system/network.h"
+	#include <talloc.h>
+	#include <tdb.h>
+	#include <ctdb.h>
+	])
+
+	if test "x$ac_cv_have_CTDB_WANT_READONLY_decl" != "xyes" ; then
+		if test "x$enable_old_ctdb" = "xyes" ; then
+			AC_MSG_WARN([ignoring missing READONLY support (--enable-old-ctdb)])
+		else
+			ctdb_broken="support for CTDB readonly records missing"
+			have_cluster_support=no
+		fi
+	fi
+fi
+
 if test "x$have_cluster_support" = "xyes" ; then
 	# In ctdb 1.0.57, ctdb_control_tcp was temporarily renamed
 	# to ctdb_tcp_client.
diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h
index 9a3c27c..2035e8d 100644
--- a/source3/include/ctdbd_conn.h
+++ b/source3/include/ctdbd_conn.h
@@ -60,7 +60,8 @@ NTSTATUS ctdbd_migrate(struct ctdbd_connection *conn, uint32 db_id,
 		       TDB_DATA key);
 
 NTSTATUS ctdbd_fetch(struct ctdbd_connection *conn, uint32 db_id,
-		     TDB_DATA key, TALLOC_CTX *mem_ctx, TDB_DATA *data);
+		     TDB_DATA key, TALLOC_CTX *mem_ctx, TDB_DATA *data,
+		     bool local_copy);
 
 NTSTATUS ctdbd_traverse(uint32 db_id,
 			void (*fn)(TDB_DATA key, TDB_DATA data,
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index 9c73002..b5c8280 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -1391,14 +1391,22 @@ NTSTATUS ctdbd_migrate(struct ctdbd_connection *conn, uint32 db_id,
 }
 
 /*
- * remotely fetch a record without locking it or forcing a migration
+ * remotely fetch a record (read-only)
  */
 NTSTATUS ctdbd_fetch(struct ctdbd_connection *conn, uint32 db_id,
-		     TDB_DATA key, TALLOC_CTX *mem_ctx, TDB_DATA *data)
+		     TDB_DATA key, TALLOC_CTX *mem_ctx, TDB_DATA *data,
+		     bool local_copy)
 {
 	struct ctdb_req_call req;
 	struct ctdb_reply_call *reply;
 	NTSTATUS status;
+	uint32_t flags;
+
+#ifdef HAVE_CTDB_WANT_READONLY_DECL
+	flags = local_copy ? CTDB_WANT_READONLY : 0;
+#else
+	flags = 0;
+#endif
 
 	ZERO_STRUCT(req);
 
@@ -1407,7 +1415,7 @@ NTSTATUS ctdbd_fetch(struct ctdbd_connection *conn, uint32 db_id,
 	req.hdr.ctdb_version = CTDB_VERSION;
 	req.hdr.operation    = CTDB_REQ_CALL;
 	req.hdr.reqid        = ctdbd_next_reqid(conn);
-	req.flags            = 0;
+	req.flags            = flags;
 	req.callid           = CTDB_FETCH_FUNC;
 	req.db_id            = db_id;
 	req.keylen           = key.dsize;
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index 3c1ab44..2e0146f 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.c
+++ b/source3/lib/dbwrap/dbwrap_ctdb.c
@@ -1001,6 +1001,31 @@ static int db_ctdb_record_destr(struct db_record* data)
 	return 0;
 }
 
+/* Do I own this record? */
+static bool db_ctdb_own_record(TDB_DATA ctdb_data, bool read_only)
+{
+	struct ctdb_ltdb_header *hdr;
+
+	if (ctdb_data.dptr == NULL)
+		return false;
+
+	if (ctdb_data.dsize < sizeof(struct ctdb_ltdb_header))
+		return false;
+
+#ifdef HAVE_CTDB_WANT_READONLY_DECL
+	hdr = (struct ctdb_ltdb_header *)ctdb_data.dptr;
+	if (hdr->dmaster != get_my_vnn()) {
+		/* If we're not dmaster, it must be r/o copy. */
+		return read_only && (hdr->flags & CTDB_REC_RO_HAVE_READONLY);
+	}
+
+	/* If we want write access, noone can have r/o copies. */
+	return read_only || !(hdr->flags & CTDB_REC_RO_HAVE_DELEGATIONS);
+#else
+	return !read_only;
+#endif
+}
+
 static struct db_record *fetch_locked_internal(struct db_ctdb_ctx *ctx,
 					       TALLOC_CTX *mem_ctx,
 					       TDB_DATA key)
@@ -1064,9 +1089,7 @@ again:
 	 * take the shortcut and just return it.
 	 */
 
-	if ((ctdb_data.dptr == NULL) ||
-	    (ctdb_data.dsize < sizeof(struct ctdb_ltdb_header)) ||
-	    ((struct ctdb_ltdb_header *)ctdb_data.dptr)->dmaster != get_my_vnn()
+	if (!db_ctdb_own_record(ctdb_data, false)
 #if 0
 	    || (random() % 2 != 0)
 #endif
@@ -1077,10 +1100,11 @@ again:
 
 		migrate_attempts += 1;
 
-		DEBUG(10, ("ctdb_data.dptr = %p, dmaster = %u (%u)\n",
+		DEBUG(10, ("ctdb_data.dptr = %p, dmaster = %u (%u) %u\n",
 			   ctdb_data.dptr, ctdb_data.dptr ?
 			   ((struct ctdb_ltdb_header *)ctdb_data.dptr)->dmaster : -1,
-			   get_my_vnn()));
+			   get_my_vnn(),
+			   ((struct ctdb_ltdb_header *)ctdb_data.dptr)->flags));
 
 		status = ctdbd_migrate(messaging_ctdbd_connection(), ctx->db_id,
 				       key);
@@ -1164,10 +1188,7 @@ static NTSTATUS db_ctdb_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
 	 * take the shortcut and just return it.
 	 * we bypass the dmaster check for persistent databases
 	 */
-	if ((ctdb_data.dptr != NULL) &&
-	    (ctdb_data.dsize >= sizeof(struct ctdb_ltdb_header)) &&
-	    ((struct ctdb_ltdb_header *)ctdb_data.dptr)->dmaster == get_my_vnn())
-	{
+	if (db_ctdb_own_record(ctdb_data, true)) {
 		/* we are the dmaster - avoid the ctdb protocol op */
 
 		data->dsize = ctdb_data.dsize - sizeof(struct ctdb_ltdb_header);
@@ -1186,9 +1207,14 @@ static NTSTATUS db_ctdb_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
 
 	SAFE_FREE(ctdb_data.dptr);
 
-	/* we weren't able to get it locally - ask ctdb to fetch it for us */
+	/*
+	 * We weren't able to get it locally - ask ctdb to fetch it for us.
+	 * If we already had *something*, it's probably worth making a local
+	 * read-only copy.
+	 */
 	status = ctdbd_fetch(messaging_ctdbd_connection(), ctx->db_id, key,
-			     mem_ctx, data);
+			     mem_ctx, data,
+			     ctdb_data.dsize >= sizeof(struct ctdb_ltdb_header));
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(5, ("ctdbd_fetch failed: %s\n", nt_errstr(status)));
 	}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list