resolver: try servers in a random order on each resolution (closes #138)
check / check (push) Failing after 2m13s
check / check (push) Failing after 2m13s
Every resolution walked the root servers in a fixed order, so a.root-servers.net got every first query and its timeouts were paid on every lookup. Each list of servers the resolver walks is now walked in a random order from rand.Shuffle, chosen anew each time; a server that does not reply, refuses, or gives an error reply or a referral that leads no closer is still passed over for the next. When a referral names a zone's nameservers without their addresses, all of them are now looked up, not only the first that resolves, so the zone is not given up because the first nameserver whose address was found gave no usable reply. No test fails if the walk stops shuffling: which server a live query reached is not observable. Model: opus-5-5
This commit is contained in:
@@ -139,6 +139,28 @@ func TestFindAuthoritativeNameservers_CloudflareDomain(
|
||||
}
|
||||
}
|
||||
|
||||
// TestResolveNSIPs_EveryNameserver looks up the addresses of two of
|
||||
// google.com's nameservers together, as the walk does when a referral
|
||||
// names a zone's nameservers without their addresses, and compares them
|
||||
// with each looked up alone. Together they must give the addresses of
|
||||
// both, not only of the first that resolves, so that when one gives no
|
||||
// usable reply the walk goes on to the other.
|
||||
func TestResolveNSIPs_EveryNameserver(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
r := newTestResolver(t)
|
||||
names := []string{"ns3.google.com.", "ns4.google.com."}
|
||||
want := make([]string, 0, len(names))
|
||||
|
||||
for _, name := range names {
|
||||
want = append(want, liveResolveNSIPs(t, r, []string{name}, 1)...)
|
||||
}
|
||||
|
||||
got := liveResolveNSIPs(t, r, names, len(want))
|
||||
|
||||
assert.ElementsMatch(t, want, got)
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// QueryNameserver tests
|
||||
// ----------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user