Improvements
------------
- cache garbage collector: reduce filesystem operations when idle (!946)
+- hints module: improve speed for large block-lists (!955)
Bugfixes
--------
- cache: missing filesystem support for pre-allocation is no longer fatal (#549)
+Incompatible changes
+--------------------
+- module API: kr_zonecut_add() takes another parameter (!955)
+
Knot Resolver 5.0.1 (2020-02-05)
================================
return;
}
if (zs->r_type == KNOT_RRTYPE_A || zs->r_type == KNOT_RRTYPE_AAAA) {
- kr_zonecut_add(hints, zs->r_owner, zs->r_data, zs->r_data_length);
+ kr_zonecut_add(hints, zs->r_owner, zs->r_data, zs->r_data_length, true);
}
}
const char* engine_hint_root_file(struct kr_context *ctx, const char *file)
int kr_ranked_rrarray_finalize(ranked_rr_array_t *, uint32_t, knot_mm_t *);
void kr_qflags_set(struct kr_qflags *, struct kr_qflags);
void kr_qflags_clear(struct kr_qflags *, struct kr_qflags);
-int kr_zonecut_add(struct kr_zonecut *, const knot_dname_t *, const void *, int);
+int kr_zonecut_add(struct kr_zonecut *, const knot_dname_t *, const void *, int, _Bool);
_Bool kr_zonecut_is_empty(struct kr_zonecut *);
void kr_zonecut_set(struct kr_zonecut *, const knot_dname_t *);
uint64_t kr_now();
"'%s': '%s'\n", name_str, addr_str);
return KR_STATE_CONSUME; /* Ignore invalid addresses */
}
- int ret = kr_zonecut_add(&query->zone_cut, rr->owner, rdata->data, rdata->len);
+ int ret = kr_zonecut_add(&query->zone_cut, rr->owner, rdata->data,
+ rdata->len, true);
if (ret != 0) {
return KR_STATE_FAIL;
}
}
continue;
}
- int ret = kr_zonecut_add(cut, ns_name, NULL, 0);
+ int ret = kr_zonecut_add(cut, ns_name, NULL, 0, true);
assert(!ret); (void)ret;
/* Choose when to use glue records. */
kr_zonecut_set(NULL, NULL);
kr_zonecut_set(&cut, NULL);
/* TODO triggerring inner assert:
- assert_int_not_equal(kr_zonecut_add(NULL, NULL, NULL, 0), 0);
+ assert_int_not_equal(kr_zonecut_add(NULL, NULL, NULL, 0, true), 0);
*/
assert_null((void *)kr_zonecut_find(NULL, NULL));
assert_null((void *)kr_zonecut_find(&cut, NULL));
const knot_dname_t
*n_1 = (const uint8_t *)"\4dead",
*n_2 = (const uint8_t *)"\3bee\1f";
- assert_int_equal(kr_zonecut_add(&cut1, n_1, NULL, 0), 0);
- assert_int_equal(kr_zonecut_add(&cut1, n_2, NULL, 0), 0);
+ assert_int_equal(kr_zonecut_add(&cut1, n_1, NULL, 0, true), 0);
+ assert_int_equal(kr_zonecut_add(&cut1, n_2, NULL, 0, true), 0);
/* Copy */
assert_int_equal(kr_zonecut_copy(&cut2, &cut1), 0);
/* Check if exist */
return kr_ok();
}
-int kr_zonecut_add(struct kr_zonecut *cut, const knot_dname_t *ns, const void *data, int len)
+int kr_zonecut_add(struct kr_zonecut *cut, const knot_dname_t *ns,
+ const void *data, int len, bool check_dup)
{
if (!cut || !ns || !cut->nsset || (data && len <= 0)) {
assert(!EINVAL);
return kr_ok();
}
/* Check for duplicates */
- if (pack_obj_find(*pack, data, len)) {
+ if (check_dup && pack_obj_find(*pack, data, len)) {
return kr_ok();
}
/* Push new address */
* @param ns nameserver name
* @param data typically knot_rdata_t::data
* @param len typically knot_rdata_t::len
+ * @param check_dup check for duplicates and return 0 without without adding in that case
* @return 0 or error code
*/
KR_EXPORT
-int kr_zonecut_add(struct kr_zonecut *cut, const knot_dname_t *ns, const void *data, int len);
+int kr_zonecut_add(struct kr_zonecut *cut, const knot_dname_t *ns,
+ const void *data, int len, bool check_dup);
/**
* Delete nameserver/address pair from the zone cut.
return kr_error(EINVAL);
}
- return kr_zonecut_add(hints, key, kr_inaddr(&ia.ip), kr_inaddr_len(&ia.ip));
+ return kr_zonecut_add(hints, key, kr_inaddr(&ia.ip), kr_inaddr_len(&ia.ip), false);
}
static int add_reverse_pair(struct kr_zonecut *hints, const char *name, const char *addr)
return kr_error(EINVAL);
}
- return kr_zonecut_add(hints, key, ptr_name, knot_dname_size(ptr_name));
+ return kr_zonecut_add(hints, key, ptr_name, knot_dname_size(ptr_name), false);
}
/** For a given name, remove either one address or all of them (if == NULL).
for dname, addrsets in pairs(nsset) do
for i = 0, addrsets:rdcount() - 1 do
local rdpt = addrsets:rdata_pt(i)
- ffi.C.kr_zonecut_add(roothints, dname, rdpt.data, rdpt.len)
+ ffi.C.kr_zonecut_add(roothints, dname, rdpt.data, rdpt.len, true)
end
end
end