It seems such an edge case that I chose to avoid the issue this way.
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_rules_commit(_Bool);
int kr_view_insert_action(const char *, const char *, kr_proto_set, 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 *);
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_rules_commit(_Bool);
int kr_view_insert_action(const char *, const char *, kr_proto_set, 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 *);
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_rules_commit(_Bool);
int kr_view_insert_action(const char *, const char *, kr_proto_set, 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 *);
packet_ttl
# New policy
kr_rules_init
+ kr_rules_commit
kr_view_insert_action
kr_view_select_action
kr_rule_tag_add
KR_EXPORT
void kr_rules_deinit(void);
-/** Commit or abort changes done to the rule DB so far. */
+/** Commit or abort changes done to the rule DB so far.
+ *
+ * Normally commit happens only on successfully loading a config file.
+ * However, an advanced user may get in trouble e.g. if calling resolve() from there,
+ * causing even an assertion failure. In that case they might want to commit explicitly.
+ */
KR_EXPORT
int kr_rules_commit(bool accept);
-- SPDX-License-Identifier: GPL-3.0-or-later
local utils = require('test_utils')
+local C = require('ffi').C
-- setup resolver
modules = { 'hints > iterate' }
hints.config() -- clean start
hints.use_nodata(false)
hints.add_hosts('hints.test.hosts')
+ -- We commit manually, as in these tests we query before loading config finishes.
+ C.kr_rules_commit(true)
+
-- TODO: prefilling or some other way of getting NXDOMAIN (instead of SERVFAIL)
utils.check_answer('bad name gives NXDOMAIN',
'badname.lan', kres.type.A, kres.rcode.SERVFAIL)
hints.config() -- clean start
hints.use_nodata(true) -- default ATM but let's not depend on that
hints['myname.lan'] = '2001:db8::1'
+ C.kr_rules_commit(true)
utils.check_answer('another type gives NODATA',
'myname.lan', kres.type.MX, utils.NODATA)
utils.check_answer('record itself is OK',