]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/rules: DB size+path: make configurable, bump to 100 MiB
authorVladimír Čunát <vladimir.cunat@nic.cz>
Fri, 9 Jun 2023 09:01:06 +0000 (11:01 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Mon, 12 Jun 2023 08:32:57 +0000 (10:32 +0200)
Ideally we'd expand it as needed, but that seems relatively complicated,
so for now let's go big with the sparse file and allow to override.

daemon/lua/kres-gen-30.lua
daemon/lua/kres-gen-31.lua
daemon/lua/kres-gen-32.lua
daemon/lua/kres-gen.sh
daemon/main.c
lib/rules/api.c
lib/rules/api.h
lib/rules/forward.c
lib/rules/impl.h
lib/rules/zonefile.c

index f92fa0b67f1fc4b22fd6156b61f52ecc0206c15a..0a26f7ea7648243920a8982ae4422f77fa0fff62 100644 (file)
@@ -489,6 +489,7 @@ int kr_cache_remove(struct kr_cache *, const knot_dname_t *, uint16_t);
 int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
 int kr_cache_commit(struct kr_cache *);
 uint32_t packet_ttl(const knot_pkt_t *);
+int kr_rules_init(const char *, size_t);
 int kr_view_insert_action(const char *, const char *);
 int kr_view_select_action(const struct kr_request *, knot_db_val_t *);
 int kr_rule_tag_add(const char *, kr_rule_tags_t *);
index 4bc38f34b480d123eb6a4778ec917b801b19df30..605e225d80301f7d7fd4f94c2b2ab4609b10c77f 100644 (file)
@@ -489,6 +489,7 @@ int kr_cache_remove(struct kr_cache *, const knot_dname_t *, uint16_t);
 int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
 int kr_cache_commit(struct kr_cache *);
 uint32_t packet_ttl(const knot_pkt_t *);
+int kr_rules_init(const char *, size_t);
 int kr_view_insert_action(const char *, const char *);
 int kr_view_select_action(const struct kr_request *, knot_db_val_t *);
 int kr_rule_tag_add(const char *, kr_rule_tags_t *);
index 69ccfee881d14c26289df5e1fbbe3310bd341c9c..bd7d2c3008e6d5c8968d773aa1bb3bce3f6f2276 100644 (file)
@@ -490,6 +490,7 @@ int kr_cache_remove(struct kr_cache *, const knot_dname_t *, uint16_t);
 int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
 int kr_cache_commit(struct kr_cache *);
 uint32_t packet_ttl(const knot_pkt_t *);
+int kr_rules_init(const char *, size_t);
 int kr_view_insert_action(const char *, const char *);
 int kr_view_select_action(const struct kr_request *, knot_db_val_t *);
 int kr_rule_tag_add(const char *, kr_rule_tags_t *);
index d4ee2772443bd1f80bfbb66b5d6e29fa253f28c5..c52ba095ee866dac3c3053f9386c7f9a4c62756b 100755 (executable)
@@ -289,6 +289,7 @@ ${CDEFS} ${LIBKRES} functions <<-EOF
        # FIXME: perhaps rename this exported symbol
        packet_ttl
 # New policy
+       kr_rules_init
        kr_view_insert_action
        kr_view_select_action
        kr_rule_tag_add
index 6b8ca064bedc1fd7a1d934910560eb53f9c874e4..d1e9f57d6814a822478a41ce09992b5aed988d12 100644 (file)
@@ -583,14 +583,6 @@ int main(int argc, char **argv)
                goto cleanup;
        }
 
-       ret = kr_rules_init();
-       if (ret) {
-               kr_log_error(RULES, "failed to initialize policy rule engine: %s\n",
-                               kr_strerror(ret));
-               ret = EXIT_FAILURE;
-               goto cleanup;
-       }
-
        for (i = 0; i < the_args->config.len; ++i) {
                const char *config = the_args->config.at[i];
                if (engine_loadconf(&engine, config) != 0) {
@@ -600,6 +592,14 @@ int main(int argc, char **argv)
                lua_settop(engine.L, 0);
        }
 
+       ret = kr_rules_init_ensure();
+       if (ret) {
+               kr_log_error(RULES, "failed to initialize policy rule engine: %s\n",
+                               kr_strerror(ret));
+               ret = EXIT_FAILURE;
+               goto cleanup;
+       }
+
        drop_capabilities();
 
        if (engine_start(&engine) != 0) {
index 6cd9da82d0cb9f9445bf5769c67bf28179326988..325ed77df3528fba4ed3f1649af56b9499af8f94 100644 (file)
@@ -62,7 +62,7 @@ static int tag_names_default(void)
 
 int kr_rule_tag_add(const char *tag, kr_rule_tags_t *tagset)
 {
-       kr_require(the_rules);
+       ENSURE_the_rules;
        // Construct the DB key.
        const uint8_t key_prefix[] = "\0tag_";
        knot_db_val_t key;
@@ -128,20 +128,27 @@ int kr_rule_tag_add(const char *tag, kr_rule_tags_t *tagset)
 }
 
 
-int kr_rules_init(void)
+int kr_rules_init_ensure(void)
 {
-       kr_require(!the_rules);
+       if (the_rules)
+               return kr_ok();
+       return kr_rules_init(NULL, 0);
+}
+int kr_rules_init(const char *path, size_t maxsize)
+{
+       if (the_rules)
+               return kr_error(EINVAL);
        the_rules = calloc(1, sizeof(*the_rules));
        kr_require(the_rules);
        the_rules->api = kr_cdb_lmdb();
 
        struct kr_cdb_opts opts = {
                .is_cache = false,
-               .path = "ruledb", // under current workdir
+               .path = path ? path : "ruledb", // under current workdir
                // FIXME: the file will be sparse, but we still need to choose its size somehow.
                // Later we might improve it to auto-resize in case of running out of space.
                // Caveat: mdb_env_set_mapsize() can only be called without transactions open.
-               .maxsize = 10 * 1024*(size_t)1024,
+               .maxsize = maxsize ? maxsize : 100 * 1024*(size_t)1024,
        };
        int ret = the_rules->api->open(&the_rules->db, &the_rules->stats, &opts, NULL);
        /* No persistence - we always refill from config for now.
@@ -171,8 +178,8 @@ int kr_rules_init(void)
 failure:
        free(the_rules);
        the_rules = NULL;
-       auto_free const char *path = kr_absolutize_path(".", opts.path);
-       kr_log_error(RULES, "failed while opening or initializing rule DB %s/\n", path);
+       auto_free const char *path_abs = kr_absolutize_path(".", opts.path);
+       kr_log_error(RULES, "failed while opening or initializing rule DB %s/\n", path_abs);
        return ret;
 }
 
@@ -503,7 +510,6 @@ static int answer_exact_match(struct kr_query *qry, knot_pkt_t *pkt, uint16_t ty
        return kr_ok();
 }
 
-
 knot_db_val_t local_data_key(const knot_rrset_t *rrs, uint8_t key_data[KEY_MAXLEN],
                                        const char *ruleset_name)
 {
@@ -526,7 +532,7 @@ knot_db_val_t local_data_key(const knot_rrset_t *rrs, uint8_t key_data[KEY_MAXLE
 int kr_rule_local_data_ins(const knot_rrset_t *rrs, const knot_rdataset_t *sig_rds,
                                kr_rule_tags_t tags)
 {
-       kr_require(the_rules);
+       ENSURE_the_rules;
        // Construct the DB key.
        uint8_t key_data[KEY_MAXLEN];
        knot_db_val_t key = local_data_key(rrs, key_data, RULESET_DEFAULT);
@@ -559,7 +565,7 @@ int local_data_ins(knot_db_val_t key, const knot_rrset_t *rrs,
 }
 int kr_rule_local_data_del(const knot_rrset_t *rrs, kr_rule_tags_t tags)
 {
-       kr_require(the_rules);
+       ENSURE_the_rules;
        uint8_t key_data[KEY_MAXLEN];
        knot_db_val_t key = local_data_key(rrs, key_data, RULESET_DEFAULT);
        return ruledb_op(remove, &key, 1);
@@ -715,6 +721,7 @@ knot_db_val_t zla_key(const knot_dname_t *apex, uint8_t key_data[KEY_MAXLEN])
 int insert_trivial_zone(val_zla_type_t ztype, uint32_t ttl,
                        const knot_dname_t *apex, kr_rule_tags_t tags)
 {
+       ENSURE_the_rules;
        uint8_t key_data[KEY_MAXLEN];
        knot_db_val_t key = zla_key(apex, key_data);
 
@@ -820,7 +827,7 @@ bool subnet_is_prefix(uint8_t a, uint8_t b)
 
 int kr_view_insert_action(const char *subnet, const char *action)
 {
-       kr_require(the_rules);
+       ENSURE_the_rules;
        // Parse the subnet string.
        union kr_sockaddr saddr;
        saddr.ip.sa_family = kr_straddr_family(subnet);
index 90ea4a9e0fb0ce936ec41a49e500e026fccf21ba..2ba45f209f15befdcb28dceef77180e7e84a4a82 100644 (file)
@@ -15,8 +15,16 @@ typedef uint64_t kr_rule_tags_t;
 /// Tags "capacity", i.e. numbered from 0 to _CAP - 1.
 #define KR_RULE_TAGS_CAP (sizeof(kr_rule_tags_t) * 8)
 
+/** Open the rule DB.
+ *
+ * You can call this to override the path or size (NULL/0 -> default).
+ * Not allowed if already open (EINVAL), so this optional call has to come
+ * before writing anything into the DB. */
+KR_EXPORT
+int kr_rules_init(const char *path, size_t maxsize);
+/** kr_rules_init() but OK if already open, and not allowing to override defaults. */
 KR_EXPORT
-int kr_rules_init(void);
+int kr_rules_init_ensure(void);
 
 KR_EXPORT
 void kr_rules_deinit(void);
index 1f4248d01ba6c42d5400be1ec0b00afca5f0528b..d0d261d9fe8ed81ef376d6994891394b36382823 100644 (file)
@@ -129,6 +129,7 @@ fallback:
 int kr_rule_forward(const knot_dname_t *apex, kr_rule_fwd_flags_t flags,
                        const struct sockaddr * targets[])
 {
+       ENSURE_the_rules;
        const kr_rule_tags_t tags = KR_RULE_TAGS_ALL;
        const val_zla_type_t ztype = VAL_ZLAT_FORWARD;
 
index 80eaad8d3b067b8aa8d55267b4eb5d3346ca6990..fe6c1e0355ff74fe4e129065c805e5277d3734bf 100644 (file)
@@ -20,6 +20,12 @@ int rules_defaults_insert(void);
 struct kr_rules;
 extern struct kr_rules *the_rules;
 
+#define ENSURE_the_rules \
+       if (!the_rules) { \
+               int ret = kr_rules_init(NULL, 0); \
+               if (ret) return ret; \
+       }
+
 #define KEY_RULESET_MAXLEN 16 /**< max. len of ruleset ID + 1(for kind) */
 /** When constructing a key, it's convenient that the dname_lf ends on a fixed offset.
  * Convention: the end here is before the final '\0' byte (if any). */
index 00d3bce8a4071200b676494dfd3b9f038bc27550..fc5ff1f51035f20479b99c352999cda4b3ae3e77 100644 (file)
@@ -210,7 +210,7 @@ static void process_record(zs_scanner_t *s)
 
 int kr_rule_zonefile(const struct kr_rule_zonefile_config *c)
 {
-       kr_require(c && the_rules);
+       ENSURE_the_rules;
        zs_scanner_t s_storage, *s = &s_storage;
        /* zs_init(), zs_set_input_file(), zs_set_processing() returns -1 in case of error,
         * so don't print error code as it meaningless. */