]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Optimize cname_and_other_data to stop as earliest as possible
authorOndřej Surý <ondrej@isc.org>
Mon, 29 Jan 2024 15:36:30 +0000 (16:36 +0100)
committerOndřej Surý <ondrej@isc.org>
Thu, 8 Feb 2024 08:42:52 +0000 (09:42 +0100)
Stop the cname_and_other_data processing if we already know that the
result is true.  Also, we know that CNAME will be placed in the priority
headers, so we can stop looking for CNAME if we haven't found CNAME and
we are past the priority headers.

(cherry picked from commit 3f774c2a8ac46b2bbf1b3a4fa1d8d8c3ed3d78a9)

bin/tests/system/resolver/tests.sh
lib/dns/rbtdb.c

index a3b8afd2080a9a531d7ec1db7d6f882097cf7c8a..165cfea98b26f9e359713e5fb08933f7773e6299 100755 (executable)
@@ -604,10 +604,10 @@ 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 prefetch occurred;
-# note that only one record is prefetched, which is the TXT record in this case,
+# note that only one record is prefetched, which is the AAAA 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})
+ttl3=$(awk '/::1/ { 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))
index 85855148a35d11a0c066d9ba3f8c0a6eeb493d5a..93704a41719454e532c793101a65c11e1a367145 100644 (file)
@@ -6066,7 +6066,7 @@ allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
 static bool
 cname_and_other_data(dns_rbtnode_t *node, rbtdb_serial_t serial) {
        rdatasetheader_t *header, *header_next;
-       bool cname, other_data;
+       bool cname = false, other_data = false;
        dns_rdatatype_t rdtype;
 
        /*
@@ -6076,10 +6076,16 @@ cname_and_other_data(dns_rbtnode_t *node, rbtdb_serial_t serial) {
        /*
         * Look for CNAME and "other data" rdatasets active in our version.
         */
-       cname = false;
-       other_data = false;
        for (header = node->data; header != NULL; header = header_next) {
                header_next = header->next;
+               if (!prio_type(header->type)) {
+                       /*
+                        * CNAME is in the priority list, so if we are done
+                        * with the priority list, we know there will not be
+                        * CNAME, so we are safe to skip the rest of the types.
+                        */
+                       return (false);
+               }
                if (header->type == dns_rdatatype_cname) {
                        /*
                         * Look for an active extant CNAME.
@@ -6139,10 +6145,9 @@ cname_and_other_data(dns_rbtnode_t *node, rbtdb_serial_t serial) {
                                }
                        }
                }
-       }
-
-       if (cname && other_data) {
-               return (true);
+               if (cname && other_data) {
+                       return (true);
+               }
        }
 
        return (false);