From: Vladimír Čunát Date: Thu, 23 Apr 2026 08:50:28 +0000 (+0200) Subject: lib/cache/cdb: add txn_open_rw() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=775f93ca3452b0d12dd25c13000bd1442dc40e41;p=thirdparty%2Fknot-resolver.git lib/cache/cdb: add txn_open_rw() 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. --- diff --git a/lib/cache/cdb_api.h b/lib/cache/cdb_api.h index 9e8a34d58..f625c3430 100644 --- a/lib/cache/cdb_api.h +++ b/lib/cache/cdb_api.h @@ -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); diff --git a/lib/cache/cdb_lmdb.c b/lib/cache/cdb_lmdb.c index 0319b5cbb..6bb5cd82d 100644 --- a/lib/cache/cdb_lmdb.c +++ b/lib/cache/cdb_lmdb.c @@ -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,