mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-09 03:02:05 -04:00
Merge branch '3603-resolver-prefetch-eligibility-edge-case-bug-v9_18' into 'v9_18'
[v9_18] Synchronize prefetch "trigger" and "eligibility" code and documentation See merge request isc-projects/bind9!6969
This commit is contained in:
commit
65467dfcff
6 changed files with 38 additions and 31 deletions
5
CHANGES
5
CHANGES
|
|
@ -1,3 +1,8 @@
|
|||
6002. [bug] Fix a resolver prefetch bug when the record's TTL value
|
||||
is equal to the configured prefetch eligibility value,
|
||||
but the record was erroneously not treated as eligible
|
||||
for prefetching. [GL #3603]
|
||||
|
||||
6001. [bug] Always call dns_adb_endudpfetch() after calling
|
||||
dns_adb_beginudpfetch() for UDP queries in resolver.c,
|
||||
in order to adjust back the quota. [GL #3598]
|
||||
|
|
|
|||
|
|
@ -4063,6 +4063,8 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config,
|
|||
const cfg_obj_t *zonelist;
|
||||
const cfg_obj_t *dlzlist;
|
||||
const cfg_obj_t *dlz;
|
||||
const cfg_obj_t *prefetch_trigger;
|
||||
const cfg_obj_t *prefetch_eligible;
|
||||
unsigned int dlzargc;
|
||||
char **dlzargv;
|
||||
const cfg_obj_t *dyndb_list, *plugin_list;
|
||||
|
|
@ -5570,33 +5572,29 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config,
|
|||
|
||||
obj = NULL;
|
||||
result = named_config_get(maps, "prefetch", &obj);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
const cfg_obj_t *trigger, *eligible;
|
||||
|
||||
trigger = cfg_tuple_get(obj, "trigger");
|
||||
view->prefetch_trigger = cfg_obj_asuint32(trigger);
|
||||
if (view->prefetch_trigger > 10) {
|
||||
view->prefetch_trigger = 10;
|
||||
}
|
||||
eligible = cfg_tuple_get(obj, "eligible");
|
||||
if (cfg_obj_isvoid(eligible)) {
|
||||
int m;
|
||||
for (m = 1; maps[m] != NULL; m++) {
|
||||
obj = NULL;
|
||||
result = named_config_get(&maps[m], "prefetch",
|
||||
&obj);
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
eligible = cfg_tuple_get(obj, "eligible");
|
||||
if (cfg_obj_isuint32(eligible)) {
|
||||
break;
|
||||
}
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
prefetch_trigger = cfg_tuple_get(obj, "trigger");
|
||||
view->prefetch_trigger = cfg_obj_asuint32(prefetch_trigger);
|
||||
if (view->prefetch_trigger > 10) {
|
||||
view->prefetch_trigger = 10;
|
||||
}
|
||||
prefetch_eligible = cfg_tuple_get(obj, "eligible");
|
||||
if (cfg_obj_isvoid(prefetch_eligible)) {
|
||||
int m;
|
||||
for (m = 1; maps[m] != NULL; m++) {
|
||||
obj = NULL;
|
||||
result = named_config_get(&maps[m], "prefetch", &obj);
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
prefetch_eligible = cfg_tuple_get(obj, "eligible");
|
||||
if (cfg_obj_isuint32(prefetch_eligible)) {
|
||||
break;
|
||||
}
|
||||
INSIST(cfg_obj_isuint32(eligible));
|
||||
}
|
||||
view->prefetch_eligible = cfg_obj_asuint32(eligible);
|
||||
if (view->prefetch_eligible < view->prefetch_trigger + 6) {
|
||||
view->prefetch_eligible = view->prefetch_trigger + 6;
|
||||
}
|
||||
INSIST(cfg_obj_isuint32(prefetch_eligible));
|
||||
}
|
||||
view->prefetch_eligible = cfg_obj_asuint32(prefetch_eligible);
|
||||
if (view->prefetch_eligible < view->prefetch_trigger + 6) {
|
||||
view->prefetch_eligible = view->prefetch_trigger + 6;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -21,9 +21,9 @@ $TTL 300
|
|||
ns A 10.53.0.4
|
||||
fetch.tld. NS ns.fetch.tld.
|
||||
ns.fetch.tld. A 10.53.0.6
|
||||
fetchall 10 TXT A short ttl
|
||||
fetchall 10 A 1.2.3.4
|
||||
fetchall 10 AAAA ::1
|
||||
fetchall 10 AAAA ::1
|
||||
fetchall 10 TXT A short ttl
|
||||
no-edns-version.tld. NS ns.no-edns-version.tld.
|
||||
ns.no-edns-version.tld. A 10.53.0.6
|
||||
edns-version.tld. NS ns.edns-version.tld.
|
||||
|
|
|
|||
|
|
@ -569,8 +569,12 @@ sleep "${ttl1:-0}"
|
|||
dig_with_opts @10.53.0.5 fetchall.tld any > dig.out.2.${n} || ret=1
|
||||
ttl2=$(awk '/"A" "short" "ttl"/ { print $2 }' dig.out.2.${n})
|
||||
sleep 1
|
||||
# check that the nameserver is still alive
|
||||
# check that prefetch occurred;
|
||||
# note that only one record is prefetched, which is the TXT record in this case,
|
||||
# because of the order of the records in the cache
|
||||
dig_with_opts @10.53.0.5 fetchall.tld any > dig.out.3.${n} || ret=1
|
||||
ttl3=$(awk '/"A" "short" "ttl"/ { print $2 }' dig.out.3.${n})
|
||||
test "${ttl3:-0}" -gt "${ttl2:-1}" || ret=1
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=$((status + ret))
|
||||
|
||||
|
|
|
|||
|
|
@ -4601,7 +4601,7 @@ Tuning
|
|||
|
||||
:any:`prefetch` specifies the "trigger" TTL value at which prefetch
|
||||
of the current query takes place; when a cache record with a
|
||||
lower TTL value is encountered during query processing, it is
|
||||
lower or equal TTL value is encountered during query processing, it is
|
||||
refreshed. Valid trigger TTL values are 1 to 10 seconds. Values
|
||||
larger than 10 seconds are silently reduced to 10. Setting a
|
||||
trigger TTL to zero causes prefetch to be disabled. The default
|
||||
|
|
|
|||
|
|
@ -6252,7 +6252,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_message_t *message,
|
|||
/*
|
||||
* Mark the rdataset as being prefetch eligible.
|
||||
*/
|
||||
if (rdataset->ttl > fctx->res->view->prefetch_eligible) {
|
||||
if (rdataset->ttl >= fctx->res->view->prefetch_eligible) {
|
||||
rdataset->attributes |= DNS_RDATASETATTR_PREFETCH;
|
||||
}
|
||||
|
||||
|
|
@ -6314,7 +6314,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_message_t *message,
|
|||
/*
|
||||
* Mark the rdataset as being prefetch eligible.
|
||||
*/
|
||||
if (rdataset->ttl > fctx->res->view->prefetch_eligible)
|
||||
if (rdataset->ttl >= fctx->res->view->prefetch_eligible)
|
||||
{
|
||||
rdataset->attributes |=
|
||||
DNS_RDATASETATTR_PREFETCH;
|
||||
|
|
|
|||
Loading…
Reference in a new issue