Skip to content

Commit 57dc064

Browse files
committed
Feat: recursively propagate childChannelConfigurator in OOB and xDS control plane channels
1 parent f74e97b commit 57dc064

4 files changed

Lines changed: 94 additions & 0 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,6 +1501,7 @@ protected ManagedChannelBuilder<?> delegate() {
15011501
// Note that we follow the global configurator pattern and try to fuse the configurations as
15021502
// soon as the builder gets created
15031503
channelConfigurator.configureChannelBuilder(builder);
1504+
builder.childChannelConfigurator(channelConfigurator);
15041505

15051506
return builder
15061507
// TODO(zdapeng): executors should not outlive the parent channel.

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,48 @@ protected int priority() {
531531
assertSame(configurator, actualArgs.get().getChildChannelConfigurator());
532532
}
533533

534+
@Test
535+
public void childChannelConfigurator_passedToResolvingOobChannelNameResolverArgs() {
536+
ChannelConfigurator configurator = builder -> { };
537+
channelBuilder.childChannelConfigurator(configurator);
538+
AtomicReference<NameResolver.Args> oobArgs = new AtomicReference<>();
539+
channelBuilder.nameResolverRegistry.register(new NameResolverProvider() {
540+
@Override
541+
public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) {
542+
if ("oobauthority".equals(targetUri.getAuthority())
543+
|| "oobauthority".equals(targetUri.getPath())
544+
|| targetUri.toString().contains("oobauthority")) {
545+
oobArgs.set(args);
546+
}
547+
NameResolver resolver = mock(NameResolver.class);
548+
when(resolver.getServiceAuthority()).thenReturn(
549+
targetUri.getAuthority() != null ? targetUri.getAuthority() : targetUri.getPath());
550+
return resolver;
551+
}
552+
553+
@Override
554+
public String getDefaultScheme() {
555+
return expectedUri.getScheme();
556+
}
557+
558+
@Override
559+
protected boolean isAvailable() {
560+
return true;
561+
}
562+
563+
@Override
564+
protected int priority() {
565+
return 10;
566+
}
567+
});
568+
createChannel();
569+
ManagedChannel oob = helper.createResolvingOobChannelBuilder("oobauthority").build();
570+
oob.getState(true);
571+
assertNotNull(oobArgs.get());
572+
assertSame(configurator, oobArgs.get().getChildChannelConfigurator());
573+
oob.shutdownNow();
574+
}
575+
534576
@Test
535577
public void startCallBeforeNameResolution() throws Exception {
536578
FakeNameResolverFactory nameResolverFactory =

xds/src/main/java/io/grpc/xds/GrpcXdsTransportFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ public GrpcXdsTransport(Bootstrapper.ServerInfo serverInfo,
120120
.keepAliveTime(5, TimeUnit.MINUTES);
121121
if (channelConfigurator != null) {
122122
channelConfigurator.configureChannelBuilder(channelBuilder);
123+
channelBuilder.childChannelConfigurator(channelConfigurator);
123124
}
124125
this.channel = channelBuilder.build();
125126
this.callCredentials = callCredentials;

xds/src/test/java/io/grpc/xds/GrpcXdsTransportFactoryTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
package io.grpc.xds;
1818

1919
import static com.google.common.truth.Truth.assertThat;
20+
import static org.junit.Assert.assertNotNull;
21+
import static org.junit.Assert.assertSame;
2022
import static org.mockito.Mockito.mock;
2123
import static org.mockito.Mockito.verify;
24+
import static org.mockito.Mockito.when;
2225

2326
import com.google.common.util.concurrent.SettableFuture;
2427
import io.envoyproxy.envoy.service.discovery.v3.AggregatedDiscoveryServiceGrpc;
@@ -35,6 +38,9 @@
3538
import io.grpc.InsecureServerCredentials;
3639
import io.grpc.ManagedChannelBuilder;
3740
import io.grpc.MethodDescriptor;
41+
import io.grpc.NameResolver;
42+
import io.grpc.NameResolverProvider;
43+
import io.grpc.NameResolverRegistry;
3844
import io.grpc.NoopClientCall;
3945
import io.grpc.Server;
4046
import io.grpc.Status;
@@ -43,9 +49,11 @@
4349
import io.grpc.testing.TestMethodDescriptors;
4450
import io.grpc.xds.client.Bootstrapper;
4551
import io.grpc.xds.client.XdsTransportFactory;
52+
import java.net.URI;
4653
import java.util.concurrent.BlockingQueue;
4754
import java.util.concurrent.LinkedBlockingQueue;
4855
import java.util.concurrent.TimeUnit;
56+
import java.util.concurrent.atomic.AtomicReference;
4957
import org.junit.After;
5058
import org.junit.Before;
5159
import org.junit.Rule;
@@ -280,6 +288,48 @@ public void configureChannelBuilder(ManagedChannelBuilder<?> builder) {
280288
transport.shutdown();
281289
}
282290

291+
@Test
292+
public void useChannelConfigurator_setsChildChannelConfigurator() {
293+
final AtomicReference<NameResolver.Args> capturedArgs = new AtomicReference<>();
294+
NameResolverProvider testProvider = new NameResolverProvider() {
295+
@Override
296+
public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) {
297+
capturedArgs.set(args);
298+
NameResolver resolver = mock(NameResolver.class);
299+
when(resolver.getServiceAuthority()).thenReturn("localhost:8080");
300+
return resolver;
301+
}
302+
303+
@Override
304+
public String getDefaultScheme() {
305+
return "test-xds-transport";
306+
}
307+
308+
@Override
309+
protected boolean isAvailable() {
310+
return true;
311+
}
312+
313+
@Override
314+
protected int priority() {
315+
return 10;
316+
}
317+
};
318+
NameResolverRegistry.getDefaultRegistry().register(testProvider);
319+
try {
320+
ChannelConfigurator configurer = builder -> { };
321+
GrpcXdsTransportFactory factory = new GrpcXdsTransportFactory(null, configurer);
322+
XdsTransportFactory.XdsTransport transport = factory.create(
323+
Bootstrapper.ServerInfo.create(
324+
"test-xds-transport://localhost:8080", InsecureChannelCredentials.create()));
325+
assertNotNull(capturedArgs.get());
326+
assertSame(configurer, capturedArgs.get().getChildChannelConfigurator());
327+
transport.shutdown();
328+
} finally {
329+
NameResolverRegistry.getDefaultRegistry().deregister(testProvider);
330+
}
331+
}
332+
283333
@Test
284334
public void useChannelConfigurator_throwsException_propagates() {
285335
final RuntimeException testException = new RuntimeException("test exception");

0 commit comments

Comments
 (0)