DnsNameResolver should log in trace level if notification of the promise fails (#9022)
Motivation: During investigating some other bug I noticed that we log with warn level if we fail to notify the promise due the fact that it is already full-filled. This is not correct and missleading as there is nothing wrong with it in general. A promise may already been fullfilled because we did multiple queries and one of these was successful. Modifications: - Change log level to trace - Add unit test which before did log with warn level but now does with trace level. Result: Less missleading noise in the log.
This commit is contained in:
parent
51112e2b36
commit
c0d3444f6d
@ -861,13 +861,19 @@ public class DnsNameResolver extends InetNameResolver {
|
|||||||
|
|
||||||
static <T> void trySuccess(Promise<T> promise, T result) {
|
static <T> void trySuccess(Promise<T> promise, T result) {
|
||||||
if (!promise.trySuccess(result)) {
|
if (!promise.trySuccess(result)) {
|
||||||
logger.warn("Failed to notify success ({}) to a promise: {}", result, promise);
|
// There is nothing really wrong with not be able to notify the promise as we may have raced here because
|
||||||
|
// of multiple queries that have been executed. Log it with trace level anyway just in case the user
|
||||||
|
// wants to better understand what happened.
|
||||||
|
logger.trace("Failed to notify success ({}) to a promise: {}", result, promise);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void tryFailure(Promise<?> promise, Throwable cause) {
|
private static void tryFailure(Promise<?> promise, Throwable cause) {
|
||||||
if (!promise.tryFailure(cause)) {
|
if (!promise.tryFailure(cause)) {
|
||||||
logger.warn("Failed to notify failure to a promise: {}", promise, cause);
|
// There is nothing really wrong with not be able to notify the promise as we may have raced here because
|
||||||
|
// of multiple queries that have been executed. Log it with trace level anyway just in case the user
|
||||||
|
// wants to better understand what happened.
|
||||||
|
logger.trace("Failed to notify failure to a promise: {}", promise, cause);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2585,4 +2585,31 @@ public class DnsNameResolverTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDropAAAA() throws IOException {
|
||||||
|
String host = "somehost.netty.io";
|
||||||
|
TestDnsServer dnsServer2 = new TestDnsServer(Collections.singleton(host));
|
||||||
|
dnsServer2.start(true);
|
||||||
|
DnsNameResolver resolver = null;
|
||||||
|
try {
|
||||||
|
DnsNameResolverBuilder builder = newResolver()
|
||||||
|
.recursionDesired(false)
|
||||||
|
.queryTimeoutMillis(500)
|
||||||
|
.resolvedAddressTypes(ResolvedAddressTypes.IPV4_PREFERRED)
|
||||||
|
.maxQueriesPerResolve(16)
|
||||||
|
.nameServerProvider(new SingletonDnsServerAddressStreamProvider(dnsServer2.localAddress()));
|
||||||
|
|
||||||
|
resolver = builder.build();
|
||||||
|
List<InetAddress> addressList = resolver.resolveAll(host).syncUninterruptibly().getNow();
|
||||||
|
assertEquals(1, addressList.size());
|
||||||
|
assertEquals(host, addressList.get(0).getHostName());
|
||||||
|
} finally {
|
||||||
|
dnsServer2.stop();
|
||||||
|
if (resolver != null) {
|
||||||
|
resolver.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ package io.netty.resolver.dns;
|
|||||||
import io.netty.util.NetUtil;
|
import io.netty.util.NetUtil;
|
||||||
import io.netty.util.internal.PlatformDependent;
|
import io.netty.util.internal.PlatformDependent;
|
||||||
import org.apache.directory.server.dns.DnsServer;
|
import org.apache.directory.server.dns.DnsServer;
|
||||||
|
import org.apache.directory.server.dns.io.decoder.DnsMessageDecoder;
|
||||||
import org.apache.directory.server.dns.io.encoder.DnsMessageEncoder;
|
import org.apache.directory.server.dns.io.encoder.DnsMessageEncoder;
|
||||||
import org.apache.directory.server.dns.io.encoder.ResourceRecordEncoder;
|
import org.apache.directory.server.dns.io.encoder.ResourceRecordEncoder;
|
||||||
import org.apache.directory.server.dns.messages.DnsMessage;
|
import org.apache.directory.server.dns.messages.DnsMessage;
|
||||||
@ -28,7 +29,6 @@ import org.apache.directory.server.dns.messages.ResourceRecord;
|
|||||||
import org.apache.directory.server.dns.messages.ResourceRecordImpl;
|
import org.apache.directory.server.dns.messages.ResourceRecordImpl;
|
||||||
import org.apache.directory.server.dns.messages.ResourceRecordModifier;
|
import org.apache.directory.server.dns.messages.ResourceRecordModifier;
|
||||||
import org.apache.directory.server.dns.protocol.DnsProtocolHandler;
|
import org.apache.directory.server.dns.protocol.DnsProtocolHandler;
|
||||||
import org.apache.directory.server.dns.protocol.DnsUdpDecoder;
|
|
||||||
import org.apache.directory.server.dns.protocol.DnsUdpEncoder;
|
import org.apache.directory.server.dns.protocol.DnsUdpEncoder;
|
||||||
import org.apache.directory.server.dns.store.DnsAttribute;
|
import org.apache.directory.server.dns.store.DnsAttribute;
|
||||||
import org.apache.directory.server.dns.store.RecordStore;
|
import org.apache.directory.server.dns.store.RecordStore;
|
||||||
@ -38,6 +38,8 @@ import org.apache.mina.core.session.IoSession;
|
|||||||
import org.apache.mina.filter.codec.ProtocolCodecFactory;
|
import org.apache.mina.filter.codec.ProtocolCodecFactory;
|
||||||
import org.apache.mina.filter.codec.ProtocolCodecFilter;
|
import org.apache.mina.filter.codec.ProtocolCodecFilter;
|
||||||
import org.apache.mina.filter.codec.ProtocolDecoder;
|
import org.apache.mina.filter.codec.ProtocolDecoder;
|
||||||
|
import org.apache.mina.filter.codec.ProtocolDecoderAdapter;
|
||||||
|
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
|
||||||
import org.apache.mina.filter.codec.ProtocolEncoder;
|
import org.apache.mina.filter.codec.ProtocolEncoder;
|
||||||
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
|
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
|
||||||
import org.apache.mina.transport.socket.DatagramAcceptor;
|
import org.apache.mina.transport.socket.DatagramAcceptor;
|
||||||
@ -83,6 +85,13 @@ class TestDnsServer extends DnsServer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start() throws IOException {
|
public void start() throws IOException {
|
||||||
|
start(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the {@link TestDnsServer} but drop all {@code AAAA} queries and not send any response to these at all.
|
||||||
|
*/
|
||||||
|
public void start(final boolean dropAAAAQueries) throws IOException {
|
||||||
InetSocketAddress address = new InetSocketAddress(NetUtil.LOCALHOST4, 0);
|
InetSocketAddress address = new InetSocketAddress(NetUtil.LOCALHOST4, 0);
|
||||||
UdpTransport transport = new UdpTransport(address.getHostName(), address.getPort());
|
UdpTransport transport = new UdpTransport(address.getHostName(), address.getPort());
|
||||||
setTransports(transport);
|
setTransports(transport);
|
||||||
@ -94,7 +103,8 @@ class TestDnsServer extends DnsServer {
|
|||||||
public void sessionCreated(IoSession session) {
|
public void sessionCreated(IoSession session) {
|
||||||
// USe our own codec to support AAAA testing
|
// USe our own codec to support AAAA testing
|
||||||
session.getFilterChain()
|
session.getFilterChain()
|
||||||
.addFirst("codec", new ProtocolCodecFilter(new TestDnsProtocolUdpCodecFactory()));
|
.addFirst("codec", new ProtocolCodecFilter(
|
||||||
|
new TestDnsProtocolUdpCodecFactory(dropAAAAQueries)));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -142,6 +152,11 @@ class TestDnsServer extends DnsServer {
|
|||||||
private final class TestDnsProtocolUdpCodecFactory implements ProtocolCodecFactory {
|
private final class TestDnsProtocolUdpCodecFactory implements ProtocolCodecFactory {
|
||||||
private final DnsMessageEncoder encoder = new DnsMessageEncoder();
|
private final DnsMessageEncoder encoder = new DnsMessageEncoder();
|
||||||
private final TestAAAARecordEncoder recordEncoder = new TestAAAARecordEncoder();
|
private final TestAAAARecordEncoder recordEncoder = new TestAAAARecordEncoder();
|
||||||
|
private final boolean dropAAAArecords;
|
||||||
|
|
||||||
|
TestDnsProtocolUdpCodecFactory(boolean dropAAAArecords) {
|
||||||
|
this.dropAAAArecords = dropAAAArecords;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ProtocolEncoder getEncoder(IoSession session) {
|
public ProtocolEncoder getEncoder(IoSession session) {
|
||||||
@ -175,7 +190,22 @@ class TestDnsServer extends DnsServer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ProtocolDecoder getDecoder(IoSession session) {
|
public ProtocolDecoder getDecoder(IoSession session) {
|
||||||
return new DnsUdpDecoder();
|
return new ProtocolDecoderAdapter() {
|
||||||
|
private DnsMessageDecoder decoder = new DnsMessageDecoder();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws IOException {
|
||||||
|
DnsMessage message = decoder.decode(in);
|
||||||
|
if (dropAAAArecords) {
|
||||||
|
for (QuestionRecord record: message.getQuestionRecords()) {
|
||||||
|
if (record.getRecordType() == RecordType.AAAA) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.write(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class TestAAAARecordEncoder extends ResourceRecordEncoder {
|
private final class TestAAAARecordEncoder extends ResourceRecordEncoder {
|
||||||
|
Loading…
Reference in New Issue
Block a user