From: Matthijs Mekking Date: Wed, 20 Jul 2022 09:22:01 +0000 (+0200) Subject: Fix rndc dumpdb -expired for stuck cache contents X-Git-Tag: v9.19.4~11^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f8d866c6efa4c9c2726f8ebcf2e66122198576c4;p=thirdparty%2Fbind9.git Fix rndc dumpdb -expired for stuck cache contents The command 'rndc dumpdb -expired' will include expired RRsets in the output, but only for the RBTDB_VIRTUAL time (of 5 minutes). This means that if there is a cache cleaning problem and contents are not cleaned up, the rndc command has little diagnostic value. Fix this by including all RRsets in the dumpdb output if the '-expired' flag is set. --- diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 2fd789cdca1..f131902d367 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -8661,15 +8661,10 @@ rdatasetiter_first(dns_rdatasetiter_t *iterator) { dns_rbtnode_t *rbtnode = rbtiterator->common.node; rbtdb_version_t *rbtversion = rbtiterator->common.version; rdatasetheader_t *header, *top_next; - rbtdb_serial_t serial; - isc_stdtime_t now; + rbtdb_serial_t serial = 1; - if (IS_CACHE(rbtdb)) { - serial = 1; - now = rbtiterator->common.now; - } else { + if (!IS_CACHE(rbtdb)) { serial = rbtversion->serial; - now = 0; } NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, @@ -8681,19 +8676,9 @@ rdatasetiter_first(dns_rdatasetiter_t *iterator) { if (header->serial <= serial && !IGNORE(header)) { /* * Is this a "this rdataset doesn't exist" - * record? Or is it too old in the cache? - * - * Note: unlike everywhere else, we - * check for now > header->rdh_ttl instead - * of ">=". This allows ANY and RRSIG - * queries for 0 TTL rdatasets to work. + * record? */ - if (NONEXISTENT(header) || - (now != 0 && - (now - RBTDB_VIRTUAL) > - header->rdh_ttl + - STALE_TTL(header, rbtdb))) - { + if (NONEXISTENT(header)) { header = NULL; } break; @@ -8725,22 +8710,17 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator) { dns_rbtnode_t *rbtnode = rbtiterator->common.node; rbtdb_version_t *rbtversion = rbtiterator->common.version; rdatasetheader_t *header, *top_next; - rbtdb_serial_t serial; - isc_stdtime_t now; rbtdb_rdatatype_t type, negtype; dns_rdatatype_t rdtype, covers; + rbtdb_serial_t serial = 1; header = rbtiterator->current; if (header == NULL) { return (ISC_R_NOMORE); } - if (IS_CACHE(rbtdb)) { - serial = 1; - now = rbtiterator->common.now; - } else { + if (!IS_CACHE(rbtdb)) { serial = rbtversion->serial; - now = 0; } NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, @@ -8766,17 +8746,8 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator) { /* * Is this a "this rdataset doesn't * exist" record? - * - * Note: unlike everywhere else, we - * check for now > header->ttl instead - * of ">=". This allows ANY and RRSIG - * queries for 0 TTL rdatasets to work. */ - if (NONEXISTENT(header) || - (now != 0 && - (now - RBTDB_VIRTUAL) > - header->rdh_ttl)) - { + if (NONEXISTENT(header)) { header = NULL; } break;