ctdb-daemon: Refactor calculation of tdb open flags based on database type
authorAmitay Isaacs <amitay@gmail.com>
Tue, 21 Mar 2017 02:50:07 +0000 (13:50 +1100)
committerMartin Schwenke <martins@samba.org>
Mon, 26 Jun 2017 13:47:24 +0000 (15:47 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/client/ctdb_client.c
ctdb/common/common.h
ctdb/common/ctdb_ltdb.c
ctdb/server/ctdb_ltdb_server.c

index 6ffa0f43d1d442d1286f531fb8d02d7316f01e8e..5ba03c87071252fa15981706b6d58877488e9119 100644 (file)
@@ -2085,15 +2085,15 @@ struct ctdb_db_context *ctdb_attach(struct ctdb_context *ctdb,
                                    struct timeval timeout,
                                    const char *name,
                                    bool persistent,
-                                   uint32_t tdb_flags)
+                                   uint32_t tdb_flags_unused)
 {
        struct ctdb_db_context *ctdb_db;
        TDB_DATA data;
        int ret;
        int32_t res;
-#ifdef TDB_MUTEX_LOCKING
-       uint32_t mutex_enabled = 0;
-#endif
+       uint8_t db_flags = 0;
+       int tdb_flags;
+       bool with_mutex = false;
 
        ctdb_db = ctdb_db_handle(ctdb, name);
        if (ctdb_db) {
@@ -2110,16 +2110,10 @@ 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) {
+               uint32_t mutex_enabled = 0;
+
                ret = ctdb_ctrl_get_tunable(ctdb, timeval_current_ofs(3,0),
                                            CTDB_CURRENT_NODE,
                                            "TDBMutexEnabled",
@@ -2129,11 +2123,16 @@ struct ctdb_db_context *ctdb_attach(struct ctdb_context *ctdb,
                }
 
                if (mutex_enabled == 1) {
-                       tdb_flags |= (TDB_MUTEX_LOCKING | TDB_CLEAR_IF_FIRST);
+                       with_mutex = true;
                }
        }
 #endif
 
+       if (persistent) {
+               db_flags = CTDB_DB_FLAGS_PERSISTENT;
+       }
+       tdb_flags = ctdb_db_tdb_flags(db_flags, ctdb->valgrinding, with_mutex);
+
        /* tell ctdb daemon to attach */
        ret = ctdb_control(ctdb, CTDB_CURRENT_NODE, tdb_flags, 
                           persistent?CTDB_CONTROL_DB_ATTACH_PERSISTENT:CTDB_CONTROL_DB_ATTACH,
@@ -2143,7 +2142,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,21 +2153,6 @@ 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;
-       }
-       tdb_flags |= TDB_DISALLOW_NESTING;
-
        ctdb_db->ltdb = tdb_wrap_open(ctdb_db, ctdb_db->db_path, 0, tdb_flags,
                                      O_RDWR, 0);
        if (ctdb_db->ltdb == NULL) {
index 48e5767c68a95a65f625df53badf823be249f016..0423c5e2538d4249677b59105890d1a96bebcf68 100644 (file)
@@ -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);
 
index fe8b41a17fcd8bc16b0c6c37c03240407bffa612..34ebe6acbbc5e1ab29e0dbdad44a99e52bbd5c30 100644 (file)
 #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
  */
index 6ae92f52a97a96296ce34e5cfaec01c8e7d626fb..6b99545c92dd3a88f16e72fbd7be278883819a77 100644 (file)
@@ -763,9 +763,10 @@ static int ctdb_local_attach(struct ctdb_context *ctdb, const char *db_name,
        struct ctdb_db_context *ctdb_db, *tmp_db;
        int ret;
        struct TDB_DATA key;
-       unsigned tdb_flags;
+       int tdb_flags;
        int mode = 0600;
        int remaining_tries = 0;
+       uint8_t db_flags = 0;
 
        ctdb_db = talloc_zero(ctdb, struct ctdb_db_context);
        CTDB_NO_MEMORY(ctdb, ctdb_db);
@@ -844,20 +845,12 @@ static int ctdb_local_attach(struct ctdb_context *ctdb, const char *db_name,
                                           persistent?ctdb->db_directory_persistent:ctdb->db_directory, 
                                           db_name, ctdb->pnn);
 
-       tdb_flags = persistent? TDB_DEFAULT : TDB_CLEAR_IF_FIRST | TDB_NOSYNC;
-       if (ctdb->valgrinding) {
-               tdb_flags |= TDB_NOMMAP;
-       }
-       tdb_flags |= TDB_DISALLOW_NESTING;
-       if (jenkinshash) {
-               tdb_flags |= TDB_INCOMPATIBLE_HASH;
-       }
-#ifdef TDB_MUTEX_LOCKING
-       if (ctdb->tunable.mutex_enabled && mutexes &&
-           tdb_runtime_check_for_robust_mutexes()) {
-               tdb_flags |= (TDB_MUTEX_LOCKING | TDB_CLEAR_IF_FIRST);
+       if (persistent) {
+               db_flags = CTDB_DB_FLAGS_PERSISTENT;
        }
-#endif
+
+       tdb_flags = ctdb_db_tdb_flags(db_flags, ctdb->valgrinding,
+                                     ctdb->tunable.mutex_enabled);
 
 again:
        ctdb_db->ltdb = tdb_wrap_open(ctdb_db, ctdb_db->db_path,