From: Gary Lockyer Date: Thu, 22 Mar 2018 22:29:25 +0000 (+1300) Subject: ldb_mdb: Remove implicit read lock and remove transaction counter X-Git-Tag: ldb-1.4.0~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65f6ce7a6e187ce45098b7fd88fdcda90b242837;p=thirdparty%2Fsamba.git ldb_mdb: Remove implicit read lock and remove transaction counter The way to know if we are in a transaction is if there is a non-NULL transaction handle. This allows the ldb_mdb_kv_ops_test test to be run. Signed-off-by: Andrew Bartlett Signed-off-by: Gary Lockyer Reviewed-by: Garming Sam --- diff --git a/lib/ldb/ldb_mdb/ldb_mdb.c b/lib/ldb/ldb_mdb/ldb_mdb.c index 4eae7f45202..af552feb317 100644 --- a/lib/ldb/ldb_mdb/ldb_mdb.c +++ b/lib/ldb/ldb_mdb/ldb_mdb.c @@ -129,29 +129,21 @@ static struct lmdb_trans *lmdb_private_trans_head(struct lmdb_private *lmdb) return ltx; } + static MDB_txn *get_current_txn(struct lmdb_private *lmdb) { MDB_txn *txn = NULL; + txn = lmdb_trans_get_tx(lmdb_private_trans_head(lmdb)); + if (txn != NULL) { + return txn; + } if (lmdb->read_txn != NULL) { return lmdb->read_txn; } - - txn = lmdb_trans_get_tx(lmdb_private_trans_head(lmdb)); - if (txn == NULL) { - int ret; - ret = mdb_txn_begin(lmdb->env, NULL, MDB_RDONLY, &txn); - if (ret != 0) { - lmdb->error = ret; - ldb_asprintf_errstring(lmdb->ldb, - "%s failed: %s\n", __FUNCTION__, - mdb_strerror(ret)); - return NULL; - } - lmdb->read_txn = txn; - } - - return txn; + lmdb->error = MDB_BAD_TXN; + ldb_set_errstring(lmdb->ldb, __location__":No active transaction\n"); + return NULL; } static int lmdb_store(struct ltdb_private *ltdb, @@ -197,10 +189,6 @@ static int lmdb_store(struct ltdb_private *ltdb, MDB_val value; lmdb->error = mdb_get(txn, dbi, &mdb_key, &value); if (lmdb->error != MDB_SUCCESS) { - if (ltdb->read_lock_count == 0 && lmdb->read_txn != NULL) { - mdb_txn_commit(lmdb->read_txn); - lmdb->read_txn = NULL; - } return ldb_mdb_error(lmdb->ldb, lmdb->error); } mdb_flags = 0; @@ -304,11 +292,6 @@ done: mdb_cursor_close(cursor); } - if (ltdb->read_lock_count == 0 && lmdb->read_txn != NULL) { - mdb_txn_commit(lmdb->read_txn); - lmdb->read_txn = NULL; - } - if (lmdb->error != MDB_SUCCESS) { return ldb_mdb_error(lmdb->ldb, lmdb->error); } @@ -414,10 +397,6 @@ static int lmdb_parse_record(struct ltdb_private *ltdb, struct ldb_val key, if (lmdb->error != MDB_SUCCESS) { /* TODO closing a handle should not even be necessary */ mdb_dbi_close(lmdb->env, dbi); - if (ltdb->read_lock_count == 0 && lmdb->read_txn != NULL) { - mdb_txn_commit(lmdb->read_txn); - lmdb->read_txn = NULL; - } if (lmdb->error == MDB_NOTFOUND) { return LDB_ERR_NO_SUCH_OBJECT; } @@ -429,11 +408,6 @@ static int lmdb_parse_record(struct ltdb_private *ltdb, struct ldb_val key, /* TODO closing a handle should not even be necessary */ mdb_dbi_close(lmdb->env, dbi); - /* We created a read transaction, commit it */ - if (ltdb->read_lock_count == 0 && lmdb->read_txn != NULL) { - mdb_txn_commit(lmdb->read_txn); - lmdb->read_txn = NULL; - } return parser(key, data, ctx); } @@ -517,7 +491,6 @@ static int lmdb_transaction_start(struct ltdb_private *ltdb) return LDB_ERR_PROTOCOL_ERROR; } - ltx_head = lmdb_private_trans_head(lmdb); tx_parent = lmdb_trans_get_tx(ltx_head); diff --git a/lib/ldb/wscript b/lib/ldb/wscript index 80c817362f7..dfca1bc7b34 100644 --- a/lib/ldb/wscript +++ b/lib/ldb/wscript @@ -552,10 +552,12 @@ def test(ctx): 'ldb_tdb_kv_ops_test', 'ldb_tdb_test', 'ldb_mdb_mod_op_test', - 'ldb_lmdb_test'] + 'ldb_lmdb_test', # we don't want to run ldb_lmdb_size_test (which proves we can # fit > 4G of data into the DB), it would fill up the disk on # many of our test instances + 'ldb_mdb_kv_ops_test'] + for test_exe in test_exes: cmd = os.path.join(Utils.g_module.blddir, test_exe) cmocka_ret = cmocka_ret or samba_utils.RUN_COMMAND(cmd)