]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
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)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 23 May 2018 00:27:11 +0000 (02:27 +0200)
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 <abartlet@samba.org>
Signed-off-by: Gary Lockyer <gary@catalyst.net.nz>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
lib/ldb/ldb_mdb/ldb_mdb.c
lib/ldb/wscript

index 4eae7f4520221db9146984f5bad0d7496574235d..af552feb317a70478e8010b9b5ae5784cb3f39fa 100644 (file)
@@ -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);
index 80c817362f76b67c7592ae2d11a32357600bae2f..dfca1bc7b34315d0743b2da4d079216dcbaae236 100644 (file)
@@ -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)