From 2a5b5541b98f55575179cac95f5de1ad924178ba Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Wed, 22 Jul 2026 07:38:44 +0000 Subject: [PATCH 1/6] Fix: Append child channel configurators instead of overwriting --- .../internal/ManagedChannelImplBuilder.java | 12 ++++- .../ManagedChannelImplBuilderTest.java | 12 +---- .../grpc/internal/ManagedChannelImplTest.java | 20 +++++++-- .../java/io/grpc/xds/XdsServerBuilder.java | 11 ++++- .../grpc/xds/GrpcXdsTransportFactoryTest.java | 12 +++-- .../io/grpc/xds/XdsServerBuilderTest.java | 44 +++++++++++++++++-- 6 files changed, 87 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java index 054075a1909..008891b30f3 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java @@ -762,8 +762,16 @@ protected ManagedChannelImplBuilder addMetricSink(MetricSink metricSink) { @Override public ManagedChannelImplBuilder childChannelConfigurator( ChannelConfigurator channelConfigurator) { - this.channelConfigurator = checkNotNull(channelConfigurator, - "childChannelConfigurator"); + checkNotNull(channelConfigurator, "childChannelConfigurator"); + if (this.channelConfigurator == null) { + this.channelConfigurator = channelConfigurator; + } else { + ChannelConfigurator oldConfigurator = this.channelConfigurator; + this.channelConfigurator = builder -> { + oldConfigurator.configureChannelBuilder(builder); + channelConfigurator.configureChannelBuilder(builder); + }; + } return this; } diff --git a/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java b/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java index 2711c9af4b2..843f443ffdb 100644 --- a/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java +++ b/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java @@ -808,13 +808,6 @@ public void setNameResolverExtArgs() { assertThat(builder.nameResolverCustomArgs.get(testKey)).isEqualTo(42); } - @Test - public void childChannelConfigurator_setsField() { - ChannelConfigurator configurator = builder -> { }; - assertSame(builder, builder.childChannelConfigurator(configurator)); - assertSame(configurator, builder.channelConfigurator); - } - @Test public void childChannelConfigurator_propagatesMetricsAndInterceptors_xdsTarget() { // Setup Mocks @@ -902,16 +895,13 @@ public String getDefaultScheme() { assertNotNull("Child channel configurator should be present in NameResolver.Args", channelConfiguratorInArgs); - // Verify the configurator is the one we passed - assertThat(channelConfiguratorInArgs).isSameInstanceAs(configurator); - // Verify the configurator logically applies (by running it on a real builder) ManagedChannelImplBuilder childBuilder = new ManagedChannelImplBuilder( "xds:///child-service-target", mockClientTransportFactoryBuilder, new FixedPortProvider(DUMMY_PORT)); - configurator.configureChannelBuilder(childBuilder); + channelConfiguratorInArgs.configureChannelBuilder(childBuilder); assertThat(childBuilder.metricSinks).contains(mockMetricSink); } diff --git a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java index 42fb374a68b..e958fcdae00 100644 --- a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java +++ b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java @@ -499,7 +499,10 @@ public void immediateDeadlineExceeded() { @Test public void childChannelConfigurator_passedToNameResolverArgs() { - ChannelConfigurator configurator = builder -> { }; + final boolean[] configuratorInvoked = new boolean[1]; + ChannelConfigurator configurator = builder -> { + configuratorInvoked[0] = true; + }; channelBuilder.childChannelConfigurator(configurator); AtomicReference actualArgs = new AtomicReference<>(); channelBuilder.nameResolverRegistry.register(new NameResolverProvider() { @@ -528,12 +531,18 @@ protected int priority() { }); createChannel(); assertNotNull(actualArgs.get()); - assertSame(configurator, actualArgs.get().getChildChannelConfigurator()); + ChannelConfigurator childConfigurator = actualArgs.get().getChildChannelConfigurator(); + assertNotNull(childConfigurator); + childConfigurator.configureChannelBuilder(channelBuilder); + assertTrue(configuratorInvoked[0]); } @Test public void childChannelConfigurator_passedToResolvingOobChannelNameResolverArgs() { - ChannelConfigurator configurator = builder -> { }; + final boolean[] configuratorInvoked = new boolean[1]; + ChannelConfigurator configurator = builder -> { + configuratorInvoked[0] = true; + }; channelBuilder.childChannelConfigurator(configurator); AtomicReference oobArgs = new AtomicReference<>(); channelBuilder.nameResolverRegistry.register(new NameResolverProvider() { @@ -567,7 +576,10 @@ protected int priority() { ManagedChannel oob = helper.createResolvingOobChannelBuilder("oobauthority").build(); oob.getState(true); assertNotNull(oobArgs.get()); - assertSame(configurator, oobArgs.get().getChildChannelConfigurator()); + ChannelConfigurator childConfigurator = oobArgs.get().getChildChannelConfigurator(); + assertNotNull(childConfigurator); + childConfigurator.configureChannelBuilder(channelBuilder); + assertTrue(configuratorInvoked[0]); oob.shutdownNow(); } diff --git a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java index 1c0eb3cd024..38e93adeadf 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java @@ -113,7 +113,16 @@ public XdsServerBuilder drainGraceTime(long drainGraceTime, TimeUnit drainGraceT * @return this */ public XdsServerBuilder childChannelConfigurator(ChannelConfigurator channelConfigurator) { - this.channelConfigurator = checkNotNull(channelConfigurator, "channelConfigurator"); + checkNotNull(channelConfigurator, "channelConfigurator"); + if (this.channelConfigurator == null) { + this.channelConfigurator = channelConfigurator; + } else { + ChannelConfigurator oldConfigurator = this.channelConfigurator; + this.channelConfigurator = builder -> { + oldConfigurator.configureChannelBuilder(builder); + channelConfigurator.configureChannelBuilder(builder); + }; + } return this; } diff --git a/xds/src/test/java/io/grpc/xds/GrpcXdsTransportFactoryTest.java b/xds/src/test/java/io/grpc/xds/GrpcXdsTransportFactoryTest.java index e0b41f64943..d6c3c6ea69e 100644 --- a/xds/src/test/java/io/grpc/xds/GrpcXdsTransportFactoryTest.java +++ b/xds/src/test/java/io/grpc/xds/GrpcXdsTransportFactoryTest.java @@ -18,7 +18,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -260,13 +259,20 @@ protected int priority() { }; NameResolverRegistry.getDefaultRegistry().register(testProvider); try { - ChannelConfigurator configurer = builder -> { }; + final boolean[] configuratorInvoked = new boolean[1]; + ChannelConfigurator configurer = builder -> { + configuratorInvoked[0] = true; + }; GrpcXdsTransportFactory factory = new GrpcXdsTransportFactory(null, configurer); XdsTransportFactory.XdsTransport transport = factory.create( Bootstrapper.ServerInfo.create( "test-xds-transport://localhost:8080", InsecureChannelCredentials.create())); assertNotNull(capturedArgs.get()); - assertSame(configurer, capturedArgs.get().getChildChannelConfigurator()); + ChannelConfigurator childConfigurator = capturedArgs.get().getChildChannelConfigurator(); + assertNotNull(childConfigurator); + ManagedChannelBuilder testBuilder = mock(ManagedChannelBuilder.class); + childConfigurator.configureChannelBuilder(testBuilder); + assertThat(configuratorInvoked[0]).isTrue(); transport.shutdown(); } finally { NameResolverRegistry.getDefaultRegistry().deregister(testProvider); diff --git a/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java b/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java index 503f1b670c0..b4eb862e9bb 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java @@ -18,9 +18,9 @@ import static com.google.common.truth.Truth.assertThat; import static io.grpc.xds.XdsServerTestHelper.buildTestListener; +import static org.junit.Assert.assertNotSame; import static org.junit.Assert.fail; import static org.mockito.Mockito.any; -import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; @@ -332,7 +332,10 @@ public void testOverrideBootstrap() throws Exception { @Test public void start_passesChannelConfiguratorToClientPoolFactory() throws Exception { - ChannelConfigurator configurer = builder -> { }; + final boolean[] configuratorInvoked = new boolean[1]; + ChannelConfigurator configurer = builder -> { + configuratorInvoked[0] = true; + }; XdsClientPoolFactory mockPoolFactory = mock(XdsClientPoolFactory.class); @SuppressWarnings("unchecked") ObjectPool mockPool = mock(ObjectPool.class); @@ -346,8 +349,43 @@ public void start_passesChannelConfiguratorToClientPoolFactory() throws Exceptio Future unused = startServerAsync(); + ArgumentCaptor configuratorCaptor = + ArgumentCaptor.forClass(ChannelConfigurator.class); verify(mockPoolFactory).getOrCreate( - any(), any(), any(), eq(configurer)); + any(), any(), any(), configuratorCaptor.capture()); + + io.grpc.ManagedChannelBuilder testBuilder = mock(io.grpc.ManagedChannelBuilder.class); + configuratorCaptor.getValue().configureChannelBuilder(testBuilder); + assertThat(configuratorInvoked[0]).isTrue(); + } + + @Test + public void childChannelConfigurator_appendsConfigurators() throws Exception { + ChannelConfigurator configurer1 = builder -> { }; + ChannelConfigurator configurer2 = builder -> { }; + + XdsClientPoolFactory mockPoolFactory = mock(XdsClientPoolFactory.class); + @SuppressWarnings("unchecked") + ObjectPool mockPool = mock(ObjectPool.class); + when(mockPool.getObject()).thenReturn(xdsClient); + when(mockPoolFactory.getOrCreate(any(), any(), any(), any())).thenReturn(mockPool); + + buildBuilder(null); + builder.childChannelConfigurator(configurer1); + builder.childChannelConfigurator(configurer2); + builder.xdsClientPoolFactory(mockPoolFactory); + xdsServer = cleanupRule.register((XdsServerWrapper) builder.build()); + + Future unused = startServerAsync(); + + // The captured configurator should be a composite of configurer1 and configurer2 + ArgumentCaptor captor = ArgumentCaptor.forClass(ChannelConfigurator.class); + verify(mockPoolFactory).getOrCreate( + any(), any(), any(), captor.capture()); + ChannelConfigurator captured = captor.getValue(); + + assertNotSame(configurer1, captured); + assertNotSame(configurer2, captured); } @Test From cdb4d65d07ab52c3db8e42933e437c02bdbb6a33 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Wed, 22 Jul 2026 08:32:51 +0000 Subject: [PATCH 2/6] Optimize channel configurator initialization --- core/src/main/java/io/grpc/internal/ManagedChannelImpl.java | 4 ++-- .../java/io/grpc/internal/ManagedChannelImplBuilder.java | 3 ++- xds/src/main/java/io/grpc/xds/XdsServerBuilder.java | 6 ++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index 00df05a0c00..17176d810e3 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java @@ -554,8 +554,8 @@ ClientStream newSubstream( Supplier stopwatchSupplier, List interceptors, final TimeProvider timeProvider) { - this.channelConfigurator = checkNotNull(builder.channelConfigurator, - "channelConfigurator"); + this.channelConfigurator = builder.channelConfigurator != null + ? builder.channelConfigurator : b -> { }; this.target = checkNotNull(builder.target, "target"); this.logId = InternalLogId.allocate("Channel", target); this.timeProvider = checkNotNull(timeProvider, "timeProvider"); diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java index 008891b30f3..1c5e9953a8a 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java @@ -150,7 +150,8 @@ public static ManagedChannelBuilder forTarget(String target) { } - ChannelConfigurator channelConfigurator = builder -> { }; + @Nullable + ChannelConfigurator channelConfigurator = null; ObjectPool executorPool = DEFAULT_EXECUTOR_POOL; diff --git a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java index 38e93adeadf..c79f3c323eb 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java @@ -41,6 +41,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; +import javax.annotation.Nullable; /** * A version of {@link ServerBuilder} to create xDS managed servers. @@ -59,7 +60,8 @@ public final class XdsServerBuilder extends ForwardingServerBuilder bootstrapOverride; private long drainGraceTime = 10; private TimeUnit drainGraceTimeUnit = TimeUnit.MINUTES; - private ChannelConfigurator channelConfigurator = builder -> { }; + @Nullable + private ChannelConfigurator channelConfigurator = null; private XdsServerBuilder(NettyServerBuilder nettyDelegate, int port) { @@ -155,7 +157,7 @@ public Server build() { InternalNettyServerBuilder.eagAttributes(delegate, builder.build()); return new XdsServerWrapper("0.0.0.0:" + port, delegate, xdsServingStatusListener, filterChainSelectorManager, xdsClientPoolFactory, bootstrapOverride, filterRegistry, - this.channelConfigurator); + this.channelConfigurator != null ? this.channelConfigurator : b -> { }); } @VisibleForTesting From 5f6c26ba3d7d41f1d739a163d3d0ef0eff9fab71 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Wed, 22 Jul 2026 08:49:58 +0000 Subject: [PATCH 3/6] Revert nullable channel configurator and unconditionally append --- .../io/grpc/internal/ManagedChannelImpl.java | 4 ++-- .../internal/ManagedChannelImplBuilder.java | 17 ++++++----------- .../java/io/grpc/xds/XdsServerBuilder.java | 19 +++++++------------ 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index 17176d810e3..00df05a0c00 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java @@ -554,8 +554,8 @@ ClientStream newSubstream( Supplier stopwatchSupplier, List interceptors, final TimeProvider timeProvider) { - this.channelConfigurator = builder.channelConfigurator != null - ? builder.channelConfigurator : b -> { }; + this.channelConfigurator = checkNotNull(builder.channelConfigurator, + "channelConfigurator"); this.target = checkNotNull(builder.target, "target"); this.logId = InternalLogId.allocate("Channel", target); this.timeProvider = checkNotNull(timeProvider, "timeProvider"); diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java index 1c5e9953a8a..fd1631b1a82 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java @@ -150,8 +150,7 @@ public static ManagedChannelBuilder forTarget(String target) { } - @Nullable - ChannelConfigurator channelConfigurator = null; + ChannelConfigurator channelConfigurator = builder -> { }; ObjectPool executorPool = DEFAULT_EXECUTOR_POOL; @@ -764,15 +763,11 @@ protected ManagedChannelImplBuilder addMetricSink(MetricSink metricSink) { public ManagedChannelImplBuilder childChannelConfigurator( ChannelConfigurator channelConfigurator) { checkNotNull(channelConfigurator, "childChannelConfigurator"); - if (this.channelConfigurator == null) { - this.channelConfigurator = channelConfigurator; - } else { - ChannelConfigurator oldConfigurator = this.channelConfigurator; - this.channelConfigurator = builder -> { - oldConfigurator.configureChannelBuilder(builder); - channelConfigurator.configureChannelBuilder(builder); - }; - } + ChannelConfigurator oldConfigurator = this.channelConfigurator; + this.channelConfigurator = builder -> { + oldConfigurator.configureChannelBuilder(builder); + channelConfigurator.configureChannelBuilder(builder); + }; return this; } diff --git a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java index c79f3c323eb..c65303e15a8 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java @@ -60,8 +60,7 @@ public final class XdsServerBuilder extends ForwardingServerBuilder bootstrapOverride; private long drainGraceTime = 10; private TimeUnit drainGraceTimeUnit = TimeUnit.MINUTES; - @Nullable - private ChannelConfigurator channelConfigurator = null; + private ChannelConfigurator channelConfigurator = builder -> { }; private XdsServerBuilder(NettyServerBuilder nettyDelegate, int port) { @@ -116,15 +115,11 @@ public XdsServerBuilder drainGraceTime(long drainGraceTime, TimeUnit drainGraceT */ public XdsServerBuilder childChannelConfigurator(ChannelConfigurator channelConfigurator) { checkNotNull(channelConfigurator, "channelConfigurator"); - if (this.channelConfigurator == null) { - this.channelConfigurator = channelConfigurator; - } else { - ChannelConfigurator oldConfigurator = this.channelConfigurator; - this.channelConfigurator = builder -> { - oldConfigurator.configureChannelBuilder(builder); - channelConfigurator.configureChannelBuilder(builder); - }; - } + ChannelConfigurator oldConfigurator = this.channelConfigurator; + this.channelConfigurator = builder -> { + oldConfigurator.configureChannelBuilder(builder); + channelConfigurator.configureChannelBuilder(builder); + }; return this; } @@ -157,7 +152,7 @@ public Server build() { InternalNettyServerBuilder.eagAttributes(delegate, builder.build()); return new XdsServerWrapper("0.0.0.0:" + port, delegate, xdsServingStatusListener, filterChainSelectorManager, xdsClientPoolFactory, bootstrapOverride, filterRegistry, - this.channelConfigurator != null ? this.channelConfigurator : b -> { }); + this.channelConfigurator); } @VisibleForTesting From ffffce33d59bf8c3e8283bb641ba374755c613e6 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Wed, 22 Jul 2026 08:56:59 +0000 Subject: [PATCH 4/6] Clean up fully qualified ManagedChannelBuilder usage in test and unused imports --- xds/src/main/java/io/grpc/xds/XdsServerBuilder.java | 2 +- xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java index c65303e15a8..1e386a8e593 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java @@ -41,7 +41,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; -import javax.annotation.Nullable; + /** * A version of {@link ServerBuilder} to create xDS managed servers. diff --git a/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java b/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java index b4eb862e9bb..dce077169c7 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerBuilderTest.java @@ -33,6 +33,7 @@ import io.grpc.BindableService; import io.grpc.ChannelConfigurator; import io.grpc.InsecureServerCredentials; +import io.grpc.ManagedChannelBuilder; import io.grpc.ServerServiceDefinition; import io.grpc.Status; import io.grpc.StatusException; @@ -354,7 +355,7 @@ public void start_passesChannelConfiguratorToClientPoolFactory() throws Exceptio verify(mockPoolFactory).getOrCreate( any(), any(), any(), configuratorCaptor.capture()); - io.grpc.ManagedChannelBuilder testBuilder = mock(io.grpc.ManagedChannelBuilder.class); + ManagedChannelBuilder testBuilder = mock(ManagedChannelBuilder.class); configuratorCaptor.getValue().configureChannelBuilder(testBuilder); assertThat(configuratorInvoked[0]).isTrue(); } From c0b6276a185b657c41e48d29d89c1e62a87585f1 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Wed, 22 Jul 2026 10:07:31 +0000 Subject: [PATCH 5/6] Add E2E tests for childChannelConfigurator append functionality in xDS --- .../FakeControlPlaneXdsIntegrationTest.java | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/xds/src/test/java/io/grpc/xds/FakeControlPlaneXdsIntegrationTest.java b/xds/src/test/java/io/grpc/xds/FakeControlPlaneXdsIntegrationTest.java index d6361915940..65f562446b4 100644 --- a/xds/src/test/java/io/grpc/xds/FakeControlPlaneXdsIntegrationTest.java +++ b/xds/src/test/java/io/grpc/xds/FakeControlPlaneXdsIntegrationTest.java @@ -375,17 +375,16 @@ public void pingPong_logicalDns_authorityOverride() { @Test public void childChannelConfigurator_passesMetricSinkToChannel_E2E() throws Exception { - CountingMetricSink sink = new CountingMetricSink(); - ChannelConfigurator configurator = new ChannelConfigurator() { - @Override - public void configureChannelBuilder(ManagedChannelBuilder builder) { - InternalManagedChannelBuilder.addMetricSink(builder, sink); - } - }; + CountingMetricSink sink1 = new CountingMetricSink(); + ChannelConfigurator configurator1 = builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink1); + + CountingMetricSink sink2 = new CountingMetricSink(); + ChannelConfigurator configurator2 = builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink2); ManagedChannel channel = Grpc.newChannelBuilder("test-xds:///test-server", InsecureChannelCredentials.create()) - .childChannelConfigurator(configurator) + .childChannelConfigurator(configurator1) + .childChannelConfigurator(configurator2) .build(); try { @@ -394,8 +393,9 @@ public void configureChannelBuilder(ManagedChannelBuilder builder) { blockingStub.unaryRpc(SimpleRequest.getDefaultInstance()); // The xDS client inside the channel configurator will have created an ADS stream. - // The metric sink should have received attempt or connection metrics. - sink.awaitCall(); + // Both metric sinks should have received attempt or connection metrics. + sink1.awaitCall(); + sink2.awaitCall(); } finally { channel.shutdownNow(); } @@ -403,11 +403,11 @@ public void configureChannelBuilder(ManagedChannelBuilder builder) { @Test public void childChannelConfigurator_passesMetricSinkToServer_E2E() throws Exception { - CountingMetricSink sink = new CountingMetricSink(); - ChannelConfigurator configurator = builder -> { - // Child channels (xDS client connections) created by this server get the sink. - InternalManagedChannelBuilder.addMetricSink(builder, sink); - }; + CountingMetricSink sink1 = new CountingMetricSink(); + ChannelConfigurator configurator1 = builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink1); + + CountingMetricSink sink2 = new CountingMetricSink(); + ChannelConfigurator configurator2 = builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink2); // We start an XdsServer manually. // XdsServer needs RDS, LDS, etc. from control plane. @@ -415,13 +415,15 @@ public void childChannelConfigurator_passesMetricSinkToServer_E2E() throws Excep 0, InsecureServerCredentials.create()) .addService(new SimpleServiceGrpc.SimpleServiceImplBase() {}) .overrideBootstrapForTest(controlPlane.defaultBootstrapOverride()) - .childChannelConfigurator(configurator); + .childChannelConfigurator(configurator1) + .childChannelConfigurator(configurator2); Server childServer = serverBuilder.build().start(); try { // The server xDS client will connect to control plane to get LDS. - sink.awaitCall(); + sink1.awaitCall(); + sink2.awaitCall(); } finally { childServer.shutdownNow(); } From 91c5701dc9cc02564c26d09536e4e1795d891ec0 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Wed, 22 Jul 2026 10:34:28 +0000 Subject: [PATCH 6/6] Fix checkstyle errors in E2E tests --- .../xds/FakeControlPlaneXdsIntegrationTest.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/xds/src/test/java/io/grpc/xds/FakeControlPlaneXdsIntegrationTest.java b/xds/src/test/java/io/grpc/xds/FakeControlPlaneXdsIntegrationTest.java index 65f562446b4..e7d5d783546 100644 --- a/xds/src/test/java/io/grpc/xds/FakeControlPlaneXdsIntegrationTest.java +++ b/xds/src/test/java/io/grpc/xds/FakeControlPlaneXdsIntegrationTest.java @@ -62,7 +62,6 @@ import io.grpc.LoadBalancerRegistry; import io.grpc.LongCounterMetricInstrument; import io.grpc.ManagedChannel; -import io.grpc.ManagedChannelBuilder; import io.grpc.Metadata; import io.grpc.MethodDescriptor; import io.grpc.NoopMetricSink; @@ -376,10 +375,12 @@ public void pingPong_logicalDns_authorityOverride() { @Test public void childChannelConfigurator_passesMetricSinkToChannel_E2E() throws Exception { CountingMetricSink sink1 = new CountingMetricSink(); - ChannelConfigurator configurator1 = builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink1); + ChannelConfigurator configurator1 = + builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink1); CountingMetricSink sink2 = new CountingMetricSink(); - ChannelConfigurator configurator2 = builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink2); + ChannelConfigurator configurator2 = + builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink2); ManagedChannel channel = Grpc.newChannelBuilder("test-xds:///test-server", InsecureChannelCredentials.create()) @@ -404,10 +405,12 @@ public void childChannelConfigurator_passesMetricSinkToChannel_E2E() throws Exce @Test public void childChannelConfigurator_passesMetricSinkToServer_E2E() throws Exception { CountingMetricSink sink1 = new CountingMetricSink(); - ChannelConfigurator configurator1 = builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink1); + ChannelConfigurator configurator1 = + builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink1); CountingMetricSink sink2 = new CountingMetricSink(); - ChannelConfigurator configurator2 = builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink2); + ChannelConfigurator configurator2 = + builder -> InternalManagedChannelBuilder.addMetricSink(builder, sink2); // We start an XdsServer manually. // XdsServer needs RDS, LDS, etc. from control plane.