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) {
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",
}
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,
talloc_free(ctdb_db);
return NULL;
}
-
+
ctdb_db->db_id = *(uint32_t *)data.dptr;
talloc_free(data.dptr);
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) {
/* 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);
#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
*/
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);
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,