Skip to content

Commit 10c1aee

Browse files
committed
Remove InternalResolutionResult from DnsNameResolver
The internal result was needed before 90d0fab allowed addresses to fail yet still provide attributes and service config. Now the code can just use the regular API. This does cause a behavior change where TXT records are looked up even if address lookup failed, however that's actually what we wanted to allow in 90d0fab by adding the new API. Also, the TXT code was added in 2017 and it's now 2026 yet it is still disabled, so it's unlikely to matter soon.
1 parent 0675f70 commit 10c1aee

File tree

4 files changed

+33
-57
lines changed

4 files changed

+33
-57
lines changed

core/src/main/java/io/grpc/internal/DnsNameResolver.java

Lines changed: 15 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import com.google.common.base.Stopwatch;
2626
import com.google.common.base.Verify;
2727
import com.google.common.base.VerifyException;
28-
import io.grpc.Attributes;
2928
import io.grpc.EquivalentAddressGroup;
3029
import io.grpc.NameResolver;
3130
import io.grpc.ProxiedSocketAddress;
@@ -262,22 +261,19 @@ private EquivalentAddressGroup detectProxy() throws IOException {
262261
/**
263262
* Main logic of name resolution.
264263
*/
265-
protected InternalResolutionResult doResolve(boolean forceTxt) {
266-
InternalResolutionResult result = new InternalResolutionResult();
264+
protected ResolutionResult doResolve() {
265+
ResolutionResult.Builder resultBuilder = ResolutionResult.newBuilder();
267266
try {
268-
result.addresses = resolveAddresses();
267+
resultBuilder.setAddressesOrError(StatusOr.fromValue(resolveAddresses()));
269268
} catch (Exception e) {
270269
logger.log(Level.FINE, "Address resolution failure", e);
271-
if (!forceTxt) {
272-
result.error =
273-
Status.UNAVAILABLE.withDescription("Unable to resolve host " + host).withCause(e);
274-
return result;
275-
}
270+
resultBuilder.setAddressesOrError(StatusOr.fromStatus(
271+
Status.UNAVAILABLE.withDescription("Unable to resolve host " + host).withCause(e)));
276272
}
277273
if (enableTxt) {
278-
result.config = resolveServiceConfig();
274+
resultBuilder.setServiceConfig(resolveServiceConfig());
279275
}
280-
return result;
276+
return resultBuilder.build();
281277
}
282278

283279
private final class Resolve implements Runnable {
@@ -292,38 +288,22 @@ public void run() {
292288
if (logger.isLoggable(Level.FINER)) {
293289
logger.finer("Attempting DNS resolution of " + host);
294290
}
295-
InternalResolutionResult result = null;
291+
ResolutionResult result = null;
296292
try {
297293
EquivalentAddressGroup proxiedAddr = detectProxy();
298-
ResolutionResult.Builder resolutionResultBuilder = ResolutionResult.newBuilder();
299294
if (proxiedAddr != null) {
300295
if (logger.isLoggable(Level.FINER)) {
301296
logger.finer("Using proxy address " + proxiedAddr);
302297
}
303-
resolutionResultBuilder.setAddressesOrError(
304-
StatusOr.fromValue(Collections.singletonList(proxiedAddr)));
298+
result = ResolutionResult.newBuilder()
299+
.setAddressesOrError(StatusOr.fromValue(Collections.singletonList(proxiedAddr)))
300+
.build();
305301
} else {
306-
result = doResolve(false);
307-
if (result.error != null) {
308-
InternalResolutionResult finalResult = result;
309-
syncContext.execute(() ->
310-
savedListener.onResult2(ResolutionResult.newBuilder()
311-
.setAddressesOrError(StatusOr.fromStatus(finalResult.error))
312-
.build()));
313-
return;
314-
}
315-
if (result.addresses != null) {
316-
resolutionResultBuilder.setAddressesOrError(StatusOr.fromValue(result.addresses));
317-
}
318-
if (result.config != null) {
319-
resolutionResultBuilder.setServiceConfig(result.config);
320-
}
321-
if (result.attributes != null) {
322-
resolutionResultBuilder.setAttributes(result.attributes);
323-
}
302+
result = doResolve();
324303
}
304+
ResolutionResult savedResult = result;
325305
syncContext.execute(() -> {
326-
savedListener.onResult2(resolutionResultBuilder.build());
306+
savedListener.onResult2(savedResult);
327307
});
328308
} catch (IOException e) {
329309
syncContext.execute(() ->
@@ -333,7 +313,7 @@ public void run() {
333313
Status.UNAVAILABLE.withDescription(
334314
"Unable to resolve host " + host).withCause(e))).build()));
335315
} finally {
336-
final boolean succeed = result != null && result.error == null;
316+
final boolean succeed = result != null && result.getAddressesOrError().hasValue();
337317
syncContext.execute(new Runnable() {
338318
@Override
339319
public void run() {
@@ -535,18 +515,6 @@ private static long getNetworkAddressCacheTtlNanos(boolean isAndroid) {
535515
return sc;
536516
}
537517

538-
/**
539-
* Used as a DNS-based name resolver's internal representation of resolution result.
540-
*/
541-
protected static final class InternalResolutionResult {
542-
private Status error;
543-
private List<EquivalentAddressGroup> addresses;
544-
private ConfigOrError config;
545-
public Attributes attributes;
546-
547-
private InternalResolutionResult() {}
548-
}
549-
550518
/**
551519
* Describes a parsed SRV record.
552520
*/

core/src/test/java/io/grpc/internal/DnsNameResolverTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@ public ConfigOrError parseServiceConfig(Map<String, ?> rawServiceConfig) {
684684
}
685685

686686
@Test
687-
public void resolve_addressFailure_neverLookUpServiceConfig() throws Exception {
687+
public void resolve_addressFailure_stillLookUpServiceConfig() throws Exception {
688688
DnsNameResolver.enableTxt = true;
689689
AddressResolver mockAddressResolver = mock(AddressResolver.class);
690690
when(mockAddressResolver.resolveAddress(anyString()))
@@ -703,7 +703,7 @@ public void resolve_addressFailure_neverLookUpServiceConfig() throws Exception {
703703
Status errorStatus = resultCaptor.getValue().getAddressesOrError().getStatus();
704704
assertThat(errorStatus.getCode()).isEqualTo(Code.UNAVAILABLE);
705705
assertThat(errorStatus.getCause()).hasMessageThat().contains("no addr");
706-
verify(mockResourceResolver, never()).resolveTxt(anyString());
706+
verify(mockResourceResolver).resolveTxt("_grpc_config." + name);
707707

708708
assertEquals(0, fakeClock.numPendingTasks());
709709
// A retry should be scheduled

grpclb/src/main/java/io/grpc/grpclb/GrpclbNameResolver.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.grpc.Attributes;
2222
import io.grpc.EquivalentAddressGroup;
2323
import io.grpc.NameResolver;
24+
import io.grpc.StatusOr;
2425
import io.grpc.internal.DnsNameResolver;
2526
import io.grpc.internal.SharedResourceHolder.Resource;
2627
import java.net.InetAddress;
@@ -58,14 +59,22 @@ final class GrpclbNameResolver extends DnsNameResolver {
5859
}
5960

6061
@Override
61-
protected InternalResolutionResult doResolve(boolean forceTxt) {
62+
protected ResolutionResult doResolve() {
63+
ResolutionResult result = super.doResolve();
6264
List<EquivalentAddressGroup> balancerAddrs = resolveBalancerAddresses();
63-
InternalResolutionResult result = super.doResolve(!balancerAddrs.isEmpty());
6465
if (!balancerAddrs.isEmpty()) {
65-
result.attributes =
66-
Attributes.newBuilder()
66+
ResolutionResult.Builder resultBuilder = result.toBuilder()
67+
.setAttributes(result.getAttributes().toBuilder()
6768
.set(GrpclbConstants.ATTR_LB_ADDRS, balancerAddrs)
68-
.build();
69+
.build());
70+
if (!result.getAddressesOrError().hasValue()) {
71+
// While ResolutionResult is powerful enough to communicate attributes simultaneously with
72+
// an address resolution failure, LoadBalancer.ResolvedAddresses isn't yet and so the
73+
// attributes are lost if addresses fail. GrpclbLB will be able to handle the lack of
74+
// addresses since there are LB addresses, so discard the failure for now.
75+
resultBuilder.setAddressesOrError(StatusOr.fromValue(Collections.emptyList()));
76+
}
77+
result = resultBuilder.build();
6978
}
7079
return result;
7180
}

grpclb/src/test/java/io/grpc/grpclb/GrpclbNameResolverTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import static org.mockito.ArgumentMatchers.anyString;
2121
import static org.mockito.Mockito.lenient;
2222
import static org.mockito.Mockito.mock;
23-
import static org.mockito.Mockito.never;
2423
import static org.mockito.Mockito.verify;
2524
import static org.mockito.Mockito.when;
2625

@@ -319,7 +318,7 @@ public void resolveAll_balancerLookupFails_stillLookUpServiceConfig() throws Exc
319318
}
320319

321320
@Test
322-
public void resolve_addressAndBalancersLookupFail_neverLookupServiceConfig() throws Exception {
321+
public void resolve_addressAndBalancersLookupFail_stillLookupServiceConfig() throws Exception {
323322
AddressResolver mockAddressResolver = mock(AddressResolver.class);
324323
when(mockAddressResolver.resolveAddress(anyString()))
325324
.thenThrow(new UnknownHostException("I really tried"));
@@ -338,7 +337,7 @@ public void resolve_addressAndBalancersLookupFail_neverLookupServiceConfig() thr
338337
Status errorStatus = resultCaptor.getValue().getAddressesOrError().getStatus();
339338
assertThat(errorStatus.getCode()).isEqualTo(Code.UNAVAILABLE);
340339
verify(mockAddressResolver).resolveAddress(hostName);
341-
verify(mockResourceResolver, never()).resolveTxt("_grpc_config." + hostName);
340+
verify(mockResourceResolver).resolveTxt("_grpc_config." + hostName);
342341
verify(mockResourceResolver).resolveSrv("_grpclb._tcp." + hostName);
343342
}
344343
}

0 commit comments

Comments
 (0)