Skip to content

Commit 4455154

Browse files
committed
Issue 5676: Introduced the option to fall back to TCP when DNS resolving via UDP fails with a timeout
1 parent 2220b30 commit 4455154

File tree

4 files changed

+40
-1
lines changed

4 files changed

+40
-1
lines changed

src/main/generated/io/vertx/core/dns/AddressResolverOptionsConverter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ static void fromJson(Iterable<java.util.Map.Entry<String, Object>> json, Address
105105
obj.setServers(list);
106106
}
107107
break;
108+
case "useTcpForFallbackDnsResolving":
109+
if (member.getValue() instanceof Boolean) {
110+
obj.setUseTcpForFallbackDnsResolving((Boolean)member.getValue());
111+
}
112+
break;
108113
}
109114
}
110115
}
@@ -141,5 +146,6 @@ static void toJson(AddressResolverOptions obj, java.util.Map<String, Object> jso
141146
obj.getServers().forEach(item -> array.add(item));
142147
json.put("servers", array);
143148
}
149+
json.put("useTcpForFallbackDnsResolving", obj.isUseTcpForFallbackDnsResolving());
144150
}
145151
}

src/main/java/io/vertx/core/dns/AddressResolverOptions.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ public class AddressResolverOptions {
103103
*/
104104
public static final boolean DEFAULT_ROUND_ROBIN_INET_ADDRESS = false;
105105

106+
/**
107+
* The default whether to use TCP for DNS resolving if resolving via UDP times out = false
108+
*/
109+
public static final boolean DEFAULT_USE_TCP_FOR_FALLBACK_DNS_RESOLVING = false;
110+
106111
private String hostsPath;
107112
private Buffer hostsValue;
108113
private int hostsRefreshPeriod;
@@ -118,6 +123,7 @@ public class AddressResolverOptions {
118123
private int ndots;
119124
private boolean rotateServers;
120125
private boolean roundRobinInetAddress;
126+
private boolean useTcpForFallbackDnsResolving;
121127

122128
public AddressResolverOptions() {
123129
servers = DEFAULT_SERVERS;
@@ -133,6 +139,7 @@ public AddressResolverOptions() {
133139
rotateServers = DEFAULT_ROTATE_SERVERS;
134140
roundRobinInetAddress = DEFAULT_ROUND_ROBIN_INET_ADDRESS;
135141
hostsRefreshPeriod = DEFAULT_HOSTS_REFRESH_PERIOD;
142+
useTcpForFallbackDnsResolving = DEFAULT_USE_TCP_FOR_FALLBACK_DNS_RESOLVING;
136143
}
137144

138145
public AddressResolverOptions(AddressResolverOptions other) {
@@ -151,6 +158,7 @@ public AddressResolverOptions(AddressResolverOptions other) {
151158
this.ndots = other.ndots;
152159
this.rotateServers = other.rotateServers;
153160
this.roundRobinInetAddress = other.roundRobinInetAddress;
161+
this.useTcpForFallbackDnsResolving = other.useTcpForFallbackDnsResolving;
154162
}
155163

156164
public AddressResolverOptions(JsonObject json) {
@@ -496,6 +504,24 @@ public AddressResolverOptions setRoundRobinInetAddress(boolean roundRobinInetAdd
496504
return this;
497505
}
498506

507+
/**
508+
* @return the value {@code true} when using TCP for DNS resolving as a fallback is enabled when resolving via
509+
* UDP times out.
510+
*/
511+
public boolean isUseTcpForFallbackDnsResolving() {
512+
return useTcpForFallbackDnsResolving;
513+
}
514+
515+
/**
516+
* Set to {@code true} to enable using TCP as a fallback for DNS resolving when using UDP times out.
517+
*
518+
* @return a reference to this, so the API can be used fluently
519+
*/
520+
public AddressResolverOptions setUseTcpForFallbackDnsResolving(boolean useTcpForFallbackDnsResolving) {
521+
this.useTcpForFallbackDnsResolving = useTcpForFallbackDnsResolving;
522+
return this;
523+
}
524+
499525
public JsonObject toJson() {
500526
JsonObject json = new JsonObject();
501527
AddressResolverOptionsConverter.toJson(this, json);

src/main/java/io/vertx/core/impl/resolver/DnsResolverProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ private DnsResolverProvider(VertxInternal vertx, AddressResolverOptions options)
105105
DnsNameResolverBuilder builder = new DnsNameResolverBuilder();
106106
builder.hostsFileEntriesResolver(this);
107107
builder.channelFactory(() -> vertx.transport().datagramChannel());
108-
builder.socketChannelFactory(() -> (SocketChannel) vertx.transport().channelFactory(false).newChannel());
108+
builder.socketChannelFactory(() -> (SocketChannel) vertx.transport().channelFactory(false).newChannel(),
109+
options.isUseTcpForFallbackDnsResolving());
109110
builder.nameServerProvider(nameServerAddressProvider);
110111
builder.optResourceEnabled(options.isOptResourceEnabled());
111112
builder.resolveCache(resolveCache);

src/test/java/io/vertx/core/dns/HostnameResolutionTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ public void testOptions() {
191191
assertEquals(AddressResolverOptions.DEFAULT_RD_FLAG, options.getRdFlag());
192192
assertEquals(AddressResolverOptions.DEFAULT_NDOTS, options.getNdots());
193193
assertEquals(AddressResolverOptions.DEFAULT_SEARCH_DOMAINS, options.getSearchDomains());
194+
assertEquals(AddressResolverOptions.DEFAULT_USE_TCP_FOR_FALLBACK_DNS_RESOLVING, options.isUseTcpForFallbackDnsResolving());
194195

195196
boolean optResourceEnabled = TestUtils.randomBoolean();
196197
List<String> servers = Arrays.asList("1.2.3.4", "5.6.7.8");
@@ -205,11 +206,13 @@ public void testOptions() {
205206
for (int i = 0; i < 2; i++) {
206207
searchDomains.add(TestUtils.randomAlphaString(15));
207208
}
209+
boolean useTcpForFallbackDnsResolving = true;
208210

209211
assertSame(options, options.setOptResourceEnabled(optResourceEnabled));
210212
assertSame(options, options.setServers(new ArrayList<>(servers)));
211213
assertSame(options, options.setCacheMinTimeToLive(0));
212214
assertSame(options, options.setCacheMinTimeToLive(minTTL));
215+
assertSame(options, options.setUseTcpForFallbackDnsResolving(useTcpForFallbackDnsResolving));
213216
try {
214217
options.setCacheMinTimeToLive(-1);
215218
fail("Should throw exception");
@@ -266,6 +269,7 @@ public void testOptions() {
266269
assertEquals(rdFlag, options.getRdFlag());
267270
assertEquals(ndots, options.getNdots());
268271
assertEquals(searchDomains, options.getSearchDomains());
272+
assertEquals(useTcpForFallbackDnsResolving, options.isUseTcpForFallbackDnsResolving());
269273

270274
// Test copy and json copy
271275
AddressResolverOptions copy = new AddressResolverOptions(options);
@@ -303,6 +307,7 @@ public void testOptions() {
303307
assertEquals(rdFlag, jsonCopy.getRdFlag());
304308
assertEquals(ndots, jsonCopy.getNdots());
305309
assertEquals(searchDomains, jsonCopy.getSearchDomains());
310+
assertEquals(useTcpForFallbackDnsResolving, jsonCopy.isUseTcpForFallbackDnsResolving());
306311
}
307312

308313
@Test
@@ -318,6 +323,7 @@ public void testDefaultJsonOptions() {
318323
assertEquals(AddressResolverOptions.DEFAULT_RD_FLAG, options.getRdFlag());
319324
assertEquals(AddressResolverOptions.DEFAULT_SEARCH_DOMAINS, options.getSearchDomains());
320325
assertEquals(AddressResolverOptions.DEFAULT_NDOTS, options.getNdots());
326+
assertEquals(AddressResolverOptions.DEFAULT_USE_TCP_FOR_FALLBACK_DNS_RESOLVING, options.isUseTcpForFallbackDnsResolving());
321327
}
322328

323329
@Test

0 commit comments

Comments
 (0)