From: Amitay Isaacs Date: Tue, 21 Mar 2017 02:50:07 +0000 (+1100) Subject: ctdb-daemon: Refactor calculation of tdb open flags based on database type X-Git-Tag: tdb-1.3.14~179 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1be2ff8b81871c1e2ff8721a0174862573edec38;p=thirdparty%2Fsamba.git ctdb-daemon: Refactor calculation of tdb open flags based on database type Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke --- diff --git a/ctdb/client/ctdb_client.c b/ctdb/client/ctdb_client.c index 6ffa0f43d1d..5ba03c87071 100644 --- a/ctdb/client/ctdb_client.c +++ b/ctdb/client/ctdb_client.c @@ -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) { diff --git a/ctdb/common/common.h b/ctdb/common/common.h index 48e5767c68a..0423c5e2538 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 fe8b41a17fc..34ebe6acbbc 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/server/ctdb_ltdb_server.c b/ctdb/server/ctdb_ltdb_server.c index 6ae92f52a97..6b99545c92d 100644 --- a/ctdb/server/ctdb_ltdb_server.c +++ b/ctdb/server/ctdb_ltdb_server.c @@ -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,