Commit a9b1a642e1 for bind
commit a9b1a642e148f7bc6b495d0b1bd49b0ea02f6ad9
Author: Aram Sargsyan <aram@isc.org>
Date: Fri Oct 23 15:44:35 2026 +0000
Test zone transfer retry after DNS_R_TOOMANYRECORDS
Add a check to verify that named retries with the next primary
server when the previous one resulted in DNS_R_TOOMANYRECORDS
error.
diff --git a/bin/tests/system/xfer/ans9/ans.py b/bin/tests/system/xfer/ans9/ans.py
index c9d2b2ccd2..13dd10d313 100644
--- a/bin/tests/system/xfer/ans9/ans.py
+++ b/bin/tests/system/xfer/ans9/ans.py
@@ -32,6 +32,7 @@ from isctest.asyncserver.matchers import Qname, Qtype
TTL = 300
RECONFIG_ZONE = "xfr-and-reconfig."
+RETRY_ZONE = "retry-too-big."
OVERRUN_ZONE = "private-dns-overrun."
# The malformed DNSKEY's algorithm identifier finishes on a 00 byte in the
@@ -130,6 +131,17 @@ class ReconfigAxfrHandler(ZoneAxfrHandler):
]
+class RetryAxfrHandler(ZoneAxfrHandler):
+ zone = RETRY_ZONE
+
+ @property
+ def zone_contents(self) -> Collection[dns.rrset.RRset]:
+ return [
+ ns(self.zone),
+ txt(self.zone),
+ ]
+
+
class OverrunAxfrHandler(ZoneAxfrHandler):
"""
Serve the malformed PRIVATEDNS DNSKEY overrun; see OVERRUN_DNSKEY.
@@ -157,6 +169,7 @@ def main() -> None:
SoaHandler(serials),
OverrunAxfrHandler(serials),
ReconfigAxfrHandler(serials),
+ RetryAxfrHandler(serials),
)
server.run()
diff --git a/bin/tests/system/xfer/ns1/named.conf.j2 b/bin/tests/system/xfer/ns1/named.conf.j2
index 3785b24f94..b56b867ea4 100644
--- a/bin/tests/system/xfer/ns1/named.conf.j2
+++ b/bin/tests/system/xfer/ns1/named.conf.j2
@@ -55,6 +55,11 @@ zone "axfr-too-big" {
file "axfr-too-big.db";
};
+zone "retry-too-big" {
+ type primary;
+ file "retry-too-big.db";
+};
+
zone "ixfr-too-big" {
type primary;
allow-update { any; };
diff --git a/bin/tests/system/xfer/ns1/retry-too-big.db b/bin/tests/system/xfer/ns1/retry-too-big.db
new file mode 100644
index 0000000000..d650060c09
--- /dev/null
+++ b/bin/tests/system/xfer/ns1/retry-too-big.db
@@ -0,0 +1,4 @@
+$TTL 3600
+@ IN SOA . . 0 0 0 0 0
+@ IN NS .
+$GENERATE 1-29 host$ A 1.2.3.$
diff --git a/bin/tests/system/xfer/ns6/named.conf.j2 b/bin/tests/system/xfer/ns6/named.conf.j2
index 8a4845994a..c0e326cfef 100644
--- a/bin/tests/system/xfer/ns6/named.conf.j2
+++ b/bin/tests/system/xfer/ns6/named.conf.j2
@@ -71,6 +71,14 @@ zone "axfr-too-big" {
file "axfr-too-big.bk";
};
+zone "retry-too-big" {
+ type secondary;
+ max-records 30;
+ primaries { 10.53.0.1; 10.53.0.9; };
+ file "retry-too-big.bk";
+ request-ixfr no; # ans9 supports only axfr
+};
+
zone "ixfr-too-big" {
type secondary;
max-records 30;
diff --git a/bin/tests/system/xfer/tests_xfer.py b/bin/tests/system/xfer/tests_xfer.py
index 1be47b8ada..d019d14068 100644
--- a/bin/tests/system/xfer/tests_xfer.py
+++ b/bin/tests/system/xfer/tests_xfer.py
@@ -527,6 +527,28 @@ def test_ixfr_too_many_records(named_port, ns6):
)
+# test that though a zone with too many records is rejected, the next primary is tried
+def test_retry_too_many_records(named_port, ns6):
+ with ns6.watch_log_from_here() as watcher:
+ ns6.rndc("retransfer retry-too-big.")
+ watcher.wait_for_line(
+ isctest.transfer.transfer_message(
+ "retry-too-big",
+ "10.53.0.1",
+ "Transfer status: too many records",
+ named_port,
+ )
+ )
+ watcher.wait_for_line(
+ isctest.transfer.transfer_message(
+ "retry-too-big",
+ "10.53.0.9",
+ "Transfer status: success",
+ named_port,
+ )
+ )
+
+
# test that a zone with too many diffs (IXFR) is retried with AXFR
def test_ixfr_too_many_diffs(named_port, ns6):
nsupdate_config = f"""