]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix rndc dumpdb -expired for stuck cache contents
authorMatthijs Mekking <matthijs@isc.org>
Wed, 20 Jul 2022 09:22:01 +0000 (11:22 +0200)
committerMatthijs Mekking <matthijs@isc.org>
Mon, 25 Jul 2022 14:28:18 +0000 (16:28 +0200)
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.

(cherry picked from commit 930ba2c914a0abc07fd087d663a7bfb57850d4ca)

lib/dns/rbtdb.c

index 29dce2ed0213c8501920633f7fa94863d406bfb0..d5b542aaa45d45ba3584f9ede74424f8d460aeec 100644 (file)
@@ -8670,15 +8670,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,
@@ -8690,19 +8685,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 +
-                                                    rbtdb->serve_stale_ttl))
-                               {
+                               if (NONEXISTENT(header)) {
                                        header = NULL;
                                }
                                break;
@@ -8734,22 +8719,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,
@@ -8775,17 +8755,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;