]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Don't do qname minimization when forwarding; Avoid some intermittent errors in qmin...
authorWitold Kręcicki <wpk@isc.org>
Mon, 29 Oct 2018 14:25:19 +0000 (14:25 +0000)
committerWitold Kręcicki <wpk@isc.org>
Mon, 29 Oct 2018 19:22:10 +0000 (19:22 +0000)
bin/tests/system/qmin/clean.sh
bin/tests/system/qmin/tests.sh
lib/dns/resolver.c

index 55a4fa8d3567825625bb59f36bb2a0eafc1bbaab..b9a26ebd3cb0a81204a9ead1c3e5a8f5e4ad4e3f 100644 (file)
@@ -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
index ee2e25319539074cee434b8453ee5d0d094e092d..aa333a0a72900078edc7f0dd45688494c30a012c 100755 (executable)
@@ -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
index 06ad322a273ff1f52c1b40d17628ea59baa7d7e7..08898f5d32ef1e8ee1c57666a3fc1def6b08dd7b 100644 (file)
@@ -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);