]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Optimize the slabheader placement for certain RRTypes
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:46:19 +0000 (09:46 +0100)
Mark the infrastructure RRTypes as "priority" types and place them at
the beginning of the rdataslab header data graph.  The non-priority
types either go right after the priority types (if any).

(cherry picked from commit 3ac482be7fd058d284e89873021339579fad0615)

lib/dns/rbtdb.c

index bab35e4eaaa01027c9cf0d8fc2e99406e66a3e5b..180bf435e15c00edc81554af596203080d388ab2 100644 (file)
@@ -1164,6 +1164,30 @@ set_ttl(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, dns_ttl_t newttl) {
                isc_heap_decreased(heap, header->heap_index);
 }
 
+static bool
+prio_type(rbtdb_rdatatype_t type) {
+       switch (type) {
+       case dns_rdatatype_soa:
+       case RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_soa):
+       case dns_rdatatype_a:
+       case RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_a):
+       case dns_rdatatype_aaaa:
+       case RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_aaaa):
+       case dns_rdatatype_nsec:
+       case RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_nsec):
+       case dns_rdatatype_nsec3:
+       case RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_nsec3):
+       case dns_rdatatype_ns:
+       case RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_ns):
+       case dns_rdatatype_ds:
+       case RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_ds):
+       case dns_rdatatype_cname:
+       case RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_cname):
+               return (true);
+       }
+       return (false);
+}
+
 /*%
  * These functions allow the heap code to rank the priority of each
  * element.  It returns true if v1 happens "sooner" than v2.
@@ -6180,6 +6204,7 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
 {
        rbtdb_changed_t *changed = NULL;
        rdatasetheader_t *topheader, *topheader_prev, *header, *sigheader;
+       rdatasetheader_t *prioheader = NULL;
        unsigned char *merged;
        isc_result_t result;
        bool header_nx;
@@ -6321,6 +6346,9 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
        for (topheader = rbtnode->data;
             topheader != NULL;
             topheader = topheader->next) {
+               if (prio_type(topheader->type)) {
+                       prioheader = topheader;
+               }
                if (topheader->type == newheader->type ||
                    topheader->type == negtype)
                        break;
@@ -6676,9 +6704,21 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
                        /*
                         * No rdatasets of the given type exist at the node.
                         */
-                       newheader->next = rbtnode->data;
                        newheader->down = NULL;
-                       rbtnode->data = newheader;
+
+                       if (prio_type(newheader->type)) {
+                               /* This is a priority type, prepend it */
+                               newheader->next = rbtnode->data;
+                               rbtnode->data = newheader;
+                       } else if (prioheader != NULL) {
+                               /* Append after the priority headers */
+                               newheader->next = prioheader->next;
+                               prioheader->next = newheader;
+                       } else {
+                               /* There were no priority headers */
+                               newheader->next = rbtnode->data;
+                               rbtnode->data = newheader;
+                       }
                }
        }