]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Extend dns_db_nodecount to access auxilary rbt node counts
authorMark Andrews <marka@isc.org>
Wed, 20 Oct 2021 01:01:00 +0000 (12:01 +1100)
committerPetr Špaček <pspacek@isc.org>
Thu, 2 Dec 2021 13:18:41 +0000 (14:18 +0100)
dns_db_nodecount can now be used to get counts from the auxilary
rbt databases.  The existing node count is returned by
tree=dns_dbtree_main.  The nsec and nsec3 node counts by dns_dbtree_nsec
and dns_dbtree_nsec3 respectively.

12 files changed:
bin/dnssec/dnssec-signzone.c
bin/named/server.c
bin/tests/system/dyndb/driver/db.c
lib/dns/cache.c
lib/dns/db.c
lib/dns/include/dns/db.h
lib/dns/include/dns/types.h
lib/dns/rbtdb.c
lib/dns/rpz.c
lib/dns/sdb.c
lib/dns/sdlz.c
lib/dns/zone.c

index 2e0d5e893c0353e889b611a3e57038938420024b..c1809d7dd5088f546af077c657ee5d612da50549 100644 (file)
@@ -3894,7 +3894,8 @@ main(int argc, char *argv[]) {
                bool answer;
 
                hash_length = dns_nsec3_hashlength(dns_hash_sha1);
-               hashlist_init(&hashlist, dns_db_nodecount(gdb) * 2,
+               hashlist_init(&hashlist,
+                             dns_db_nodecount(gdb, dns_dbtree_main) * 2,
                              hash_length);
                result = dns_nsec_nseconly(gdb, gversion, &answer);
                if (result == ISC_R_NOTFOUND) {
index b2d47186228e0fdcfc07b57b367fd76918945182..ac8bc553a230a125388496c2565012a93c750ef2 100644 (file)
@@ -15367,7 +15367,7 @@ named_server_zonestatus(named_server_t *server, isc_lex_t *lex,
        }
 
        /* Database node count */
-       nodes = dns_db_nodecount(hasraw ? rawdb : db);
+       nodes = dns_db_nodecount(hasraw ? rawdb : db, dns_dbtree_main);
        snprintf(nodebuf, sizeof(nodebuf), "%u", nodes);
 
        /* Security */
index ab52f67a0c84b70a604da505172c0bb65cfab0b4..9601c877c4ad13973693b833107984bb4a1e62c6 100644 (file)
@@ -361,12 +361,12 @@ issecure(dns_db_t *db) {
 }
 
 static unsigned int
-nodecount(dns_db_t *db) {
+nodecount(dns_db_t *db, dns_dbtree_t tree) {
        sampledb_t *sampledb = (sampledb_t *)db;
 
        REQUIRE(VALID_SAMPLEDB(sampledb));
 
-       return (dns_db_nodecount(sampledb->rbtdb));
+       return (dns_db_nodecount(sampledb->rbtdb, tree));
 }
 
 /*
index 41263bf25670f8ab16d764d05640e404c83ad45a..74d7df61ef9fe111efcfcd36942d4dfe2bd11b7f 100644 (file)
@@ -1260,7 +1260,7 @@ dns_cache_dumpstats(dns_cache_t *cache, FILE *fp) {
        fprintf(fp, "%20" PRIu64 " %s\n",
                values[dns_cachestatscounter_deletettl],
                "cache records deleted due to TTL expiration");
-       fprintf(fp, "%20u %s\n", dns_db_nodecount(cache->db),
+       fprintf(fp, "%20u %s\n", dns_db_nodecount(cache->db, dns_dbtree_main),
                "cache database nodes");
        fprintf(fp, "%20" PRIu64 " %s\n", (uint64_t)dns_db_hashsize(cache->db),
                "cache database hash buckets");
@@ -1327,7 +1327,8 @@ dns_cache_renderxml(dns_cache_t *cache, void *writer0) {
        TRY0(renderstat("DeleteTTL", values[dns_cachestatscounter_deletettl],
                        writer));
 
-       TRY0(renderstat("CacheNodes", dns_db_nodecount(cache->db), writer));
+       TRY0(renderstat("CacheNodes",
+                       dns_db_nodecount(cache->db, dns_dbtree_main), writer));
        TRY0(renderstat("CacheBuckets", dns_db_hashsize(cache->db), writer));
 
        TRY0(renderstat("TreeMemTotal", isc_mem_total(cache->mctx), writer));
@@ -1388,7 +1389,8 @@ dns_cache_renderjson(dns_cache_t *cache, void *cstats0) {
        CHECKMEM(obj);
        json_object_object_add(cstats, "DeleteTTL", obj);
 
-       obj = json_object_new_int64(dns_db_nodecount(cache->db));
+       obj = json_object_new_int64(
+               dns_db_nodecount(cache->db, dns_dbtree_main));
        CHECKMEM(obj);
        json_object_object_add(cstats, "CacheNodes", obj);
 
index b889d8f9029f8423e2c78d14ac0d2976c871c6cf..df9debc0f96ad8bfec4b19feac68a6999ba446ff 100644 (file)
@@ -807,10 +807,10 @@ freenode:
 }
 
 unsigned int
-dns_db_nodecount(dns_db_t *db) {
+dns_db_nodecount(dns_db_t *db, dns_dbtree_t tree) {
        REQUIRE(DNS_DB_VALID(db));
 
-       return ((db->methods->nodecount)(db));
+       return ((db->methods->nodecount)(db, tree));
 }
 
 size_t
index 4ed5a12778e1941398e463bced0c70cfb2d884e9..ae190b9a1b510f00237820b8c6e16b9c5ad0d7df 100644 (file)
@@ -134,7 +134,7 @@ typedef struct dns_dbmethods {
                                       dns_rdatatype_t  type,
                                       dns_rdatatype_t  covers);
        bool (*issecure)(dns_db_t *db);
-       unsigned int (*nodecount)(dns_db_t *db);
+       unsigned int (*nodecount)(dns_db_t *db, dns_dbtree_t);
        bool (*ispersistent)(dns_db_t *db);
        void (*overmem)(dns_db_t *db, bool overmem);
        void (*settask)(dns_db_t *db, isc_task_t *);
@@ -1349,9 +1349,9 @@ dns_db_overmem(dns_db_t *db, bool overmem);
  */
 
 unsigned int
-dns_db_nodecount(dns_db_t *db);
+dns_db_nodecount(dns_db_t *db, dns_dbtree_t tree);
 /*%<
- * Count the number of nodes in 'db'.
+ * Count the number of nodes in 'db' or its auxiliary trees.
  *
  * Requires:
  *
index 9a617e1b7f8be1911a89e5ff1f04e2be15d76f10..ee2e062b2c29cfeb57ee0f299e94a657457fc9ac 100644 (file)
@@ -179,6 +179,12 @@ typedef enum {
        dns_dbtype_stub = 3
 } dns_dbtype_t;
 
+typedef enum {
+       dns_dbtree_main = 0,
+       dns_dbtree_nsec = 1,
+       dns_dbtree_nsec3 = 2
+} dns_dbtree_t;
+
 typedef enum {
        dns_notifytype_no = 0,
        dns_notifytype_yes = 1,
index 70893ee0293b27deeb1405d599de91bf300fa007..a7e2a654b1ef09f1c6ea15a60bda96a96e33348f 100644 (file)
@@ -7580,7 +7580,7 @@ isdnssec(dns_db_t *db) {
 }
 
 static unsigned int
-nodecount(dns_db_t *db) {
+nodecount(dns_db_t *db, dns_dbtree_t tree) {
        dns_rbtdb_t *rbtdb;
        unsigned int count;
 
@@ -7589,7 +7589,20 @@ nodecount(dns_db_t *db) {
        REQUIRE(VALID_RBTDB(rbtdb));
 
        RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
-       count = dns_rbt_nodecount(rbtdb->tree);
+       switch (tree) {
+       case dns_dbtree_main:
+               count = dns_rbt_nodecount(rbtdb->tree);
+               break;
+       case dns_dbtree_nsec:
+               count = dns_rbt_nodecount(rbtdb->nsec);
+               break;
+       case dns_dbtree_nsec3:
+               count = dns_rbt_nodecount(rbtdb->nsec3);
+               break;
+       default:
+               INSIST(0);
+               ISC_UNREACHABLE();
+       }
        RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
 
        return (count);
index ffca94bc7a46e7301805a6b167ceac286ada3d17..eeb4c8ae0a2c4b5e5d143b6cb7a24c0433096b99 100644 (file)
@@ -1705,7 +1705,7 @@ setup_update(dns_rpz_zone_t *rpz) {
        isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_MASTER,
                      ISC_LOG_INFO, "rpz: %s: reload start", domain);
 
-       nodecount = dns_db_nodecount(rpz->updb);
+       nodecount = dns_db_nodecount(rpz->updb, dns_dbtree_main);
        hashsize = 1;
        while (nodecount != 0 &&
               hashsize <= (DNS_RPZ_HTSIZE_MAX + DNS_RPZ_HTSIZE_DIV)) {
index 1fcb0f54da0f167a28001aa8e1f2f294de481761..aeadeba3fb5dd3ec5a28ccd3d10e298c432c48ac 100644 (file)
@@ -1237,8 +1237,9 @@ issecure(dns_db_t *db) {
 }
 
 static unsigned int
-nodecount(dns_db_t *db) {
+nodecount(dns_db_t *db, dns_dbtree_t tree) {
        UNUSED(db);
+       UNUSED(tree);
 
        return (0);
 }
index 5eea5cb6b96f1077a8e7dc502b6992355cfa98b0..72fd9ffc7f762ce090c37653642963645b39e9d7 100644 (file)
@@ -1186,8 +1186,9 @@ issecure(dns_db_t *db) {
 }
 
 static unsigned int
-nodecount(dns_db_t *db) {
+nodecount(dns_db_t *db, dns_dbtree_t tree) {
        UNUSED(db);
+       UNUSED(tree);
 
        return (0);
 }
index 92d23558c5810d65796c36505c11f5a780485166..08112ac2b508f206729a6c3e070e9031fe1aa5ca 100644 (file)
@@ -4884,7 +4884,8 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
        }
 
        dns_zone_logc(zone, DNS_LOGCATEGORY_ZONELOAD, ISC_LOG_DEBUG(2),
-                     "number of nodes in database: %u", dns_db_nodecount(db));
+                     "number of nodes in database: %u",
+                     dns_db_nodecount(db, dns_dbtree_main));
 
        if (result == DNS_R_SEENINCLUDE) {
                DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_HASINCLUDE);