From: Witold Kręcicki Date: Mon, 29 Oct 2018 14:25:19 +0000 (+0000) Subject: Don't do qname minimization when forwarding; Avoid some intermittent errors in qmin... X-Git-Tag: v9.13.4~75^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08460c8cb25cf34718ff5bd151d687b234a10145;p=thirdparty%2Fbind9.git Don't do qname minimization when forwarding; Avoid some intermittent errors in qmin tests caused by timing --- diff --git a/bin/tests/system/qmin/clean.sh b/bin/tests/system/qmin/clean.sh index 55a4fa8d356..b9a26ebd3cb 100644 --- a/bin/tests/system/qmin/clean.sh +++ b/bin/tests/system/qmin/clean.sh @@ -14,5 +14,5 @@ rm -f */named.memstats rm -f */named.run rm -f dig.out.* rm -f ns*/named.lock -rm -f ans*/query.log +rm -f ans*/query.log* rm -f query*.log diff --git a/bin/tests/system/qmin/tests.sh b/bin/tests/system/qmin/tests.sh index ee2e2531953..aa333a0a729 100755 --- a/bin/tests/system/qmin/tests.sh +++ b/bin/tests/system/qmin/tests.sh @@ -117,14 +117,16 @@ $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.6 > dig.out.test$n grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 grep "icky.icky.icky.ptang.zoop.boing.good. 1 IN A 192.0.2.1" dig.out.test$n > /dev/null || ret=1 sleep 1 -cat << __EOF | diff ans2/query.log - > /dev/null || ret=1 -NS good. -NS boing.good. -NS zoop.boing.good. -ADDR ns3.good. -ADDR ns3.good. +sort ans2/query.log > ans2/query.log.sorted +cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1 ADDR a.bit.longer.ns.name.good. ADDR a.bit.longer.ns.name.good. +ADDR ns2.good. +ADDR ns3.good. +ADDR ns3.good. +NS boing.good. +NS good. +NS zoop.boing.good. __EOF cat << __EOF | diff ans3/query.log - > /dev/null || ret=1 NS zoop.boing.good. @@ -151,6 +153,7 @@ sleep 1 cat << __EOF | diff ans2/query.log - > /dev/null || ret=1 NS bad. NS boing.bad. +ADDR ns2.bad. __EOF for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done if [ $ret != 0 ]; then echo_i "failed"; fi @@ -165,14 +168,16 @@ $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.7 > dig.out.test$n grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 grep "icky.icky.icky.ptang.zoop.boing.bad. 1 IN A 192.0.2.1" dig.out.test$n > /dev/null || ret=1 sleep 1 -cat << __EOF | diff ans2/query.log - > /dev/null || ret=1 -NS bad. -NS boing.bad. +sort ans2/query.log > ans2/query.log.sorted +cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1 +ADDR a.bit.longer.ns.name.bad. +ADDR a.bit.longer.ns.name.bad. ADDR icky.icky.icky.ptang.zoop.boing.bad. +ADDR ns2.bad. ADDR ns3.bad. ADDR ns3.bad. -ADDR a.bit.longer.ns.name.bad. -ADDR a.bit.longer.ns.name.bad. +NS bad. +NS boing.bad. __EOF echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | diff ans3/query.log - > /dev/null || ret=1 echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | diff ans4/query.log - > /dev/null || ret=1 @@ -188,10 +193,12 @@ $RNDCCMD 10.53.0.6 flush $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.6 > dig.out.test$n grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 sleep 1 -cat << __EOF | diff ans2/query.log - > /dev/null || ret=1 -NS ugly. +sort ans2/query.log > ans2/query.log.sorted +cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1 +ADDR ns2.ugly. NS boing.ugly. NS boing.ugly. +NS ugly. __EOF for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done if [ $ret != 0 ]; then echo_i "failed"; fi @@ -207,15 +214,17 @@ $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.7 > dig.out.test$n grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 grep "icky.icky.icky.ptang.zoop.boing.ugly. 1 IN A 192.0.2.1" dig.out.test$n > /dev/null || ret=1 sleep 1 -cat << __EOF | diff ans2/query.log - > /dev/null || ret=1 -NS ugly. -NS boing.ugly. -NS boing.ugly. +sort ans2/query.log > ans2/query.log.sorted +cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1 +ADDR a.bit.longer.ns.name.ugly. +ADDR a.bit.longer.ns.name.ugly. ADDR icky.icky.icky.ptang.zoop.boing.ugly. +ADDR ns2.ugly. ADDR ns3.ugly. ADDR ns3.ugly. -ADDR a.bit.longer.ns.name.ugly. -ADDR a.bit.longer.ns.name.ugly. +NS boing.ugly. +NS boing.ugly. +NS ugly. __EOF echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | diff ans3/query.log - > /dev/null || ret=1 echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | diff ans4/query.log - > /dev/null || ret=1 @@ -233,14 +242,16 @@ $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.slow. @10.53.0.6 > dig.out.test$n sleep 5 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 grep "icky.icky.icky.ptang.zoop.boing.slow. 1 IN A 192.0.2.1" dig.out.test$n > /dev/null || ret=1 -cat << __EOF | diff ans2/query.log - > /dev/null || ret=1 -NS slow. -NS boing.slow. -NS zoop.boing.slow. -ADDR ns3.slow. -ADDR ns3.slow. +sort ans2/query.log > ans2/query.log.sorted +cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1 ADDR a.bit.longer.ns.name.slow. ADDR a.bit.longer.ns.name.slow. +ADDR ns2.slow. +ADDR ns3.slow. +ADDR ns3.slow. +NS boing.slow. +NS slow. +NS zoop.boing.slow. __EOF cat << __EOF | diff ans3/query.log - > /dev/null || ret=1 NS zoop.boing.slow. @@ -265,7 +276,8 @@ $DIG $DIGOPTS -x 2001:4f8::1 @10.53.0.6 > dig.out.test$n grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 grep "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa. 1 IN PTR nee.com." dig.out.test$n > /dev/null || ret=1 sleep 1 -cat << __EOF | diff ans2/query.log - > /dev/null || ret=1 +grep -v ADDR ans2/query.log > ans2/query.log.trimmed +cat << __EOF | diff ans2/query.log.trimmed - > /dev/null || ret=1 NS 1.0.0.2.ip6.arpa. NS 8.f.4.0.1.0.0.2.ip6.arpa. NS 0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa. @@ -286,14 +298,16 @@ $DIG $DIGOPTS more.icky.icky.icky.ptang.zoop.boing.good. @10.53.0.6 > dig.out.te grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 grep "more.icky.icky.icky.ptang.zoop.boing.good. 1 IN A 192.0.2.2" dig.out.test$n > /dev/null || ret=1 sleep 1 -cat << __EOF | diff ans2/query.log - > /dev/null || ret=1 -NS good. -NS boing.good. -NS zoop.boing.good. -ADDR ns3.good. -ADDR ns3.good. +sort ans2/query.log > ans2/query.log.sorted +cat << __EOF | diff ans2/query.log.sorted - > /dev/null || ret=1 ADDR a.bit.longer.ns.name.good. ADDR a.bit.longer.ns.name.good. +ADDR ns2.good. +ADDR ns3.good. +ADDR ns3.good. +NS boing.good. +NS good. +NS zoop.boing.good. __EOF cat << __EOF | diff ans3/query.log - > /dev/null || ret=1 NS zoop.boing.good. @@ -320,8 +334,7 @@ grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 grep "a.bit.longer.ns.name.fwd. 1 IN A 10.53.0.4" dig.out.test$n >/dev/null || ret=1 sleep 1 cat << __EOF | diff ans2/query.log - > /dev/null || ret=1 -NS fwd. -ADDR a.bit.longer.ns.name.good. +ADDR a.bit.longer.ns.name.fwd. __EOF for ans in ans2; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done if [ $ret != 0 ]; then echo_i "failed"; fi diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 06ad322a273..08898f5d32e 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -311,6 +311,7 @@ struct fetchctx { bool minimized; unsigned int qmin_labels; bool ip6arpaskip; + bool forwarding; dns_name_t qminname; dns_rdatatype_t qmintype; dns_fetch_t * qminfetch; @@ -3799,6 +3800,7 @@ fctx_nextaddress(fetchctx_t *fctx) { if (UNMARKED(addrinfo)) { addrinfo->flags |= FCTX_ADDRINFO_MARK; fctx->find = NULL; + fctx->forwarding = true; return (addrinfo); } } @@ -3806,7 +3808,7 @@ fctx_nextaddress(fetchctx_t *fctx) { /* * No forwarders. Move to the next find. */ - + fctx->forwarding = false; fctx->attributes |= FCTX_ATTR_TRIEDFIND; find = fctx->find; @@ -3947,31 +3949,6 @@ fctx_try(fetchctx_t *fctx, bool retrying, bool badcache) { return; } - /* - * We're minimizing and we're not yet at the final NS - - * we need to launch a query for NS for 'upper' domain - */ - if (fctx->minimized) { - unsigned int options = fctx->options; - options &= ~DNS_FETCHOPT_QMINIMIZE; - fctx_increference(fctx); - task = res->buckets[bucketnum].task; - result = dns_resolver_createfetch(fctx->res, &fctx->qminname, - fctx->qmintype, &fctx->domain, - &fctx->nameservers, NULL, NULL, 0, - options, 0, fctx->qc, task, - resume_qmin, fctx, - &fctx->qminrrset, NULL, - &fctx->qminfetch); - if (result != ISC_R_SUCCESS) { - LOCK(&fctx->res->buckets[fctx->bucketnum].lock); - RUNTIME_CHECK(!fctx_decreference(fctx)); - UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock); - fctx_done(fctx, DNS_R_SERVFAIL, __LINE__); - } - return; - } - addrinfo = fctx_nextaddress(fctx); /* Try to find an address that isn't over quota */ @@ -4013,6 +3990,30 @@ fctx_try(fetchctx_t *fctx, bool retrying, bool badcache) { return; } } + /* + * We're minimizing and we're not yet at the final NS - + * we need to launch a query for NS for 'upper' domain + */ + if (fctx->minimized && !fctx->forwarding) { + unsigned int options = fctx->options; + options &= ~DNS_FETCHOPT_QMINIMIZE; + fctx_increference(fctx); + task = res->buckets[bucketnum].task; + result = dns_resolver_createfetch(fctx->res, &fctx->qminname, + fctx->qmintype, &fctx->domain, + &fctx->nameservers, NULL, NULL, 0, + options, 0, fctx->qc, task, + resume_qmin, fctx, + &fctx->qminrrset, NULL, + &fctx->qminfetch); + if (result != ISC_R_SUCCESS) { + LOCK(&fctx->res->buckets[fctx->bucketnum].lock); + RUNTIME_CHECK(!fctx_decreference(fctx)); + UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock); + fctx_done(fctx, DNS_R_SERVFAIL, __LINE__); + } + return; + } if (dns_name_countlabels(&fctx->domain) > 2) { result = isc_counter_increment(fctx->qc); @@ -4659,6 +4660,7 @@ fctx_create(dns_resolver_t *res, const dns_name_t *name, dns_rdatatype_t type, fctx->depth = depth; fctx->minimized = false; fctx->ip6arpaskip = false; + fctx->forwarding = false; fctx->qmin_labels = 1; fctx->qminfetch = NULL; dns_rdataset_init(&fctx->qminrrset);