ldb_mdb: Remove implicit read lock and remove transaction counter
authorGary Lockyer <gary@catalyst.net.nz>
Thu, 22 Mar 2018 22:29:25 +0000 (11:29 +1300)
committerStefan Metzmacher <metze@samba.org>
Thu, 12 Apr 2018 14:27:18 +0000 (16:27 +0200)
The way to know if we are in a transaction is if there is a non-NULL
transaction handle.

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Signed-off-by: Gary Lockyer <gary@catalyst.net.nz>
lib/ldb/ldb_mdb/ldb_mdb.c

index 6662aae434a3817bd6faaf53b74790cf07258ef8..94dd2096c81ac31159b72bcef4870fab44811f5f 100644 (file)
@@ -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);