The branch, master has been updated
       via  bcfa12c ctdb-protocol: Do not pass tdb open flags to DB attach 
controls
       via  4760fff ctdb-client: Do not pass tdb open flags to db attach api
       via  38d14fc ctdb-client: Remove calaculation of tdb flags
       via  17ca4af ctdb-client: Ask daemon for db open flags
       via  43ca0e3 ctdb-client: Ask daemon for db open flags
       via  45ac7b3 ctdb-client: Add a function to get db open flags
       via  1b0cd3c ctdb-client: Add sync api for control DB_OPEN_FLAGS
       via  339b818 ctdb-protocol: Add protocol marshalling for control 
DB_OPEN_FLAGS
       via  0b60752 ctdb-daemon: Implement DB_OPEN_FLAGS control
       via  af2b06a ctdb-protocol: Add new control to get database open flags
       via  8d3f2f6 ctdb-daemon: Drop extra boolean arguments to 
ctdb_local_attach()
       via  ea91967 ctdb-client: Drop tdb_flags argument to ctdb_attach()
       via  2100008 ctdb-client: Stop sending tdb_flags with DB_ATTACH controls
       via  2a33dfc ctdb-daemon: Ignore tdb open flags passed to DB attach 
controls
       via  1be2ff8 ctdb-daemon: Refactor calculation of tdb open flags based 
on database type
       via  45ea951 ctdb-locking: Get tdb open flags from tdb instead of 
re-calculating
       via  f5e53f6 ctdb-daemon: Store tdb flags just after tdb is opened in 
ctdb_local_attach()
       via  529142a ctdb-daemon: Once database is attached, do not modify tdb 
flags
      from  27e43e1 auth/ntlmssp: make ntlmssp_server_check_password() shorter

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


- Log -----------------------------------------------------------------
commit bcfa12c5b26502230a9c27492cf3a607fc41939d
Author: Amitay Isaacs <[email protected]>
Date:   Tue Mar 21 15:02:56 2017 +1100

    ctdb-protocol: Do not pass tdb open flags to DB attach controls
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>
    
    Autobuild-User(master): Martin Schwenke <[email protected]>
    Autobuild-Date(master): Mon Jun 26 20:10:38 CEST 2017 on sn-devel-144

commit 4760fff3ae12673fe6db98a9e1c7f883ffacb75e
Author: Amitay Isaacs <[email protected]>
Date:   Tue Mar 21 15:03:24 2017 +1100

    ctdb-client: Do not pass tdb open flags to db attach api
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 38d14fcf29d0f22ca8ea782c6515c1f358b0c3cf
Author: Amitay Isaacs <[email protected]>
Date:   Fri Jun 23 16:29:39 2017 +1000

    ctdb-client: Remove calaculation of tdb flags
    
    ... and there is no need to find out if mutexes are enabled.
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 17ca4af390837d7f2e9dcaa64069e0aa0902f674
Author: Amitay Isaacs <[email protected]>
Date:   Fri Jun 23 16:27:20 2017 +1000

    ctdb-client: Ask daemon for db open flags
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 43ca0e3d226dea933bcdb145e37e301e4711d181
Author: Amitay Isaacs <[email protected]>
Date:   Fri Jun 23 16:15:57 2017 +1000

    ctdb-client: Ask daemon for db open flags
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 45ac7b357ae69abeafdfc0f92a8fddc87f65f264
Author: Amitay Isaacs <[email protected]>
Date:   Fri Jun 23 16:11:53 2017 +1000

    ctdb-client: Add a function to get db open flags
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 1b0cd3c280fe3c4d4bd9f75e801780fb332a7afe
Author: Amitay Isaacs <[email protected]>
Date:   Wed Jun 14 16:37:34 2017 +1000

    ctdb-client: Add sync api for control DB_OPEN_FLAGS
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 339b818e56c143a7125491c6394677b0e2069d98
Author: Amitay Isaacs <[email protected]>
Date:   Wed Jun 14 16:24:02 2017 +1000

    ctdb-protocol: Add protocol marshalling for control DB_OPEN_FLAGS
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 0b607528ff87c6953c02fd057a2b26815f154d88
Author: Amitay Isaacs <[email protected]>
Date:   Wed Jun 14 16:30:39 2017 +1000

    ctdb-daemon: Implement DB_OPEN_FLAGS control
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit af2b06af75f7202423588d004771892a9ab2cd68
Author: Amitay Isaacs <[email protected]>
Date:   Wed Jun 14 16:22:52 2017 +1000

    ctdb-protocol: Add new control to get database open flags
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 8d3f2f691e1b95fea3965ab40084e327780ff0d5
Author: Amitay Isaacs <[email protected]>
Date:   Thu Mar 2 14:47:20 2017 +1100

    ctdb-daemon: Drop extra boolean arguments to ctdb_local_attach()
    
    There is no need for with_jenkinshash and with_mutexes flags, since the
    tdb_flags are now calculated based on database type.
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit ea91967b0df5f260f7da6532628f015f26f6d0e0
Author: Amitay Isaacs <[email protected]>
Date:   Fri Jun 23 15:59:16 2017 +1000

    ctdb-client: Drop tdb_flags argument to ctdb_attach()
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 2100008f81ee3cdb0024b1f2f20eae434083b846
Author: Amitay Isaacs <[email protected]>
Date:   Fri Jun 23 15:58:38 2017 +1000

    ctdb-client: Stop sending tdb_flags with DB_ATTACH controls
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 2a33dfc4fb1cac6160cd120bbc85c7c87777d253
Author: Amitay Isaacs <[email protected]>
Date:   Tue Mar 28 17:14:51 2017 +1100

    ctdb-daemon: Ignore tdb open flags passed to DB attach controls
    
    The tdb open flags should be calculated based on the database type and
    ctdb tunables.
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 1be2ff8b81871c1e2ff8721a0174862573edec38
Author: Amitay Isaacs <[email protected]>
Date:   Tue Mar 21 13:50:07 2017 +1100

    ctdb-daemon: Refactor calculation of tdb open flags based on database type
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 45ea95126e370d09f392e79dc8deeac7804636e5
Author: Amitay Isaacs <[email protected]>
Date:   Thu Mar 2 15:37:19 2017 +1100

    ctdb-locking: Get tdb open flags from tdb instead of re-calculating
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit f5e53f60b8af0239070e6e43c10d289c7a5ca174
Author: Amitay Isaacs <[email protected]>
Date:   Thu Mar 2 14:52:00 2017 +1100

    ctdb-daemon: Store tdb flags just after tdb is opened in ctdb_local_attach()
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

commit 529142a7595a885541238ecba92c776927c243ae
Author: Amitay Isaacs <[email protected]>
Date:   Thu Mar 2 11:15:26 2017 +1100

    ctdb-daemon: Once database is attached, do not modify tdb flags
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>

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

Summary of changes:
 ctdb/client/client_control_sync.c     |  39 +++++++++++--
 ctdb/client/client_db.c               | 103 +++++++++++++++-------------------
 ctdb/client/client_sync.h             |  11 ++--
 ctdb/client/ctdb_client.c             |  88 ++++++++++++++---------------
 ctdb/common/common.h                  |   2 +
 ctdb/common/ctdb_ltdb.c               |  31 ++++++++++
 ctdb/include/ctdb_client.h            |   6 +-
 ctdb/include/ctdb_private.h           |   2 +-
 ctdb/protocol/protocol.h              |   2 +
 ctdb/protocol/protocol_api.h          |  10 +++-
 ctdb/protocol/protocol_client.c       |  37 ++++++++++--
 ctdb/protocol/protocol_control.c      |  26 +++++++++
 ctdb/server/ctdb_control.c            |  28 ++++++++-
 ctdb/server/ctdb_lock.c               |  16 +-----
 ctdb/server/ctdb_ltdb_server.c        |  59 ++++++-------------
 ctdb/server/ctdb_recoverd.c           |   2 +-
 ctdb/tests/cunit/protocol_test_002.sh |   2 +-
 ctdb/tests/src/protocol_client_test.c |  18 +++++-
 18 files changed, 297 insertions(+), 185 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/client/client_control_sync.c 
b/ctdb/client/client_control_sync.c
index 3b44c2f..db2d7be 100644
--- a/ctdb/client/client_control_sync.c
+++ b/ctdb/client/client_control_sync.c
@@ -415,14 +415,13 @@ int ctdb_ctrl_statistics_reset(TALLOC_CTX *mem_ctx, 
struct tevent_context *ev,
 int ctdb_ctrl_db_attach(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
                        struct ctdb_client_context *client,
                        int destnode, struct timeval timeout,
-                       const char *db_name, uint32_t tdb_flags,
-                       uint32_t *db_id)
+                       const char *db_name, uint32_t *db_id)
 {
        struct ctdb_req_control request;
        struct ctdb_reply_control *reply;
        int ret;
 
-       ctdb_req_control_db_attach(&request, db_name, tdb_flags);
+       ctdb_req_control_db_attach(&request, db_name);
        ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout,
                                  &request, &reply);
        if (ret != 0) {
@@ -1121,14 +1120,13 @@ int ctdb_ctrl_db_attach_persistent(TALLOC_CTX *mem_ctx,
                                   struct tevent_context *ev,
                                   struct ctdb_client_context *client,
                                   int destnode, struct timeval timeout,
-                                  const char *db_name, int tdb_flags,
-                                  uint32_t *db_id)
+                                  const char *db_name, uint32_t *db_id)
 {
        struct ctdb_req_control request;
        struct ctdb_reply_control *reply;
        int ret;
 
-       ctdb_req_control_db_attach_persistent(&request, db_name, tdb_flags);
+       ctdb_req_control_db_attach_persistent(&request, db_name);
        ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout,
                                  &request, &reply);
        if (ret != 0) {
@@ -2701,3 +2699,32 @@ int ctdb_ctrl_db_push_confirm(TALLOC_CTX *mem_ctx, 
struct tevent_context *ev,
 
        return 0;
 }
+
+int ctdb_ctrl_db_open_flags(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
+                           struct ctdb_client_context *client,
+                           int destnode, struct timeval timeout,
+                           uint32_t db_id, int *tdb_flags)
+{
+       struct ctdb_req_control request;
+       struct ctdb_reply_control *reply;
+       int ret;
+
+       ctdb_req_control_db_open_flags(&request, db_id);
+       ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout,
+                                 &request, &reply);
+       if (ret != 0) {
+               DEBUG(DEBUG_ERR,
+                     ("Control DB_OPEN_FLAGS failed to node %u, ret=%d\n",
+                      destnode, ret));
+               return ret;
+       }
+
+       ret = ctdb_reply_control_db_open_flags(reply, tdb_flags);
+       if (ret != 0) {
+               DEBUG(DEBUG_ERR,
+                     ("Control DB_OPEN_FLAGS failed, ret=%d\n", ret));
+               return ret;
+       }
+
+       return 0;
+}
diff --git a/ctdb/client/client_db.c b/ctdb/client/client_db.c
index a0a884f..8cf08ae 100644
--- a/ctdb/client/client_db.c
+++ b/ctdb/client/client_db.c
@@ -253,15 +253,14 @@ struct ctdb_attach_state {
        struct timeval timeout;
        uint32_t destnode;
        uint8_t db_flags;
-       uint32_t tdb_flags;
        struct ctdb_db_context *db;
 };
 
-static void ctdb_attach_mutex_done(struct tevent_req *subreq);
 static void ctdb_attach_dbid_done(struct tevent_req *subreq);
 static void ctdb_attach_dbpath_done(struct tevent_req *subreq);
 static void ctdb_attach_health_done(struct tevent_req *subreq);
 static void ctdb_attach_flags_done(struct tevent_req *subreq);
+static void ctdb_attach_open_flags_done(struct tevent_req *subreq);
 
 struct tevent_req *ctdb_attach_send(TALLOC_CTX *mem_ctx,
                                    struct tevent_context *ev,
@@ -304,71 +303,22 @@ struct tevent_req *ctdb_attach_send(TALLOC_CTX *mem_ctx,
                state->db->persistent = true;
        }
 
-       ctdb_req_control_get_tunable(&request, "TDBMutexEnabled");
-       subreq = ctdb_client_control_send(state, ev, client,
-                                         ctdb_client_pnn(client), timeout,
-                                         &request);
-       if (tevent_req_nomem(subreq, req)) {
-               return tevent_req_post(req, ev);
-       }
-       tevent_req_set_callback(subreq, ctdb_attach_mutex_done, req);
-
-       return req;
-}
-
-static void ctdb_attach_mutex_done(struct tevent_req *subreq)
-{
-       struct tevent_req *req = tevent_req_callback_data(
-               subreq, struct tevent_req);
-       struct ctdb_attach_state *state = tevent_req_data(
-               req, struct ctdb_attach_state);
-       struct ctdb_reply_control *reply;
-       struct ctdb_req_control request;
-       uint32_t mutex_enabled;
-       int ret;
-       bool status;
-
-       status = ctdb_client_control_recv(subreq, &ret, state, &reply);
-       TALLOC_FREE(subreq);
-       if (! status) {
-               DEBUG(DEBUG_ERR, ("attach: %s GET_TUNABLE failed, ret=%d\n",
-                                 state->db->db_name, ret));
-               tevent_req_error(req, ret);
-               return;
-       }
-
-       ret = ctdb_reply_control_get_tunable(reply, &mutex_enabled);
-       if (ret != 0) {
-               /* Treat error as mutex support not available */
-               mutex_enabled = 0;
-       }
-
-       if (state->db->persistent) {
-               state->tdb_flags = TDB_DEFAULT;
-       } else {
-               state->tdb_flags = (TDB_NOSYNC | TDB_INCOMPATIBLE_HASH |
-                                   TDB_CLEAR_IF_FIRST);
-               if (mutex_enabled == 1) {
-                       state->tdb_flags |= TDB_MUTEX_LOCKING;
-               }
-       }
-
        if (state->db->persistent) {
                ctdb_req_control_db_attach_persistent(&request,
-                                                     state->db->db_name,
-                                                     state->tdb_flags);
+                                                     state->db->db_name);
        } else {
-               ctdb_req_control_db_attach(&request, state->db->db_name,
-                                          state->tdb_flags);
+               ctdb_req_control_db_attach(&request, state->db->db_name);
        }
 
        subreq = ctdb_client_control_send(state, state->ev, state->client,
                                          state->destnode, state->timeout,
                                          &request);
        if (tevent_req_nomem(subreq, req)) {
-               return;
+               return tevent_req_post(req, ev);
        }
        tevent_req_set_callback(subreq, ctdb_attach_dbid_done, req);
+
+       return req;
 }
 
 static void ctdb_attach_dbid_done(struct tevent_req *subreq)
@@ -511,6 +461,7 @@ static void ctdb_attach_flags_done(struct tevent_req 
*subreq)
                subreq, struct tevent_req);
        struct ctdb_attach_state *state = tevent_req_data(
                req, struct ctdb_attach_state);
+       struct ctdb_req_control request;
        bool status;
        int ret;
 
@@ -523,8 +474,46 @@ static void ctdb_attach_flags_done(struct tevent_req 
*subreq)
                return;
        }
 
+       ctdb_req_control_db_open_flags(&request, state->db->db_id);
+       subreq = ctdb_client_control_send(state, state->ev, state->client,
+                                         state->destnode, state->timeout,
+                                         &request);
+       if (tevent_req_nomem(subreq, req)) {
+               return;
+       }
+       tevent_req_set_callback(subreq, ctdb_attach_open_flags_done, req);
+}
+
+static void ctdb_attach_open_flags_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct ctdb_attach_state *state = tevent_req_data(
+               req, struct ctdb_attach_state);
+       struct ctdb_reply_control *reply;
+       bool status;
+       int ret, tdb_flags;
+
+       status = ctdb_client_control_recv(subreq, &ret, state, &reply);
+       TALLOC_FREE(subreq);
+       if (! status) {
+               DEBUG(DEBUG_ERR, ("attach: %s DB_OPEN_FLAGS failed, ret=%d\n",
+                                 state->db->db_name, ret));
+               tevent_req_error(req, ret);
+               return;
+       }
+
+       ret = ctdb_reply_control_db_open_flags(reply, &tdb_flags);
+       talloc_free(reply);
+       if (ret != 0) {
+               DEBUG(DEBUG_ERR, ("attach: %s DB_OPEN_FLAGS parse failed,"
+                                 " ret=%d\n", state->db->db_name, ret));
+               tevent_req_error(req, ret);
+               return;
+       }
+
        state->db->ltdb = tdb_wrap_open(state->db, state->db->db_path, 0,
-                                       state->tdb_flags, O_RDWR, 0);
+                                       tdb_flags, O_RDWR, 0);
        if (tevent_req_nomem(state->db->ltdb, req)) {
                DEBUG(DEBUG_ERR, ("attach: %s tdb_wrap_open failed\n",
                                  state->db->db_name));
diff --git a/ctdb/client/client_sync.h b/ctdb/client/client_sync.h
index 8c94f12..7bf58e6 100644
--- a/ctdb/client/client_sync.h
+++ b/ctdb/client/client_sync.h
@@ -91,8 +91,7 @@ int ctdb_ctrl_statistics_reset(TALLOC_CTX *mem_ctx, struct 
tevent_context *ev,
 int ctdb_ctrl_db_attach(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
                        struct ctdb_client_context *client,
                        int destnode, struct timeval timeout,
-                       const char *db_name, uint32_t tdb_flags,
-                       uint32_t *db_id);
+                       const char *db_name, uint32_t *db_id);
 
 int ctdb_ctrl_traverse_start(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
                             struct ctdb_client_context *client,
@@ -216,8 +215,7 @@ int ctdb_ctrl_db_attach_persistent(TALLOC_CTX *mem_ctx,
                                   struct tevent_context *ev,
                                   struct ctdb_client_context *client,
                                   int destnode, struct timeval timeout,
-                                  const char *db_name, int tdb_flags,
-                                  uint32_t *db_id);
+                                  const char *db_name, uint32_t *db_id);
 
 int ctdb_ctrl_send_gratuitous_arp(TALLOC_CTX *mem_ctx,
                                  struct tevent_context *ev,
@@ -485,6 +483,11 @@ int ctdb_ctrl_db_push_confirm(TALLOC_CTX *mem_ctx, struct 
tevent_context *ev,
                              int destnode, struct timeval timeout,
                              uint32_t db_id, uint32_t *num_records);
 
+int ctdb_ctrl_db_open_flags(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
+                           struct ctdb_client_context *client,
+                           int destnode, struct timeval timeout,
+                           uint32_t db_id, int *tdb_flags);
+
 /* from client/client_message_sync.c */
 
 int ctdb_message_recd_update_ip(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
diff --git a/ctdb/client/ctdb_client.c b/ctdb/client/ctdb_client.c
index 6ffa0f4..cc23b05 100644
--- a/ctdb/client/ctdb_client.c
+++ b/ctdb/client/ctdb_client.c
@@ -2079,21 +2079,51 @@ int ctdb_statistics_reset(struct ctdb_context *ctdb, 
uint32_t destnode)
 }
 
 /*
+ * Get db open flags
+ */
+int ctdb_ctrl_db_open_flags(struct ctdb_context *ctdb, uint32_t db_id,
+                           int *tdb_flags)
+{
+       TDB_DATA indata, outdata;
+       int ret;
+       int32_t res;
+
+       indata.dptr = (uint8_t *)&db_id;
+       indata.dsize = sizeof(db_id);
+
+       ret = ctdb_control(ctdb, CTDB_CURRENT_NODE, 0,
+                          CTDB_CONTROL_DB_OPEN_FLAGS, 0, indata,
+                          ctdb, &outdata, &res, NULL, NULL);
+       if (ret != 0 || res != 0) {
+               D_ERR("ctdb control for db open flags failed\n");
+               return  -1;
+       }
+
+       if (outdata.dsize != sizeof(int32_t)) {
+               D_ERR(__location__ " expected %zi bytes, received %zi bytes\n",
+                     sizeof(int32_t), outdata.dsize);
+               talloc_free(outdata.dptr);
+               return -1;
+       }
+
+       *tdb_flags = *(int32_t *)outdata.dptr;
+       talloc_free(outdata.dptr);
+       return 0;
+}
+
+/*
   attach to a specific database - client call
 */
 struct ctdb_db_context *ctdb_attach(struct ctdb_context *ctdb,
                                    struct timeval timeout,
                                    const char *name,
-                                   bool persistent,
-                                   uint32_t tdb_flags)
+                                   bool persistent)
 {
        struct ctdb_db_context *ctdb_db;
        TDB_DATA data;
        int ret;
        int32_t res;
-#ifdef TDB_MUTEX_LOCKING
-       uint32_t mutex_enabled = 0;
-#endif
+       int tdb_flags;
 
        ctdb_db = ctdb_db_handle(ctdb, name);
        if (ctdb_db) {
@@ -2110,32 +2140,8 @@ struct ctdb_db_context *ctdb_attach(struct ctdb_context 
*ctdb,
        data.dptr = discard_const(name);
        data.dsize = strlen(name)+1;
 
-       /* CTDB has switched to using jenkins hash for volatile databases.
-        * Even if tdb_flags do not explicitly mention TDB_INCOMPATIBLE_HASH,
-        * always set it.
-        */
-       if (!persistent) {
-               tdb_flags |= TDB_INCOMPATIBLE_HASH;
-       }
-
-#ifdef TDB_MUTEX_LOCKING
-       if (!persistent) {
-               ret = ctdb_ctrl_get_tunable(ctdb, timeval_current_ofs(3,0),
-                                           CTDB_CURRENT_NODE,
-                                           "TDBMutexEnabled",
-                                           &mutex_enabled);
-               if (ret != 0) {
-                       DEBUG(DEBUG_WARNING, ("Assuming no mutex support.\n"));
-               }
-
-               if (mutex_enabled == 1) {
-                       tdb_flags |= (TDB_MUTEX_LOCKING | TDB_CLEAR_IF_FIRST);
-               }
-       }
-#endif
-
        /* tell ctdb daemon to attach */
-       ret = ctdb_control(ctdb, CTDB_CURRENT_NODE, tdb_flags, 
+       ret = ctdb_control(ctdb, CTDB_CURRENT_NODE, 0,
                           
persistent?CTDB_CONTROL_DB_ATTACH_PERSISTENT:CTDB_CONTROL_DB_ATTACH,
                           0, data, ctdb_db, &data, &res, NULL, NULL);
        if (ret != 0 || res != 0 || data.dsize != sizeof(uint32_t)) {
@@ -2143,7 +2149,7 @@ struct ctdb_db_context *ctdb_attach(struct ctdb_context 
*ctdb,
                talloc_free(ctdb_db);
                return NULL;
        }
-       
+
        ctdb_db->db_id = *(uint32_t *)data.dptr;
        talloc_free(data.dptr);
 
@@ -2154,20 +2160,12 @@ struct ctdb_db_context *ctdb_attach(struct ctdb_context 
*ctdb,
                return NULL;
        }
 
-       if (persistent) {
-               tdb_flags = TDB_DEFAULT;
-       } else {
-               tdb_flags = TDB_NOSYNC;
-#ifdef TDB_MUTEX_LOCKING
-               if (mutex_enabled) {
-                       tdb_flags |= (TDB_MUTEX_LOCKING | TDB_CLEAR_IF_FIRST);
-               }
-#endif
-       }
-       if (ctdb->valgrinding) {
-               tdb_flags |= TDB_NOMMAP;
+       ret = ctdb_ctrl_db_open_flags(ctdb, ctdb_db->db_id, &tdb_flags);
+       if (ret != 0) {
+               D_ERR("Failed to get tdb_flags for database '%s'\n", name);
+               talloc_free(ctdb_db);
+               return NULL;
        }
-       tdb_flags |= TDB_DISALLOW_NESTING;
 
        ctdb_db->ltdb = tdb_wrap_open(ctdb_db, ctdb_db->db_path, 0, tdb_flags,
                                      O_RDWR, 0);
@@ -3924,7 +3922,7 @@ struct ctdb_transaction_handle 
*ctdb_transaction_start(struct ctdb_db_context *c
        }
 
        h->g_lock_db = ctdb_attach(h->ctdb_db->ctdb, timeval_current_ofs(3,0),
-                                  "g_lock.tdb", false, 0);
+                                  "g_lock.tdb", false);
        if (!h->g_lock_db) {
                DEBUG(DEBUG_ERR, (__location__ " unable to attach to 
g_lock.tdb\n"));
                talloc_free(h);
diff --git a/ctdb/common/common.h b/ctdb/common/common.h
index 48e5767..0423c5e 100644
--- a/ctdb/common/common.h
+++ b/ctdb/common/common.h
@@ -39,6 +39,8 @@ struct ctdb_queue *ctdb_queue_setup(struct ctdb_context *ctdb,
 
 /* From common/ctdb_ltdb.c */
 
+int ctdb_db_tdb_flags(uint8_t db_flags, bool with_valgrind, bool with_mutex);
+
 struct ctdb_db_context *ctdb_db_handle(struct ctdb_context *ctdb,
                                       const char *name);
 
diff --git a/ctdb/common/ctdb_ltdb.c b/ctdb/common/ctdb_ltdb.c
index fe8b41a..34ebe6a 100644
--- a/ctdb/common/ctdb_ltdb.c
+++ b/ctdb/common/ctdb_ltdb.c
@@ -33,6 +33,37 @@
 #include "common/common.h"
 #include "common/logging.h"
 
+
+/*
+ * Calculate tdb flags based on databse type
+ */
+int ctdb_db_tdb_flags(uint8_t db_flags, bool with_valgrind, bool with_mutex)
+{
+       int tdb_flags = 0;
+
+       if (db_flags & CTDB_DB_FLAGS_PERSISTENT) {
+               tdb_flags = TDB_DEFAULT;
+       } else {
+               tdb_flags = TDB_NOSYNC |
+                           TDB_CLEAR_IF_FIRST |
+                           TDB_INCOMPATIBLE_HASH;
+
+#ifdef TDB_MUTEX_LOCKING
+               if (with_mutex && tdb_runtime_check_for_robust_mutexes()) {
+                       tdb_flags |= TDB_MUTEX_LOCKING;
+               }
+#endif
+
+       }
+
+       tdb_flags |= TDB_DISALLOW_NESTING;
+       if (with_valgrind) {
+               tdb_flags |= TDB_NOMMAP;
+       }
+
+       return tdb_flags;
+}
+
 /*
   find an attached ctdb_db handle given a name
  */
diff --git a/ctdb/include/ctdb_client.h b/ctdb/include/ctdb_client.h
index aa0d6b0..d4fd771 100644
--- a/ctdb/include/ctdb_client.h
+++ b/ctdb/include/ctdb_client.h
@@ -270,11 +270,13 @@ int ctdb_statistics_reset(struct ctdb_context *ctdb, 
uint32_t destnode);
 /*
   attach to a ctdb database
 */
+int ctdb_ctrl_db_open_flags(struct ctdb_context *ctdb, uint32_t db_id,
+                           int *tdb_flags);
+
 struct ctdb_db_context *ctdb_attach(struct ctdb_context *ctdb,
                                    struct timeval timeout,
                                    const char *name,
-                                   bool persistent,
-                                   uint32_t tdb_flags);
+                                   bool persistent);
 
 int ctdb_detach(struct ctdb_context *ctdb, uint32_t db_id);
 
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index dd54f35..8cdb4d8 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -724,7 +724,7 @@ int ctdb_set_db_readonly(struct ctdb_context *ctdb,
 int ctdb_process_deferred_attach(struct ctdb_context *ctdb);
 
 int32_t ctdb_control_db_attach(struct ctdb_context *ctdb, TDB_DATA indata,
-                              TDB_DATA *outdata, uint64_t tdb_flags,
+                              TDB_DATA *outdata,
                               bool persistent, uint32_t client_id,
                               struct ctdb_req_control_old *c,
                               bool *async_reply);
diff --git a/ctdb/protocol/protocol.h b/ctdb/protocol/protocol.h
index 60e20b4..7e99738 100644
--- a/ctdb/protocol/protocol.h
+++ b/ctdb/protocol/protocol.h
@@ -367,6 +367,7 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS          = 
0,
                    CTDB_CONTROL_DB_PULL                 = 146,
                    CTDB_CONTROL_DB_PUSH_START           = 147,
                    CTDB_CONTROL_DB_PUSH_CONFIRM         = 148,
+                   CTDB_CONTROL_DB_OPEN_FLAGS           = 149,
 };
 
 #define CTDB_MONITORING_ENABLED                0


-- 
Samba Shared Repository

Reply via email to