]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/cache/cdb: add txn_open_rw()
authorVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 23 Apr 2026 08:50:28 +0000 (10:50 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Wed, 15 Jul 2026 14:12:54 +0000 (16:12 +0200)
This was extracted from jezek-test commit:
  lib/rules: make kr_rule_local_subtree() safer wrt. transactions

While we don't use this so far, picking will reduce conflicts
e.g. when moving changes between the branches.

lib/cache/cdb_api.h
lib/cache/cdb_lmdb.c

index 9e8a34d589e79df31e843141fcde34bb297054db..f625c3430a90f9d1426c7ef17d32650a35a8f5de 100644 (file)
@@ -65,11 +65,15 @@ struct kr_cdb_api {
         * \return error code - accepting RW transactions can fail with LMDB.
         */
        int (*commit)(kr_cdb_pt db, struct kr_cdb_stats *stat, bool accept_rw, bool reset_ro);
+       /** Run before a row of operations to ensure they happen in a single RW transaction,
+        *   at least in case of successes. */
+       int (*txn_open_rw)(kr_cdb_pt db, struct kr_cdb_stats *stat/*unused*/);
 
        /* Data access */
 
        int (*read)(kr_cdb_pt db, struct kr_cdb_stats *stat,
                        const knot_db_val_t *key, knot_db_val_t *val, int maxcount);
+       /* TODO: the behavior of write() around transactions is a bit complex. */
        int (*write)(kr_cdb_pt db, struct kr_cdb_stats *stat, const knot_db_val_t *key,
                        knot_db_val_t *val, int maxcount);
 
index 0319b5cbb3d9e2d84bae5843597a75f9e080ae9a..6bb5cd82d1ed6c3e56432b7341b77c151a71ecb2 100644 (file)
@@ -244,6 +244,13 @@ static int cdb_commit(kr_cdb_pt db, struct kr_cdb_stats *stats, bool accept_rw,
        return ret;
 }
 
+static int cdb_txn_open_rw(kr_cdb_pt db, struct kr_cdb_stats *stat/*unused*/)
+{
+       struct lmdb_env *env = db2env(db);
+       MDB_txn *txn = NULL;
+       return txn_get(env, &txn, false);
+}
+
 /** Obtain a read-only cursor (and a read-only transaction).
  * TODO: allow RW transaction (for ruledb iterator) */
 static int txn_curs_get(struct lmdb_env *env, MDB_cursor **curs, struct kr_cdb_stats *stats)
@@ -958,7 +965,8 @@ const struct kr_cdb_api *kr_cdb_lmdb(void)
 {
        static const struct kr_cdb_api api = {
                "lmdb",
-               cdb_init, cdb_deinit, cdb_count, cdb_clear, cdb_commit,
+               cdb_init, cdb_deinit, cdb_count, cdb_clear,
+               cdb_commit, cdb_txn_open_rw,
                cdb_readv, cdb_writev, cdb_remove,
                cdb_match,
                cdb_read_leq, cdb_read_less,