diff --git a/CHANGES b/CHANGES
index 05502d8a3b..94a5158743 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+4144. [func] Add statistics counters for nxdomain redirections.
+ [RT #39790]
+
4143. [placeholder]
4142. [bug] rndc addzone with view specified saved NZF config
diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h
index b19055d62d..8d9c9bab4c 100644
--- a/bin/named/include/named/server.h
+++ b/bin/named/include/named/server.h
@@ -187,17 +187,20 @@ enum {
dns_nsstatscounter_otheropt = 45,
dns_nsstatscounter_ecsopt = 46,
-#ifdef ISC_PLATFORM_USESIT
- dns_nsstatscounter_sitopt = 47,
- dns_nsstatscounter_sitbadsize = 48,
- dns_nsstatscounter_sitbadtime = 49,
- dns_nsstatscounter_sitnomatch = 50,
- dns_nsstatscounter_sitmatch = 51,
- dns_nsstatscounter_sitnew = 52,
+ dns_nsstatscounter_nxdomainredirect = 47,
+ dns_nsstatscounter_nxdomainredirect_rlookup = 48,
- dns_nsstatscounter_max = 53
+#ifdef ISC_PLATFORM_USESIT
+ dns_nsstatscounter_sitopt = 49,
+ dns_nsstatscounter_sitbadsize = 50,
+ dns_nsstatscounter_sitbadtime = 51,
+ dns_nsstatscounter_sitnomatch = 52,
+ dns_nsstatscounter_sitmatch = 53,
+ dns_nsstatscounter_sitnew = 54,
+
+ dns_nsstatscounter_max = 55
#else
- dns_nsstatscounter_max = 47
+ dns_nsstatscounter_max = 49
#endif
};
diff --git a/bin/named/query.c b/bin/named/query.c
index e686b51b34..cae6f3ffff 100644
--- a/bin/named/query.c
+++ b/bin/named/query.c
@@ -7646,8 +7646,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
if (!empty_wild) {
tresult = redirect(client, fname, rdataset, &node,
&db, &version, type);
- if (tresult == ISC_R_SUCCESS)
+ if (tresult == ISC_R_SUCCESS) {
+ inc_stats(client,
+ dns_nsstatscounter_nxdomainredirect);
break;
+ }
if (tresult == DNS_R_NXRRSET) {
redirected = ISC_TRUE;
goto iszone_nxrrset;
@@ -7660,6 +7663,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
tresult = redirect2(client, fname, rdataset, &node,
&db, &version, type);
if (tresult == DNS_R_CONTINUE) {
+ inc_stats(client,
+ dns_nsstatscounter_nxdomainredirect_rlookup);
client->query.redirect.qtype = qtype;
client->query.redirect.rdataset = rdataset;
client->query.redirect.sigrdataset =
@@ -7680,8 +7685,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
sigrdataset = NULL;
goto cleanup;
}
- if (tresult == ISC_R_SUCCESS)
+ if (tresult == ISC_R_SUCCESS) {
+ inc_stats(client,
+ dns_nsstatscounter_nxdomainredirect);
break;
+ }
if (tresult == DNS_R_NXRRSET) {
redirected = ISC_TRUE;
goto iszone_nxrrset;
@@ -7756,8 +7764,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
case DNS_R_NCACHENXDOMAIN:
tresult = redirect(client, fname, rdataset, &node,
&db, &version, type);
- if (tresult == ISC_R_SUCCESS)
+ if (tresult == ISC_R_SUCCESS) {
+ inc_stats(client,
+ dns_nsstatscounter_nxdomainredirect);
break;
+ }
if (tresult == DNS_R_NXRRSET) {
redirected = ISC_TRUE;
is_zone = ISC_TRUE;
@@ -7771,6 +7782,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
tresult = redirect2(client, fname, rdataset, &node,
&db, &version, type);
if (tresult == DNS_R_CONTINUE) {
+ inc_stats(client,
+ dns_nsstatscounter_nxdomainredirect_rlookup);
client->query.redirect.db = db;
client->query.redirect.node = node;
client->query.redirect.zone = zone;
@@ -7787,8 +7800,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
sigrdataset = NULL;
goto cleanup;
}
- if (tresult == ISC_R_SUCCESS)
+ if (tresult == ISC_R_SUCCESS) {
+ inc_stats(client,
+ dns_nsstatscounter_nxdomainredirect);
break;
+ }
if (tresult == DNS_R_NXRRSET) {
redirected = ISC_TRUE;
is_zone = ISC_TRUE;
diff --git a/bin/named/statschannel.c b/bin/named/statschannel.c
index 2b4ffbb88b..d8f8ef625c 100644
--- a/bin/named/statschannel.c
+++ b/bin/named/statschannel.c
@@ -238,6 +238,13 @@ init_desc(void) {
SET_NSSTATDESC(sitmatch, "source identity token - match", "SitMatch");
#endif
SET_NSSTATDESC(ecsopt, "EDNS client subnet option recieved", "ECSOpt");
+ SET_NSSTATDESC(nxdomainredirect,
+ "queries resulted in NXDOMAIN that were redirected",
+ "QryNXRedir");
+ SET_NSSTATDESC(nxdomainredirect_rlookup,
+ "queries resulted in NXDOMAIN that were redirected and "
+ "resulted in a successful remote lookup",
+ "QryNXRedirRLookup");
INSIST(i == dns_nsstatscounter_max);
/* Initialize resolver statistics */
diff --git a/bin/tests/system/redirect/tests.sh b/bin/tests/system/redirect/tests.sh
index 7948415f21..38c47f95d3 100644
--- a/bin/tests/system/redirect/tests.sh
+++ b/bin/tests/system/redirect/tests.sh
@@ -55,6 +55,20 @@ n=`expr $n + 1`
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
+echo "I:checking A zone redirect updates statistics ($n)"
+ret=0
+rm ns2/named.stats 2>/dev/null
+$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 stats || ret=1
+PRE=`sed -n -e "s/[ ]*\([0-9]*\).queries resulted in NXDOMAIN that were redirected$/\1/p" ns2/named.stats`
+$DIG $DIGOPTS nonexist. @10.53.0.2 -b 10.53.0.2 a > dig.out.ns2.test$n || ret=1
+rm ns2/named.stats 2>/dev/null
+$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 stats || ret=1
+POST=`sed -n -e "s/[ ]*\([0-9]*\).queries resulted in NXDOMAIN that were redirected$/\1/p" ns2/named.stats`
+if [ `expr $POST - $PRE` != 1 ]; then ret=1; fi
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
echo "I:checking AAAA zone redirect works for nonexist ($n)"
ret=0
$DIG $DIGOPTS nonexist. @10.53.0.2 -b 10.53.0.2 aaaa > dig.out.ns2.test$n || ret=1
@@ -374,6 +388,10 @@ status=`expr $status + $ret`
echo "I:checking AAAA nxdomain-redirect works for nonexist ($n)"
ret=0
+rm ns4/named.stats 2>/dev/null
+$RNDC -c ../common/rndc.conf -s 10.53.0.4 -p 9953 stats || ret=1
+PRE_RED=`sed -n -e "s/[ ]*\([0-9]*\).queries resulted in NXDOMAIN that were redirected$/\1/p" ns4/named.stats`
+PRE_SUC=`sed -n -e "s/[ ]*\([0-9]*\).queries resulted in NXDOMAIN that were redirected and resulted in a successful remote lookup$/\1/p" ns4/named.stats`
$DIG $DIGOPTS nonexist. @10.53.0.4 -b 10.53.0.2 aaaa > dig.out.ns4.test$n || ret=1
grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
grep "nonexist. .*2001:ffff:ffff::6464:6401" dig.out.ns4.test$n > /dev/null || ret=1
@@ -381,6 +399,18 @@ n=`expr $n + 1`
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
+echo "I:checking AAAA nxdomain-redirect updates statistics ($n)"
+ret=0
+rm ns4/named.stats 2>/dev/null
+$RNDC -c ../common/rndc.conf -s 10.53.0.4 -p 9953 stats || ret=1
+POST_RED=`sed -n -e "s/[ ]*\([0-9]*\).queries resulted in NXDOMAIN that were redirected$/\1/p" ns4/named.stats`
+POST_SUC=`sed -n -e "s/[ ]*\([0-9]*\).queries resulted in NXDOMAIN that were redirected and resulted in a successful remote lookup$/\1/p" ns4/named.stats`
+if [ `expr $POST_RED - $PRE_RED` != 1 ]; then ret=1; fi
+if [ `expr $POST_SUC - $PRE_SUC` != 1 ]; then ret=1; fi
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
echo "I:checking ANY nxdomain-redirect works for nonexist ($n)"
ret=0
$DIG $DIGOPTS nonexist. @10.53.0.4 -b 10.53.0.2 any > dig.out.ns4.test$n || ret=1
diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml
index 633ff0d169..3f8a988e42 100644
--- a/doc/arm/Bv9ARM-book.xml
+++ b/doc/arm/Bv9ARM-book.xml
@@ -15446,6 +15446,33 @@ HOST-127.EXAMPLE. MX 0 .
+
+
+ QryNXRedir
+
+
+
+
+
+
+ Queries resulted in NXDOMAIN that were redirected.
+
+
+
+
+
+ QryNXRedirRLookup
+
+
+
+
+
+
+ Queries resulted in NXDOMAIN that were redirected
+ and resulted in a successful remote lookup.
+
+
+
XfrReqDone