]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/cache: add a "<" search in addition to "<="
authorVladimír Čunát <vladimir.cunat@nic.cz>
Sat, 2 Jul 2022 10:49:38 +0000 (12:49 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Mon, 12 Jun 2023 08:32:28 +0000 (10:32 +0200)
daemon/lua/kres-gen-30.lua
daemon/lua/kres-gen-31.lua
daemon/lua/kres-gen-32.lua
lib/cache/cdb_api.h
lib/cache/cdb_lmdb.c

index 3cfcf4f3d58fcb3c5b74649dd28de6cb3b1e24b0..968748918f3b596fe3d363a3dec78978557f945c 100644 (file)
@@ -262,6 +262,7 @@ struct kr_cdb_stats {
        uint64_t match_miss;
        uint64_t read_leq;
        uint64_t read_leq_miss;
+       uint64_t read_less;
        double usage_percent;
 };
 typedef struct uv_timer_s uv_timer_t;
index 55ef09627ad4c269e95d1661da5dfa90e3bee7a7..c07888e9c8aab4120e4d7fb908a5bd2c967fe74d 100644 (file)
@@ -262,6 +262,7 @@ struct kr_cdb_stats {
        uint64_t match_miss;
        uint64_t read_leq;
        uint64_t read_leq_miss;
+       uint64_t read_less;
        double usage_percent;
 };
 typedef struct uv_timer_s uv_timer_t;
index c8b1d1a88dff736ae258371df3165ca4f1b02b62..d63fe6660a93768d14888e2931276895af28199d 100644 (file)
@@ -273,6 +273,7 @@ struct kr_cdb_stats {
        uint64_t match_miss;
        uint64_t read_leq;
        uint64_t read_leq_miss;
+       uint64_t read_less;
        double usage_percent;
 };
 typedef struct uv_timer_s uv_timer_t;
index f0d810fcc3eb09cbc94d6243c45c1e8911dd37dc..43d1433f50a198e510b3e792b2acc9c5461094b8 100644 (file)
@@ -32,6 +32,7 @@ struct kr_cdb_stats {
        uint64_t match_miss;
        uint64_t read_leq;
        uint64_t read_leq_miss;
+       uint64_t read_less;
        double usage_percent;
 };
 
@@ -85,6 +86,12 @@ struct kr_cdb_api {
        int (*read_leq)(kr_cdb_pt db, struct kr_cdb_stats *stat,
                        knot_db_val_t *key, knot_db_val_t *val);
 
+       /** Less-than search (lexicographic ordering).
+        * On successful return, key->data and val->data point to DB-owned data.
+        * return: > 0 for less, < 0 kr_error */
+       int (*read_less)(kr_cdb_pt db, struct kr_cdb_stats *stat,
+                       knot_db_val_t *key, knot_db_val_t *val);
+
        /** Return estimated space usage (0--100). */
        double (*usage_percent)(kr_cdb_pt db);
 
index 1b6c33f5fc9e60788a50aa90ebf3db79f655f073..76570f1928c08fe4ada96a4758757da1ef769109 100644 (file)
@@ -833,6 +833,33 @@ failure:
        return lmdb_error(ret);
 }
 
+static int cdb_read_less(kr_cdb_pt db, struct kr_cdb_stats *stats,
+               knot_db_val_t *key, knot_db_val_t *val)
+{
+       if (kr_fails_assert(db && key && key->data && val))
+               return kr_error(EINVAL);
+       struct lmdb_env *env = db2env(db);
+       MDB_cursor *curs = NULL;
+       int ret = txn_curs_get(env, &curs, stats);
+       if (ret) return ret;
+
+       MDB_val key2_m = val_knot2mdb(*key);
+       MDB_val val2_m = { 0, NULL };
+       stats->read_less++;
+       ret = mdb_cursor_get(curs, &key2_m, &val2_m, MDB_PREV);
+       if (!ret) {
+               /* finalize the output */
+               *key = val_mdb2knot(key2_m);
+               *val = val_mdb2knot(val2_m);
+               return 1;
+       } else if (ret == MDB_NOTFOUND) {
+               // stats->read_less++; // seems a pointless stat
+       } else {
+               txn_abort(env);
+       }
+       return lmdb_error(ret);
+}
+
 static double cdb_usage_percent(kr_cdb_pt db)
 {
        knot_db_t *kdb = kr_cdb_pt2knot_db_t(db);
@@ -870,7 +897,7 @@ const struct kr_cdb_api *kr_cdb_lmdb(void)
                cdb_init, cdb_deinit, cdb_count, cdb_clear, cdb_commit,
                cdb_readv, cdb_writev, cdb_remove,
                cdb_match,
-               cdb_read_leq,
+               cdb_read_leq, cdb_read_less,
                cdb_usage_percent, cdb_get_maxsize,
                cdb_check_health,
        };