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"""