s3-ctdb: Enable CTDB readonly support only if CTDB supports it
authorAmitay Isaacs <amitay@gmail.com>
Tue, 21 Feb 2012 06:30:53 +0000 (17:30 +1100)
committerAmitay Isaacs <amitay@samba.org>
Mon, 5 Mar 2012 01:47:36 +0000 (02:47 +0100)
Autobuild-User: Amitay Isaacs <amitay@samba.org>
Autobuild-Date: Mon Mar  5 02:47:36 CET 2012 on sn-devel-104

source3/configure.in
source3/lib/ctdbd_conn.c
source3/lib/dbwrap/dbwrap_ctdb.c

index 937867dc9a4fa31ed532b8b72d94725d5bafa3f5..8c069a09cfe0f060e5516d0b75e6ffdd77edf599 100644 (file)
@@ -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.
index 47090a5412c8c77bdcfd8abdca55e0e1908b6f3d..b5c8280c4d0d68e36638e51e6b17645c9f3fe6a6 100644 (file)
@@ -1400,6 +1400,13 @@ NTSTATUS ctdbd_fetch(struct ctdbd_connection *conn, uint32 db_id,
        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);
 
@@ -1408,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            = local_copy ? CTDB_WANT_READONLY : 0;
+       req.flags            = flags;
        req.callid           = CTDB_FETCH_FUNC;
        req.db_id            = db_id;
        req.keylen           = key.dsize;
index a05f9554b7639432c883d9406069eca24e2cd928..2e0146fdb0153fbe17d633e75603ab33d5af97ec 100644 (file)
@@ -1012,6 +1012,7 @@ static bool db_ctdb_own_record(TDB_DATA ctdb_data, bool read_only)
        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. */
@@ -1020,6 +1021,9 @@ static bool db_ctdb_own_record(TDB_DATA ctdb_data, bool read_only)
 
        /* 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,