Skip to content

Commit 3689c40

Browse files
authored
core: ManagedChannelImpl to always use RetryingNameResolver (#10328) (#10332)
ManagedCahnnelImpl did not make sure to use a RetryingNameResolver if authority was not overriden. This was not a problem for DNS name resolution as the DNS name resolver factory explicitly returns a RetryingNameResolver. For polling name resolvers that do not do this in their factories (like the grpclb name resolver) this meant not having retry at all.
1 parent dbe818d commit 3689c40

File tree

3 files changed

+24
-15
lines changed

3 files changed

+24
-15
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -749,9 +749,6 @@ static NameResolver getNameResolver(
749749
String target, @Nullable final String overrideAuthority,
750750
NameResolver.Factory nameResolverFactory, NameResolver.Args nameResolverArgs) {
751751
NameResolver resolver = getNameResolver(target, nameResolverFactory, nameResolverArgs);
752-
if (overrideAuthority == null) {
753-
return resolver;
754-
}
755752

756753
// If the nameResolver is not already a RetryingNameResolver, then wrap it with it.
757754
// This helps guarantee that name resolution retry remains supported even as it has been
@@ -769,6 +766,10 @@ static NameResolver getNameResolver(
769766
nameResolverArgs.getSynchronizationContext());
770767
}
771768

769+
if (overrideAuthority == null) {
770+
return usedNameResolver;
771+
}
772+
772773
return new ForwardingNameResolver(usedNameResolver) {
773774
@Override
774775
public String getServiceAuthority() {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,9 @@ public String getDefaultScheme() {
139139

140140
private void testValidTarget(String target, String expectedUriString, URI expectedUri) {
141141
NameResolver.Factory nameResolverFactory = new FakeNameResolverFactory(expectedUri.getScheme());
142-
FakeNameResolver nameResolver = (FakeNameResolver) ManagedChannelImpl.getNameResolver(
143-
target, null, nameResolverFactory, NAMERESOLVER_ARGS);
142+
FakeNameResolver nameResolver
143+
= (FakeNameResolver) ((RetryingNameResolver) ManagedChannelImpl.getNameResolver(
144+
target, null, nameResolverFactory, NAMERESOLVER_ARGS)).getRetriedNameResolver();
144145
assertNotNull(nameResolver);
145146
assertEquals(expectedUri, nameResolver.uri);
146147
assertEquals(expectedUriString, nameResolver.uri.toString());

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@ public String getPolicyName() {
280280
ArgumentCaptor.forClass(ClientStreamListener.class);
281281

282282
private void createChannel(ClientInterceptor... interceptors) {
283+
createChannel(false, interceptors);
284+
}
285+
286+
private void createChannel(boolean nameResolutionExpectedToFail,
287+
ClientInterceptor... interceptors) {
283288
checkState(channel == null);
284289

285290
channel = new ManagedChannelImpl(
@@ -288,7 +293,7 @@ channelBuilder, mockTransportFactory, new FakeBackoffPolicyProvider(),
288293
timer.getTimeProvider());
289294

290295
if (requestConnection) {
291-
int numExpectedTasks = 0;
296+
int numExpectedTasks = nameResolutionExpectedToFail ? 1 : 0;
292297

293298
// Force-exit the initial idle-mode
294299
channel.syncContext.execute(new Runnable() {
@@ -3000,7 +3005,7 @@ public void channelTracing_nameResolvingErrorEvent() throws Exception {
30003005
FakeNameResolverFactory nameResolverFactory =
30013006
new FakeNameResolverFactory.Builder(expectedUri).setError(error).build();
30023007
channelBuilder.nameResolverFactory(nameResolverFactory);
3003-
createChannel();
3008+
createChannel(true);
30043009

30053010
assertThat(getStats(channel).channelTrace.events).contains(new ChannelTrace.Event.Builder()
30063011
.setDescription("Failed to resolve name: " + error)
@@ -3503,10 +3508,11 @@ public double nextDouble() {
35033508
ArgumentCaptor<Helper> helperCaptor = ArgumentCaptor.forClass(Helper.class);
35043509
verify(mockLoadBalancerProvider).newLoadBalancer(helperCaptor.capture());
35053510
helper = helperCaptor.getValue();
3506-
verify(mockLoadBalancer).acceptResolvedAddresses(
3507-
ResolvedAddresses.newBuilder()
3508-
.setAddresses(nameResolverFactory.servers)
3509-
.build());
3511+
verify(mockLoadBalancer).acceptResolvedAddresses(resolvedAddressCaptor.capture());
3512+
ResolvedAddresses resolvedAddresses = resolvedAddressCaptor.getValue();
3513+
assertThat(resolvedAddresses.getAddresses()).isEqualTo(nameResolverFactory.servers);
3514+
assertThat(resolvedAddresses.getAttributes()
3515+
.get(RetryingNameResolver.RESOLUTION_RESULT_LISTENER_KEY)).isNotNull();
35103516

35113517
// simulating request connection and then transport ready after resolved address
35123518
Subchannel subchannel =
@@ -3609,10 +3615,11 @@ public void hedgingScheduledThenChannelShutdown_hedgeShouldStillHappen_newCallSh
36093615
ArgumentCaptor<Helper> helperCaptor = ArgumentCaptor.forClass(Helper.class);
36103616
verify(mockLoadBalancerProvider).newLoadBalancer(helperCaptor.capture());
36113617
helper = helperCaptor.getValue();
3612-
verify(mockLoadBalancer).acceptResolvedAddresses(
3613-
ResolvedAddresses.newBuilder()
3614-
.setAddresses(nameResolverFactory.servers)
3615-
.build());
3618+
verify(mockLoadBalancer).acceptResolvedAddresses(resolvedAddressCaptor.capture());
3619+
ResolvedAddresses resolvedAddresses = resolvedAddressCaptor.getValue();
3620+
assertThat(resolvedAddresses.getAddresses()).isEqualTo(nameResolverFactory.servers);
3621+
assertThat(resolvedAddresses.getAttributes()
3622+
.get(RetryingNameResolver.RESOLUTION_RESULT_LISTENER_KEY)).isNotNull();
36163623

36173624
// simulating request connection and then transport ready after resolved address
36183625
Subchannel subchannel =

0 commit comments

Comments
 (0)