2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 22:45:39 +00:00

Start ncache support

This commit is contained in:
Bob Halley
1999-10-15 20:51:38 +00:00
parent 9ad0ebf65e
commit ad6a3ba5ef

View File

@@ -80,6 +80,8 @@ typedef isc_uint32_t rbtdb_rdatatype_t;
RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, dns_rdatatype_ns) RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, dns_rdatatype_ns)
#define RBTDB_RDATATYPE_SIGCNAME \ #define RBTDB_RDATATYPE_SIGCNAME \
RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, dns_rdatatype_cname) RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, dns_rdatatype_cname)
#define RBTDB_RDATATYPE_NXDOMAIN \
RBTDB_RDATATYPE_VALUE(0, dns_rdatatype_any)
typedef struct rdatasetheader { typedef struct rdatasetheader {
/* /*
@@ -2212,11 +2214,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
rdatasetheader_t *header, *header_prev, *header_next; rdatasetheader_t *header, *header_prev, *header_next;
rdatasetheader_t *found, *nsheader; rdatasetheader_t *found, *nsheader;
rdatasetheader_t *foundsig, *nssig, *cnamesig; rdatasetheader_t *foundsig, *nssig, *cnamesig;
rbtdb_rdatatype_t sigtype; rbtdb_rdatatype_t sigtype, nxtype;
/*
* XXXRTH Currently this code has no support for negative caching.
*/
search.rbtdb = (dns_rbtdb_t *)db; search.rbtdb = (dns_rbtdb_t *)db;
@@ -2287,6 +2285,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
found = NULL; found = NULL;
foundsig = NULL; foundsig = NULL;
sigtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, type); sigtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, type);
nxtype = RBTDB_RDATATYPE_VALUE(0, type);
nsheader = NULL; nsheader = NULL;
nssig = NULL; nssig = NULL;
cnamesig = NULL; cnamesig = NULL;
@@ -2350,6 +2349,12 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
* target type. Remember it. * target type. Remember it.
*/ */
foundsig = header; foundsig = header;
} else if (header->type == RBTDB_RDATATYPE_NXDOMAIN ||
header->type == nxtype) {
/*
* We've found a negative cache entry.
*/
found = header;
} else if (header->type == dns_rdatatype_ns) { } else if (header->type == dns_rdatatype_ns) {
/* /*
* Remember a NS rdataset even if we're * Remember a NS rdataset even if we're
@@ -2422,7 +2427,15 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
*nodep = node; *nodep = node;
} }
if (type != found->type && if (RBTDB_RDATATYPE_BASE(found->type) == 0) {
/*
* We found a negative cache entry.
*/
if (found->type == RBTDB_RDATATYPE_NXDOMAIN)
result = DNS_R_NCACHENXDOMAIN;
else
result = DNS_R_NCACHENXRRSET;
} else if (type != found->type &&
type != dns_rdatatype_any && type != dns_rdatatype_any &&
found->type == dns_rdatatype_cname) { found->type == dns_rdatatype_cname) {
/* /*
@@ -2696,13 +2709,16 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node;
rdatasetheader_t *header, *header_next, *found, *foundsig; rdatasetheader_t *header, *header_next, *found, *foundsig;
rbtdb_rdatatype_t matchtype, sigmatchtype; rbtdb_rdatatype_t matchtype, sigmatchtype, nxtype;
isc_result_t result;
REQUIRE(VALID_RBTDB(rbtdb)); REQUIRE(VALID_RBTDB(rbtdb));
REQUIRE(type != dns_rdatatype_any); REQUIRE(type != dns_rdatatype_any);
version = NULL; /* Keep compilers quiet. */ version = NULL; /* Keep compilers quiet. */
result = ISC_R_SUCCESS;
if (now == 0 && isc_stdtime_get(&now) != ISC_R_SUCCESS) { if (now == 0 && isc_stdtime_get(&now) != ISC_R_SUCCESS) {
/* /*
* We don't need to call UNEXPECTED_ERROR() because * We don't need to call UNEXPECTED_ERROR() because
@@ -2716,6 +2732,7 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
found = NULL; found = NULL;
foundsig = NULL; foundsig = NULL;
matchtype = RBTDB_RDATATYPE_VALUE(type, covers); matchtype = RBTDB_RDATATYPE_VALUE(type, covers);
nxtype = RBTDB_RDATATYPE_VALUE(0, type);
if (covers == 0) if (covers == 0)
sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, type); sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_sig, type);
else else
@@ -2732,13 +2749,14 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
*/ */
header->attributes |= RDATASET_ATTR_STALE; header->attributes |= RDATASET_ATTR_STALE;
rbtnode->dirty = 1; rbtnode->dirty = 1;
} else if (header->type == matchtype && } else if ((header->attributes & RDATASET_ATTR_NONEXISTENT) ==
(header->attributes & RDATASET_ATTR_NONEXISTENT) ==
0) { 0) {
if (header->type == matchtype)
found = header; found = header;
} else if (header->type == sigmatchtype && else if (header->type == RBTDB_RDATATYPE_NXDOMAIN ||
(header->attributes & RDATASET_ATTR_NONEXISTENT) == header->type == nxtype)
0) { found = header;
else if (header->type == sigmatchtype)
foundsig = header; foundsig = header;
} }
} }
@@ -2754,7 +2772,17 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
if (found == NULL) if (found == NULL)
return (DNS_R_NOTFOUND); return (DNS_R_NOTFOUND);
return (DNS_R_SUCCESS); if (RBTDB_RDATATYPE_BASE(found->type) == 0) {
/*
* We found a negative cache entry.
*/
if (found->type == RBTDB_RDATATYPE_NXDOMAIN)
result = DNS_R_NCACHENXDOMAIN;
else
result = DNS_R_NCACHENXRRSET;
}
return (result);
} }
static dns_result_t static dns_result_t
@@ -2829,6 +2857,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
isc_boolean_t force = ISC_FALSE; isc_boolean_t force = ISC_FALSE;
isc_boolean_t header_nx; isc_boolean_t header_nx;
isc_boolean_t newheader_nx; isc_boolean_t newheader_nx;
dns_rdatatype_t nxtype;
/* /*
* Add an rdatasetheader_t to a node. * Add an rdatasetheader_t to a node.
@@ -2853,14 +2882,51 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
newheader_nx = NONEXISTENT(newheader) ? ISC_TRUE : ISC_FALSE; newheader_nx = NONEXISTENT(newheader) ? ISC_TRUE : ISC_FALSE;
nxtype = 0;
#ifdef notyet
if (rbtversion == NULL) {
if (RBTDB_RDATASET_BASE(newheader->type) == 0
&& !newheader_nx) {
/*
* We're adding a negative cache entry.
*/
if (RBTDB_RDATASET_EXT(newheader->type) ==
dns_rdatatype_any) {
/*
* We're adding an NXDOMAIN negative cache
* entry.
*
* We make all other data stale so that the
* only rdataset that can be found at this
* node is the NXDOMAIN negative cache entry.
*/
for (topheader = rbtnode->data;
topheader != NULL;
topheader = topheader->next) {
topheader->ttl = 0;
topheader->attributes |=
RDATASET_ATTR_STALE;
}
rbtnode->dirty = 1;
goto find_header;
}
nxtype = ;
}
}
#endif
topheader_prev = NULL; topheader_prev = NULL;
for (topheader = rbtnode->data; for (topheader = rbtnode->data;
topheader != NULL; topheader != NULL;
topheader = topheader->next) { topheader = topheader->next) {
if (topheader->type == newheader->type) if (topheader->type == newheader->type ||
topheader->type == nxtype)
break; break;
topheader_prev = topheader; topheader_prev = topheader;
} }
#ifdef notyet
find_header:
#endif
/* /*
* If header isn't NULL, we've found the right type. There may be * If header isn't NULL, we've found the right type. There may be
* IGNORE rdatasets between the top of the chain and the first real * IGNORE rdatasets between the top of the chain and the first real