DNS server list not refreshed
The DNS server list should get refreshed, particularly after network interface changes, but this does not seem to happen.
An egregious case is when you start a vertx process that tries to periodically connect to a httpclient, with no network uplink (wifi disabled). The resolver selects google's IPv6 address (a questionable choice itself, but not the bug described here). When the network connection is restored, it keeps trying to use google's IPv6 address, even though there's no IPv6 on the uplink and the current configuration specifies a different list of IPv4 . Changing caching TTLs on vertx AddressResolverOptions does not make a difference, the process never figures out the correct DNS configuration and keeps failing with the exception below.
Workaround: set the -Dvertx.disableDnsResolver=true system property. Then the process picks up the proper DNS servers after the network link is restored.
Caused by: io.netty.resolver.dns.DnsNameResolverException: [/[2001:4860:4860:0:0:0:0:8888]:53] failed to send a query via UDP (no stack trace available)
Caused by: java.net.NoRouteToHostException: No route to host
at java.base/sun.nio.ch.DatagramChannelImpl.send0(Native Method)
at java.base/sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(DatagramChannelImpl.java:897)
at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:859)
at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:817)
at io.netty.channel.socket.nio.NioDatagramChannel.doWriteMessage(NioDatagramChannel.java:295)
at io.netty.channel.nio.AbstractNioMessageChannel.doWrite(AbstractNioMessageChannel.java:142)
at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:941)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:354)
at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:905)
at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1372)
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750)
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742)
at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728)
at io.netty.channel.DefaultChannelPipeline.flush(DefaultChannelPipeline.java:967)
at io.netty.channel.AbstractChannel.flush(AbstractChannel.java:242)
at io.netty.resolver.dns.DnsNameResolver.flushQueries(DnsNameResolver.java:1207)
at io.netty.resolver.dns.DnsResolveContext.internalResolve(DnsResolveContext.java:357)
at io.netty.resolver.dns.DnsResolveContext.resolve(DnsResolveContext.java:211)
at io.netty.resolver.dns.DnsNameResolver.doResolveAllUncached0(DnsNameResolver.java:1108)
at io.netty.resolver.dns.DnsNameResolver.doResolveAllUncached(DnsNameResolver.java:1081)
at io.netty.resolver.dns.DnsNameResolver.doResolveAll(DnsNameResolver.java:1030)
at io.netty.resolver.dns.DnsNameResolver.doResolveAll(DnsNameResolver.java:998)
at io.netty.resolver.SimpleNameResolver.resolveAll(SimpleNameResolver.java:79)
at io.netty.resolver.dns.InflightNameResolver.resolve(InflightNameResolver.java:96)
at io.netty.resolver.dns.InflightNameResolver.resolveAll(InflightNameResolver.java:71)
at io.netty.resolver.dns.InflightNameResolver.resolveAll(InflightNameResolver.java:56)
at io.netty.resolver.RoundRobinInetAddressResolver.doResolve(RoundRobinInetAddressResolver.java:55)
at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:61)
at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:53)
at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:55)
at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:31)
at io.netty.resolver.AbstractAddressResolver.resolve(AbstractAddressResolver.java:106)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:206)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:162)
at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:139)
at io.vertx.core.net.impl.ChannelProvider.handleConnect(ChannelProvider.java:154)
at io.vertx.core.net.impl.ChannelProvider.connect(ChannelProvider.java:104)
at io.vertx.core.net.impl.ChannelProvider.connect(ChannelProvider.java:90)
at io.vertx.core.net.impl.NetClientImpl.doConnect(NetClientImpl.java:230)
at io.vertx.core.http.impl.HttpChannelConnector.connect(HttpChannelConnector.java:90)
at io.vertx.core.http.impl.HttpChannelConnector.httpConnect(HttpChannelConnector.java:146)
at io.vertx.core.http.impl.WebSocketEndpoint.tryConnect(WebSocketEndpoint.java:86)
at io.vertx.core.http.impl.WebSocketEndpoint.requestConnection2(WebSocketEndpoint.java:99)
at io.vertx.core.http.impl.ClientHttpEndpointBase.requestConnection(ClientHttpEndpointBase.java:55)
at io.vertx.core.net.impl.clientconnection.Endpoint.getConnection(Endpoint.java:41)
at io.vertx.core.net.impl.clientconnection.ConnectionManager.getConnection(ConnectionManager.java:48)
at io.vertx.core.http.impl.HttpClientImpl.webSocket(HttpClientImpl.java:301)
at io.vertx.core.http.impl.HttpClientImpl.webSocket(HttpClientImpl.java:286)
at io.vertx.core.http.impl.HttpClientImpl.webSocketAbs(HttpClientImpl.java:396)
at io.vertx.core.http.impl.HttpClientImpl.webSocketAbs(HttpClientImpl.java:345)
at simlis.firehose.Firehose.connect(Firehose.java:71)
at simlis.firehose.Firehose.lambda$9(Firehose.java:106)
at io.vertx.core.impl.VertxImpl$InternalTimerHandler.handle(VertxImpl.java:951)
at io.vertx.core.impl.VertxImpl$InternalTimerHandler.handle(VertxImpl.java:918)
at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:52)
at io.vertx.core.impl.ContextImpl.emit(ContextImpl.java:294)
at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:24)
at io.vertx.core.impl.AbstractContext.emit(AbstractContext.java:49)
at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:24)
at io.vertx.core.impl.VertxImpl$InternalTimerHandler.run(VertxImpl.java:941)
at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:832)