99 lines
3.3 KiB
Diff
99 lines
3.3 KiB
Diff
From 8ef414a7f38a04cfc11df44adaedaf3126fa3878 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= <ondrej@isc.org>
|
|
Date: Mon, 29 Jan 2024 16:36:30 +0100
|
|
Subject: [PATCH] Optimize the slabheader placement for certain RRTypes
|
|
|
|
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)
|
|
|
|
Conflict:NA
|
|
Reference:https://gitlab.isc.org/isc-projects/bind9/-/commit/8ef414a7f38a04cfc11df44adaedaf3126fa3878
|
|
|
|
---
|
|
lib/dns/rbtdb.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
|
|
1 file changed, 42 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c
|
|
index 7793be8..bc0f8d8 100644
|
|
--- a/lib/dns/rbtdb.c
|
|
+++ b/lib/dns/rbtdb.c
|
|
@@ -906,6 +906,30 @@ set_ttl(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, dns_ttl_t newttl) {
|
|
}
|
|
}
|
|
|
|
+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.
|
|
@@ -6167,6 +6191,7 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, const dns_name_t *nodename,
|
|
rbtdb_changed_t *changed = NULL;
|
|
rdatasetheader_t *topheader = NULL, *topheader_prev = NULL;
|
|
rdatasetheader_t *header = NULL, *sigheader = NULL;
|
|
+ rdatasetheader_t *prioheader = NULL;
|
|
unsigned char *merged = NULL;
|
|
isc_result_t result;
|
|
bool header_nx;
|
|
@@ -6313,6 +6338,9 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, const dns_name_t *nodename,
|
|
for (topheader = rbtnode->data; topheader != NULL;
|
|
topheader = topheader->next)
|
|
{
|
|
+ if (prio_type(topheader->type)) {
|
|
+ prioheader = topheader;
|
|
+ }
|
|
if (topheader->type == newheader->type ||
|
|
topheader->type == negtype)
|
|
{
|
|
@@ -6679,9 +6707,21 @@ find_header:
|
|
/*
|
|
* 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;
|
|
+ }
|
|
}
|
|
}
|
|
|
|
--
|
|
2.33.0
|
|
|