Use all configured nameservers when using DnsNameResolver in all cases (#10503)
Motivation: Due a change introduced in 68105b257d915d8a0cb7b2acd9061661666537b6 we incorrectly skipped the usage of nameservers in some cases. Modifications: Only fetch a new stream of nameserver if the hostname not matches the original hostname in the query. Result: Use all configured nameservers. Fixes https://github.com/netty/netty/issues/10499
This commit is contained in:
parent
3b23e5a360
commit
d6a723ab9d
@ -1007,11 +1007,18 @@ abstract class DnsResolveContext<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private DnsServerAddressStream getNameServers(String hostname) {
|
private DnsServerAddressStream getNameServers(String name) {
|
||||||
DnsServerAddressStream stream = getNameServersFromCache(hostname);
|
DnsServerAddressStream stream = getNameServersFromCache(name);
|
||||||
// We need to obtain a new stream from the parent DnsNameResolver as the hostname may not be the same as the
|
if (stream == null) {
|
||||||
// one used for the original query (for example we may follow CNAMEs).
|
// We need to obtain a new stream from the parent DnsNameResolver if the hostname is not the same as
|
||||||
return stream == null ? parent.newNameServerAddressStream(hostname) : stream;
|
// for the original query (for example we may follow CNAMEs). Otherwise let's just duplicate the
|
||||||
|
// original nameservers so we correctly update the internal index
|
||||||
|
if (name.equals(hostname)) {
|
||||||
|
return nameServerAddrs.duplicate();
|
||||||
|
}
|
||||||
|
return parent.newNameServerAddressStream(name);
|
||||||
|
}
|
||||||
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void followCname(DnsQuestion question, String cname, DnsQueryLifecycleObserver queryLifecycleObserver,
|
private void followCname(DnsQuestion question, String cname, DnsQueryLifecycleObserver queryLifecycleObserver,
|
||||||
|
@ -3059,4 +3059,79 @@ public class DnsNameResolverTest {
|
|||||||
assertEquals(ipAddr, resolvedAddress.getHostAddress());
|
assertEquals(ipAddr, resolvedAddress.getHostAddress());
|
||||||
assertEquals(hostname, resolvedAddress.getHostName());
|
assertEquals(hostname, resolvedAddress.getHostName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAllNameServers() throws IOException {
|
||||||
|
final String domain = "netty.io";
|
||||||
|
final String ipv4Addr = "1.2.3.4";
|
||||||
|
final AtomicInteger server2Counter = new AtomicInteger();
|
||||||
|
final TestDnsServer dnsServer2 = new TestDnsServer(new RecordStore() {
|
||||||
|
@Override
|
||||||
|
public Set<ResourceRecord> getRecords(QuestionRecord question) {
|
||||||
|
server2Counter.incrementAndGet();
|
||||||
|
ResourceRecordModifier rm = new ResourceRecordModifier();
|
||||||
|
rm.setDnsClass(RecordClass.IN);
|
||||||
|
rm.setDnsName(question.getDomainName());
|
||||||
|
rm.setDnsTtl(100);
|
||||||
|
|
||||||
|
rm.setDnsType(question.getRecordType());
|
||||||
|
rm.put(DnsAttribute.IP_ADDRESS, ipv4Addr);
|
||||||
|
return Collections.singleton(rm.getEntry());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dnsServer2.start();
|
||||||
|
|
||||||
|
final AtomicInteger server3Counter = new AtomicInteger();
|
||||||
|
final TestDnsServer dnsServer3 = new TestDnsServer(new RecordStore() {
|
||||||
|
@Override
|
||||||
|
public Set<ResourceRecord> getRecords(QuestionRecord question) {
|
||||||
|
server3Counter.incrementAndGet();
|
||||||
|
ResourceRecordModifier rm = new ResourceRecordModifier();
|
||||||
|
rm.setDnsClass(RecordClass.IN);
|
||||||
|
rm.setDnsName(question.getDomainName());
|
||||||
|
rm.setDnsTtl(100);
|
||||||
|
|
||||||
|
rm.setDnsType(question.getRecordType());
|
||||||
|
rm.put(DnsAttribute.IP_ADDRESS, ipv4Addr);
|
||||||
|
return Collections.singleton(rm.getEntry());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dnsServer3.start();
|
||||||
|
DnsNameResolver resolver = null;
|
||||||
|
try {
|
||||||
|
resolver = newResolver()
|
||||||
|
.resolveCache(NoopDnsCache.INSTANCE)
|
||||||
|
.cnameCache(NoopDnsCnameCache.INSTANCE)
|
||||||
|
.recursionDesired(true)
|
||||||
|
.maxQueriesPerResolve(16)
|
||||||
|
.nameServerProvider(new DnsServerAddressStreamProvider() {
|
||||||
|
private final DnsServerAddresses addresses =
|
||||||
|
DnsServerAddresses.rotational(dnsServer2.localAddress(), dnsServer3.localAddress());
|
||||||
|
@Override
|
||||||
|
public DnsServerAddressStream nameServerAddressStream(String hostname) {
|
||||||
|
return addresses.stream();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.resolvedAddressTypes(ResolvedAddressTypes.IPV4_ONLY).build();
|
||||||
|
|
||||||
|
assertResolvedAddress(resolver.resolve(domain).syncUninterruptibly().getNow(), ipv4Addr, domain);
|
||||||
|
assertEquals(1, server2Counter.get());
|
||||||
|
assertEquals(0, server3Counter.get());
|
||||||
|
assertResolvedAddress(resolver.resolve(domain).syncUninterruptibly().getNow(), ipv4Addr, domain);
|
||||||
|
assertEquals(1, server2Counter.get());
|
||||||
|
assertEquals(1, server3Counter.get());
|
||||||
|
assertResolvedAddress(resolver.resolve(domain).syncUninterruptibly().getNow(), ipv4Addr, domain);
|
||||||
|
assertEquals(2, server2Counter.get());
|
||||||
|
assertEquals(1, server3Counter.get());
|
||||||
|
assertResolvedAddress(resolver.resolve(domain).syncUninterruptibly().getNow(), ipv4Addr, domain);
|
||||||
|
assertEquals(2, server2Counter.get());
|
||||||
|
assertEquals(2, server3Counter.get());
|
||||||
|
} finally {
|
||||||
|
dnsServer2.stop();
|
||||||
|
dnsServer3.stop();
|
||||||
|
if (resolver != null) {
|
||||||
|
resolver.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user