Switch qpzone to rdatavec

Replaces rdataslab with rdatavec inside qpzone.c. This leads to a 19.92%
reduction of used memory across perflab workloads.
This commit is contained in:
Alessio Podda 2025-11-24 09:32:43 +01:00
parent f465976536
commit 4eb0b23efc
6 changed files with 259 additions and 309 deletions

View file

@ -17,6 +17,7 @@
#include <isc/urcu.h>
#include <dns/nsec3.h>
#include <dns/rdatavec.h>
#include <dns/types.h>
#ifdef STRONG_RWLOCK_CHECK
@ -97,7 +98,7 @@ struct dns_gluelist {
isc_mem_t *mctx;
const dns_dbversion_t *version;
dns_slabheader_t *header;
dns_vecheader_t *header;
struct dns_glue *glue;

View file

@ -87,7 +87,6 @@ struct dns_rdatasetmethods {
void (*getownercase)(const dns_rdataset_t *rdataset, dns_name_t *name);
isc_result_t (*addglue)(dns_rdataset_t *rdataset,
dns_dbversion_t *version, dns_message_t *msg);
dns_slabheader_t *(*getheader)(const dns_rdataset_t *rdataset);
};
#define DNS_RDATASET_MAGIC ISC_MAGIC('D', 'N', 'S', 'R')
@ -636,16 +635,6 @@ dns_trust_totext(dns_trust_t trust);
* Display trust in textual form.
*/
dns_slabheader_t *
dns_rdataset_getheader(const dns_rdataset_t *rdataset);
/*%<
* Return a pointer to the slabheader for a slab rdataset. If 'rdataset'
* is not a slab rdataset or if the slab is raw (lacking a header), return
* NULL.
*
* Requires:
* \li 'rdataset' is a valid rdataset.
*/
isc_stdtime_t
dns_rdataset_minresign(dns_rdataset_t *rdataset);

File diff suppressed because it is too large Load diff

View file

@ -588,17 +588,6 @@ dns_rdataset_trimttl(dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset,
sigrdataset->ttl = ttl;
}
dns_slabheader_t *
dns_rdataset_getheader(const dns_rdataset_t *rdataset) {
REQUIRE(DNS_RDATASET_VALID(rdataset));
if (rdataset->methods->getheader != NULL) {
return (rdataset->methods->getheader)(rdataset);
}
return NULL;
}
isc_stdtime_t
dns_rdataset_minresign(dns_rdataset_t *rdataset) {
dns_rdata_t rdata = DNS_RDATA_INIT;

View file

@ -92,7 +92,6 @@ dns_rdatasetmethods_t dns_rdataslab_rdatasetmethods = {
.expire = rdataset_expire,
.clearprefetch = rdataset_clearprefetch,
.getownercase = rdataset_getownercase,
.getheader = rdataset_getheader,
};
/*% Note: the "const void *" are just to make qsort happy. */
@ -126,7 +125,7 @@ makeslab(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
* new buffer.
*/
if (rdataset->methods == &dns_rdataslab_rdatasetmethods) {
dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_slabheader_t *header = rdataset_getheader(rdataset);
buflen = dns_rdataslab_size(header);
rawbuf = isc_mem_get(mctx, buflen);
@ -1120,7 +1119,7 @@ rdataset_getclosest(dns_rdataset_t *rdataset, dns_name_t *name,
static void
rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) {
dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_slabheader_t *header = rdataset_getheader(rdataset);
rdataset->trust = trust;
atomic_store(&header->trust, trust);
@ -1128,21 +1127,21 @@ rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) {
static void
rdataset_expire(dns_rdataset_t *rdataset DNS__DB_FLARG) {
dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_slabheader_t *header = rdataset_getheader(rdataset);
dns_db_expiredata(header->node, header);
}
static void
rdataset_clearprefetch(dns_rdataset_t *rdataset) {
dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_slabheader_t *header = rdataset_getheader(rdataset);
DNS_SLABHEADER_CLRATTR(header, DNS_SLABHEADERATTR_PREFETCH);
}
static void
rdataset_getownercase(const dns_rdataset_t *rdataset, dns_name_t *name) {
dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
dns_slabheader_t *header = rdataset_getheader(rdataset);
uint8_t mask = (1 << 7);
uint8_t bits = 0;

View file

@ -33,11 +33,11 @@
#include <dns/qp.h>
#include <dns/rdatalist.h>
#include <dns/rdataset.h>
#include <dns/rdataslab.h>
#include <dns/rdatavec.h>
#include <dns/rdatastruct.h>
#define KEEP_BEFORE
#include "rdataslab_p.h"
#include "rdatavec_p.h"
/* Include the main file */
@ -187,17 +187,16 @@ ownercase_test_one(const char *str1, const char *str2) {
.common.mctx = isc_g_mctx,
};
qpznode_t node = { .methods = &qpznode_methods, .locknum = 0 };
dns_slabheader_t header = {
dns_vecheader_t header = {
.node = (dns_dbnode_t *)&node,
};
unsigned char *raw = (unsigned char *)(&header) + sizeof(header);
dns_rdataset_t rdataset = {
.magic = DNS_RDATASET_MAGIC,
.slab = { .db = (dns_db_t *)qpdb,
.node = (dns_dbnode_t *)&node,
.raw = raw,
.vec = { .db = (dns_db_t *)qpdb,
.node = (dns_dbnode_t *)&node,
.header = &header,
},
.methods = &dns_rdataslab_rdatasetmethods,
.methods = &dns_rdatavec_rdatasetmethods,
};
isc_buffer_t b;
dns_fixedname_t fname1, fname2;
@ -216,7 +215,7 @@ ownercase_test_one(const char *str1, const char *str2) {
assert_int_equal(result, ISC_R_SUCCESS);
/* Store the case from name1 */
dns_slabheader_setownercase(&header, name1);
dns_vecheader_setownercase(&header, name1);
assert_true(CASESET(&header));
@ -361,17 +360,16 @@ ISC_RUN_TEST_IMPL(setownercase) {
.common.mctx = isc_g_mctx,
};
qpznode_t node = { .methods = &qpznode_methods, .locknum = 0 };
dns_slabheader_t header = {
dns_vecheader_t header = {
.node = (dns_dbnode_t *)&node,
};
unsigned char *raw = (unsigned char *)(&header) + sizeof(header);
dns_rdataset_t rdataset = {
.magic = DNS_RDATASET_MAGIC,
.slab = { .db = (dns_db_t *)qpdb,
.node = (dns_dbnode_t *)&node,
.raw = raw,
.vec = { .db = (dns_db_t *)qpdb,
.node = (dns_dbnode_t *)&node,
.header = &header,
},
.methods = &dns_rdataslab_rdatasetmethods,
.methods = &dns_rdatavec_rdatasetmethods,
};
const char *str1 =
"AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";