Skip to content

Commit a650c6f

Browse files
authored
core: ManagedChannelImpl to always use RetryingNameResolver (#10328) (#10330)
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 68af073 commit a650c6f

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
@@ -748,9 +748,6 @@ static NameResolver getNameResolver(
748748
String target, @Nullable final String overrideAuthority,
749749
NameResolver.Factory nameResolverFactory, NameResolver.Args nameResolverArgs) {
750750
NameResolver resolver = getNameResolver(target, nameResolverFactory, nameResolverArgs);
751-
if (overrideAuthority == null) {
752-
return resolver;
753-
}
754751

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

768+
if (overrideAuthority == null) {
769+
return usedNameResolver;
770+
}
771+
771772
return new ForwardingNameResolver(usedNameResolver) {
772773
@Override
773774
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
@@ -279,6 +279,11 @@ public String getPolicyName() {
279279
ArgumentCaptor.forClass(ClientStreamListener.class);
280280

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

284289
channel = new ManagedChannelImpl(
@@ -287,7 +292,7 @@ channelBuilder, mockTransportFactory, new FakeBackoffPolicyProvider(),
287292
timer.getTimeProvider());
288293

289294
if (requestConnection) {
290-
int numExpectedTasks = 0;
295+
int numExpectedTasks = nameResolutionExpectedToFail ? 1 : 0;
291296

292297
// Force-exit the initial idle-mode
293298
channel.syncContext.execute(new Runnable() {
@@ -2955,7 +2960,7 @@ public void channelTracing_nameResolvingErrorEvent() throws Exception {
29552960
FakeNameResolverFactory nameResolverFactory =
29562961
new FakeNameResolverFactory.Builder(expectedUri).setError(error).build();
29572962
channelBuilder.nameResolverFactory(nameResolverFactory);
2958-
createChannel();
2963+
createChannel(true);
29592964

29602965
assertThat(getStats(channel).channelTrace.events).contains(new ChannelTrace.Event.Builder()
29612966
.setDescription("Failed to resolve name: " + error)
@@ -3458,10 +3463,11 @@ public double nextDouble() {
34583463
ArgumentCaptor<Helper> helperCaptor = ArgumentCaptor.forClass(Helper.class);
34593464
verify(mockLoadBalancerProvider).newLoadBalancer(helperCaptor.capture());
34603465
helper = helperCaptor.getValue();
3461-
verify(mockLoadBalancer).acceptResolvedAddresses(
3462-
ResolvedAddresses.newBuilder()
3463-
.setAddresses(nameResolverFactory.servers)
3464-
.build());
3466+
verify(mockLoadBalancer).acceptResolvedAddresses(resolvedAddressCaptor.capture());
3467+
ResolvedAddresses resolvedAddresses = resolvedAddressCaptor.getValue();
3468+
assertThat(resolvedAddresses.getAddresses()).isEqualTo(nameResolverFactory.servers);
3469+
assertThat(resolvedAddresses.getAttributes()
3470+
.get(RetryingNameResolver.RESOLUTION_RESULT_LISTENER_KEY)).isNotNull();
34653471

34663472
// simulating request connection and then transport ready after resolved address
34673473
Subchannel subchannel =
@@ -3564,10 +3570,11 @@ public void hedgingScheduledThenChannelShutdown_hedgeShouldStillHappen_newCallSh
35643570
ArgumentCaptor<Helper> helperCaptor = ArgumentCaptor.forClass(Helper.class);
35653571
verify(mockLoadBalancerProvider).newLoadBalancer(helperCaptor.capture());
35663572
helper = helperCaptor.getValue();
3567-
verify(mockLoadBalancer).acceptResolvedAddresses(
3568-
ResolvedAddresses.newBuilder()
3569-
.setAddresses(nameResolverFactory.servers)
3570-
.build());
3573+
verify(mockLoadBalancer).acceptResolvedAddresses(resolvedAddressCaptor.capture());
3574+
ResolvedAddresses resolvedAddresses = resolvedAddressCaptor.getValue();
3575+
assertThat(resolvedAddresses.getAddresses()).isEqualTo(nameResolverFactory.servers);
3576+
assertThat(resolvedAddresses.getAttributes()
3577+
.get(RetryingNameResolver.RESOLUTION_RESULT_LISTENER_KEY)).isNotNull();
35713578

35723579
// simulating request connection and then transport ready after resolved address
35733580
Subchannel subchannel =

0 commit comments

Comments
 (0)