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-Url: http://git.samba.org/?p=metze%2Fsamba%2Fwip.git;a=commitdiff_plain;h=560ad7c32a12744361f0a155af77be6dd6f1c644 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. Signed-off-by: Andrew Bartlett Signed-off-by: Gary Lockyer --- diff --git a/lib/ldb/ldb_mdb/ldb_mdb.c b/lib/ldb/ldb_mdb/ldb_mdb.c index 6662aae434a3..94dd2096c81a 100644 --- a/lib/ldb/ldb_mdb/ldb_mdb.c +++ b/lib/ldb/ldb_mdb/ldb_mdb.c @@ -130,26 +130,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; - 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)); - } - lmdb->read_txn = txn; + if (txn != NULL) { + return txn; + } + if (lmdb->read_txn != NULL) { + return lmdb->read_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, @@ -195,10 +190,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; @@ -303,11 +294,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); } @@ -411,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; } @@ -426,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); } @@ -454,7 +431,7 @@ static int lmdb_lock_read(struct ldb_module *module) } lmdb->error = MDB_SUCCESS; - if (ltdb->in_transaction == 0 && + if (lmdb_transaction_active(ltdb) == false && ltdb->read_lock_count == 0) { lmdb->error = mdb_txn_begin(lmdb->env, NULL, @@ -474,7 +451,7 @@ static int lmdb_unlock_read(struct ldb_module *module) void *data = ldb_module_get_private(module); struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private); - if (ltdb->in_transaction == 0 && ltdb->read_lock_count == 1) { + if (lmdb_transaction_active(ltdb) == false && ltdb->read_lock_count == 1) { struct lmdb_private *lmdb = ltdb->lmdb_private; mdb_txn_commit(lmdb->read_txn); lmdb->read_txn = NULL; @@ -514,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);