From b2edb33fff5ca8fb3980232bf92dc91059b42366 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 17 Feb 2025 14:26:37 +0530 Subject: [PATCH 1/7] Adds Grpc.newManagedChannel(String, ChannelCredentials, NameResolverRegistry) --- api/src/main/java/io/grpc/Grpc.java | 9 +++++++++ .../io/grpc/netty/UdsNettyChannelProviderTest.java | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/api/src/main/java/io/grpc/Grpc.java b/api/src/main/java/io/grpc/Grpc.java index baa9f5f0ab6..4d6d899a3b5 100644 --- a/api/src/main/java/io/grpc/Grpc.java +++ b/api/src/main/java/io/grpc/Grpc.java @@ -101,6 +101,15 @@ public static ManagedChannelBuilder newChannelBuilder( return ManagedChannelRegistry.getDefaultRegistry().newChannelBuilder(target, creds); } + /** + * Creates a channel builder with a target string, credentials and nameResolverRegistry. + */ + public static ManagedChannelBuilder newChannelBuilderForNameResolverRegistry(String target, + ChannelCredentials creds, NameResolverRegistry nameResolverRegistry) { + return ManagedChannelRegistry.getDefaultRegistry().newChannelBuilder(nameResolverRegistry, + target, creds); + } + /** * Creates a channel builder from a host, port, and credentials. The host and port are combined to * form an authority string and then passed to {@link #newChannelBuilder(String, diff --git a/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java b/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java index e0c3d5a8525..4e0497e82ac 100644 --- a/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java +++ b/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java @@ -28,6 +28,7 @@ import io.grpc.ManagedChannelProvider; import io.grpc.ManagedChannelProvider.NewChannelBuilderResult; import io.grpc.ManagedChannelRegistryAccessor; +import io.grpc.NameResolverRegistry; import io.grpc.TlsChannelCredentials; import io.grpc.stub.StreamObserver; import io.grpc.testing.GrpcCleanupRule; @@ -120,6 +121,19 @@ public void managedChannelRegistry_newChannelBuilder() { channel.shutdownNow(); } + @Test + public void managedChannelRegistry_newChannelBuilderForNameResolverRegistry() { + Assume.assumeTrue(Utils.isEpollAvailable()); + ManagedChannelBuilder managedChannelBuilder + = Grpc.newChannelBuilderForNameResolverRegistry("unix:///sock.sock", + InsecureChannelCredentials.create(), NameResolverRegistry.getDefaultRegistry()); + assertThat(managedChannelBuilder).isNotNull(); + ManagedChannel channel = managedChannelBuilder.build(); + assertThat(channel).isNotNull(); + assertThat(channel.authority()).isEqualTo("/sock.sock"); + channel.shutdownNow(); + } + @Test public void udsClientServerTestUsingProvider() throws IOException { Assume.assumeTrue(Utils.isEpollAvailable()); From 2b152ad04a8a8ea4d0dfde9a41461434ccbfd04d Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 19 Feb 2025 11:18:09 +0530 Subject: [PATCH 2/7] 1. refactors method name to make it overloaded 2. removes visibleForTesting 3. improves the test case --- api/src/main/java/io/grpc/Grpc.java | 2 +- api/src/main/java/io/grpc/ManagedChannelRegistry.java | 1 - .../io/grpc/netty/UdsNettyChannelProviderTest.java | 10 ++++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/io/grpc/Grpc.java b/api/src/main/java/io/grpc/Grpc.java index 4d6d899a3b5..280eeaec825 100644 --- a/api/src/main/java/io/grpc/Grpc.java +++ b/api/src/main/java/io/grpc/Grpc.java @@ -104,7 +104,7 @@ public static ManagedChannelBuilder newChannelBuilder( /** * Creates a channel builder with a target string, credentials and nameResolverRegistry. */ - public static ManagedChannelBuilder newChannelBuilderForNameResolverRegistry(String target, + public static ManagedChannelBuilder newChannelBuilder(String target, ChannelCredentials creds, NameResolverRegistry nameResolverRegistry) { return ManagedChannelRegistry.getDefaultRegistry().newChannelBuilder(nameResolverRegistry, target, creds); diff --git a/api/src/main/java/io/grpc/ManagedChannelRegistry.java b/api/src/main/java/io/grpc/ManagedChannelRegistry.java index aed5eca9abf..285d87b1e29 100644 --- a/api/src/main/java/io/grpc/ManagedChannelRegistry.java +++ b/api/src/main/java/io/grpc/ManagedChannelRegistry.java @@ -155,7 +155,6 @@ ManagedChannelBuilder newChannelBuilder(String target, ChannelCredentials cre return newChannelBuilder(NameResolverRegistry.getDefaultRegistry(), target, creds); } - @VisibleForTesting ManagedChannelBuilder newChannelBuilder(NameResolverRegistry nameResolverRegistry, String target, ChannelCredentials creds) { NameResolverProvider nameResolverProvider = null; diff --git a/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java b/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java index 4e0497e82ac..8ac42d2c851 100644 --- a/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java +++ b/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java @@ -30,6 +30,7 @@ import io.grpc.ManagedChannelRegistryAccessor; import io.grpc.NameResolverRegistry; import io.grpc.TlsChannelCredentials; +import io.grpc.internal.testing.FakeNameResolverProvider; import io.grpc.stub.StreamObserver; import io.grpc.testing.GrpcCleanupRule; import io.grpc.testing.protobuf.SimpleRequest; @@ -124,9 +125,14 @@ public void managedChannelRegistry_newChannelBuilder() { @Test public void managedChannelRegistry_newChannelBuilderForNameResolverRegistry() { Assume.assumeTrue(Utils.isEpollAvailable()); + NameResolverRegistry nameResolverRegistry = new NameResolverRegistry(); + DomainSocketAddress socketAddress = new DomainSocketAddress("test-server"); + FakeNameResolverProvider fakeNameResolverProvider = new FakeNameResolverProvider( + "unix:///sock.sock", socketAddress); + nameResolverRegistry.register(fakeNameResolverProvider); ManagedChannelBuilder managedChannelBuilder - = Grpc.newChannelBuilderForNameResolverRegistry("unix:///sock.sock", - InsecureChannelCredentials.create(), NameResolverRegistry.getDefaultRegistry()); + = Grpc.newChannelBuilder("unix:///sock.sock", + InsecureChannelCredentials.create(), nameResolverRegistry); assertThat(managedChannelBuilder).isNotNull(); ManagedChannel channel = managedChannelBuilder.build(); assertThat(channel).isNotNull(); From 439946fe4ceff09754098a8787929e184d8bac0a Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 25 Mar 2025 11:54:31 +0530 Subject: [PATCH 3/7] fix: exposes a new ManagedChannelProvider.newChannelBuilder with NameResolverRegistry and NameResolverProvider. --- api/src/main/java/io/grpc/ManagedChannelProvider.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/api/src/main/java/io/grpc/ManagedChannelProvider.java b/api/src/main/java/io/grpc/ManagedChannelProvider.java index 42941dfc809..1a521ae75b0 100644 --- a/api/src/main/java/io/grpc/ManagedChannelProvider.java +++ b/api/src/main/java/io/grpc/ManagedChannelProvider.java @@ -81,6 +81,16 @@ protected NewChannelBuilderResult newChannelBuilder(String target, ChannelCreden return NewChannelBuilderResult.error("ChannelCredentials are unsupported"); } + /** + * Creates a channel builder with a target string, credentials, NameResolverRegistry adn NameResolverProvider. + * Returns an error-string result if unable to understand the credentials. + */ + protected NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentials creds, + NameResolverRegistry nameResolverRegistry, + NameResolverProvider nameResolverProvider) { + return newChannelBuilder(target, creds); + } + /** * Returns the {@link SocketAddress} types this ManagedChannelProvider supports. */ From 8b7573652366689bdf9f31b8d63d6333cb5c2164 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 25 Mar 2025 12:14:01 +0530 Subject: [PATCH 4/7] style: fixes checkstyle --- api/src/main/java/io/grpc/ManagedChannelProvider.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/io/grpc/ManagedChannelProvider.java b/api/src/main/java/io/grpc/ManagedChannelProvider.java index 1a521ae75b0..27638cb859c 100644 --- a/api/src/main/java/io/grpc/ManagedChannelProvider.java +++ b/api/src/main/java/io/grpc/ManagedChannelProvider.java @@ -82,8 +82,9 @@ protected NewChannelBuilderResult newChannelBuilder(String target, ChannelCreden } /** - * Creates a channel builder with a target string, credentials, NameResolverRegistry adn NameResolverProvider. - * Returns an error-string result if unable to understand the credentials. + * Creates a channel builder with a target string, credentials, NameResolverRegistry + * and NameResolverProvider. Returns an error-string result if unable to + * understand the credentials. */ protected NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentials creds, NameResolverRegistry nameResolverRegistry, From 7e2c891ce0488df713c2b848721c7c82464fa666 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 24 Dec 2025 15:50:24 +0530 Subject: [PATCH 5/7] API for nameResolverRegistry --- api/src/main/java/io/grpc/Grpc.java | 30 +++++++++++++++---- .../java/io/grpc/ManagedChannelProvider.java | 21 +++++++++++-- .../java/io/grpc/ManagedChannelRegistry.java | 2 +- .../netty/UdsNettyChannelProviderTest.java | 20 ------------- 4 files changed, 44 insertions(+), 29 deletions(-) diff --git a/api/src/main/java/io/grpc/Grpc.java b/api/src/main/java/io/grpc/Grpc.java index 280eeaec825..cd25f79041b 100644 --- a/api/src/main/java/io/grpc/Grpc.java +++ b/api/src/main/java/io/grpc/Grpc.java @@ -102,12 +102,32 @@ public static ManagedChannelBuilder newChannelBuilder( } /** - * Creates a channel builder with a target string, credentials and nameResolverRegistry. + * Creates a channel builder with a target string, credentials, and a specific + * name resolver registry. + * + *

This method uses the {@link ManagedChannelRegistry#getDefaultRegistry()} to + * find an appropriate underlying transport provider based on the target and credentials. + * The provided {@code nameResolverRegistry} is used to resolve the target address + * into physical addresses (e.g., DNS or custom schemes). + * + * @param target the target URI for the channel, such as {@code "localhost:8080"} + * or {@code "dns:///example.com"} + * @param creds the channel credentials to use for secure communication + * @param nameResolverRegistry the registry used to look up {@link NameResolver} + * providers for the target + * @return a {@link ManagedChannelBuilder} instance configured with the given parameters + * @throws IllegalArgumentException if no provider is available for the given target + * or credentials + * @since 1.79.0 */ - public static ManagedChannelBuilder newChannelBuilder(String target, - ChannelCredentials creds, NameResolverRegistry nameResolverRegistry) { - return ManagedChannelRegistry.getDefaultRegistry().newChannelBuilder(nameResolverRegistry, - target, creds); + public static ManagedChannelBuilder newChannelBuilder( + String target, + ChannelCredentials creds, + NameResolverRegistry nameResolverRegistry) { + return ManagedChannelRegistry.getDefaultRegistry().newChannelBuilder( + nameResolverRegistry, + target, + creds); } /** diff --git a/api/src/main/java/io/grpc/ManagedChannelProvider.java b/api/src/main/java/io/grpc/ManagedChannelProvider.java index 27638cb859c..2ef0ee47ace 100644 --- a/api/src/main/java/io/grpc/ManagedChannelProvider.java +++ b/api/src/main/java/io/grpc/ManagedChannelProvider.java @@ -82,13 +82,28 @@ protected NewChannelBuilderResult newChannelBuilder(String target, ChannelCreden } /** - * Creates a channel builder with a target string, credentials, NameResolverRegistry - * and NameResolverProvider. Returns an error-string result if unable to - * understand the credentials. + * Creates a channel builder using the provided target, credentials, and resolution + * components. + * + *

This method allows for fine-grained control over name resolution by providing + * both a {@link NameResolverRegistry} and a specific {@link NameResolverProvider}. + * Unlike the public factory methods, this returns a {@link NewChannelBuilderResult}, + * which may contain an error string if the provided credentials or target are + * not supported by this provider. + * + * @param target the target URI for the channel + * @param creds the channel credentials to use + * @param nameResolverRegistry the registry used for looking up name resolvers + * @param nameResolverProvider a specific provider to use, or {@code null} to + * search the registry + * @return a {@link NewChannelBuilderResult} containing either the builder or an + * error description + * @since 1.79.0 */ protected NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentials creds, NameResolverRegistry nameResolverRegistry, NameResolverProvider nameResolverProvider) { + // Implementation note: Currently delegates to the simplified version return newChannelBuilder(target, creds); } diff --git a/api/src/main/java/io/grpc/ManagedChannelRegistry.java b/api/src/main/java/io/grpc/ManagedChannelRegistry.java index 285d87b1e29..7af4c55c2de 100644 --- a/api/src/main/java/io/grpc/ManagedChannelRegistry.java +++ b/api/src/main/java/io/grpc/ManagedChannelRegistry.java @@ -191,7 +191,7 @@ ManagedChannelBuilder newChannelBuilder(NameResolverRegistry nameResolverRegi continue; } ManagedChannelProvider.NewChannelBuilderResult result - = provider.newChannelBuilder(target, creds); + = provider.newChannelBuilder(target, creds, nameResolverRegistry, nameResolverProvider); if (result.getChannelBuilder() != null) { return result.getChannelBuilder(); } diff --git a/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java b/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java index 8ac42d2c851..e0c3d5a8525 100644 --- a/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java +++ b/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java @@ -28,9 +28,7 @@ import io.grpc.ManagedChannelProvider; import io.grpc.ManagedChannelProvider.NewChannelBuilderResult; import io.grpc.ManagedChannelRegistryAccessor; -import io.grpc.NameResolverRegistry; import io.grpc.TlsChannelCredentials; -import io.grpc.internal.testing.FakeNameResolverProvider; import io.grpc.stub.StreamObserver; import io.grpc.testing.GrpcCleanupRule; import io.grpc.testing.protobuf.SimpleRequest; @@ -122,24 +120,6 @@ public void managedChannelRegistry_newChannelBuilder() { channel.shutdownNow(); } - @Test - public void managedChannelRegistry_newChannelBuilderForNameResolverRegistry() { - Assume.assumeTrue(Utils.isEpollAvailable()); - NameResolverRegistry nameResolverRegistry = new NameResolverRegistry(); - DomainSocketAddress socketAddress = new DomainSocketAddress("test-server"); - FakeNameResolverProvider fakeNameResolverProvider = new FakeNameResolverProvider( - "unix:///sock.sock", socketAddress); - nameResolverRegistry.register(fakeNameResolverProvider); - ManagedChannelBuilder managedChannelBuilder - = Grpc.newChannelBuilder("unix:///sock.sock", - InsecureChannelCredentials.create(), nameResolverRegistry); - assertThat(managedChannelBuilder).isNotNull(); - ManagedChannel channel = managedChannelBuilder.build(); - assertThat(channel).isNotNull(); - assertThat(channel.authority()).isEqualTo("/sock.sock"); - channel.shutdownNow(); - } - @Test public void udsClientServerTestUsingProvider() throws IOException { Assume.assumeTrue(Utils.isEpollAvailable()); From 4ee3512ab7eb3b8d7ba8e7281af07c5dffc310c0 Mon Sep 17 00:00:00 2001 From: agravator Date: Fri, 16 Jan 2026 13:44:41 +0530 Subject: [PATCH 6/7] use the new API in channelProviders --- .../java/io/grpc/ManagedChannelProvider.java | 1 - .../internal/ManagedChannelImplBuilder.java | 37 ++-- ...ManagedChannelImplGetNameResolverTest.java | 9 +- .../io/grpc/netty/NettyChannelBuilder.java | 20 +++ .../io/grpc/netty/NettyChannelProvider.java | 21 +++ .../grpc/netty/UdsNettyChannelProvider.java | 17 ++ .../grpc/netty/NettyChannelProviderTest.java | 160 ++++++++++++++++++ .../netty/UdsNettyChannelProviderTest.java | 10 ++ .../io/grpc/okhttp/OkHttpChannelBuilder.java | 18 ++ .../io/grpc/okhttp/OkHttpChannelProvider.java | 22 +++ .../okhttp/OkHttpChannelProviderTest.java | 9 + 11 files changed, 309 insertions(+), 15 deletions(-) diff --git a/api/src/main/java/io/grpc/ManagedChannelProvider.java b/api/src/main/java/io/grpc/ManagedChannelProvider.java index 2ef0ee47ace..18a4329a146 100644 --- a/api/src/main/java/io/grpc/ManagedChannelProvider.java +++ b/api/src/main/java/io/grpc/ManagedChannelProvider.java @@ -103,7 +103,6 @@ protected NewChannelBuilderResult newChannelBuilder(String target, ChannelCreden protected NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentials creds, NameResolverRegistry nameResolverRegistry, NameResolverProvider nameResolverProvider) { - // Implementation note: Currently delegates to the simplified version return newChannelBuilder(target, creds); } diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java index 628224b826e..3af1aac4cc1 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java @@ -164,6 +164,8 @@ static boolean setRfc3986UrisEnabled(boolean value) { private final List interceptors = new ArrayList<>(); NameResolverRegistry nameResolverRegistry = NameResolverRegistry.getDefaultRegistry(); + @Nullable + NameResolverProvider nameResolverProvider; final List transportFilters = new ArrayList<>(); @@ -445,11 +447,16 @@ public ManagedChannelImplBuilder nameResolverFactory(NameResolver.Factory resolv return this; } - ManagedChannelImplBuilder nameResolverRegistry(NameResolverRegistry resolverRegistry) { + public ManagedChannelImplBuilder nameResolverRegistry(NameResolverRegistry resolverRegistry) { this.nameResolverRegistry = resolverRegistry; return this; } + public ManagedChannelImplBuilder nameResolverProvider(NameResolverProvider provider) { + this.nameResolverProvider = provider; + return this; + } + @Override public ManagedChannelImplBuilder defaultLoadBalancingPolicy(String policy) { Preconditions.checkState(directServerAddress == null, @@ -733,7 +740,7 @@ public ManagedChannel build() { ResolvedNameResolver resolvedResolver = enableRfc3986Uris ? getNameResolverProviderRfc3986(target, nameResolverRegistry) - : getNameResolverProvider(target, nameResolverRegistry); + : getNameResolverProvider(target, nameResolverRegistry, nameResolverProvider); resolvedResolver.checkAddressTypes(clientTransportFactory.getSupportedSocketAddressTypes()); return new ManagedChannelOrphanWrapper(new ManagedChannelImpl( this, @@ -854,7 +861,8 @@ void checkAddressTypes( @VisibleForTesting static ResolvedNameResolver getNameResolverProvider( - String target, NameResolverRegistry nameResolverRegistry) { + String target, NameResolverRegistry nameResolverRegistry, + NameResolverProvider nameResolverProvider) { // Finding a NameResolver. Try using the target string as the URI. If that fails, try prepending // "dns:///". NameResolverProvider provider = null; @@ -869,19 +877,28 @@ static ResolvedNameResolver getNameResolverProvider( if (targetUri != null) { // For "localhost:8080" this would likely cause provider to be null, because "localhost" is // parsed as the scheme. Will hit the next case and try "dns:///localhost:8080". - provider = nameResolverRegistry.getProviderForScheme(targetUri.getScheme()); + provider = nameResolverProvider; + if (provider == null) { + provider = nameResolverRegistry.getProviderForScheme(targetUri.getScheme()); + } } - if (provider == null && !URI_PATTERN.matcher(target).matches()) { - // It doesn't look like a URI target. Maybe it's an authority string. Try with the default - // scheme from the registry. + if (!URI_PATTERN.matcher(target).matches()) { + // It doesn't look like a URI target. Maybe it's an authority string. Try with + // the default scheme from the registry (if provider is not specified) or + // the provider's default scheme (if provider is specified). + String scheme = (provider != null) + ? provider.getDefaultScheme() + : nameResolverRegistry.getDefaultScheme(); try { - targetUri = new URI(nameResolverRegistry.getDefaultScheme(), "", "/" + target, null); + targetUri = new URI(scheme, "", "/" + target, null); } catch (URISyntaxException e) { - // Should not be possible. + // Should not happen because we just validated the URI. throw new IllegalArgumentException(e); } - provider = nameResolverRegistry.getProviderForScheme(targetUri.getScheme()); + if (provider == null) { + provider = nameResolverRegistry.getProviderForScheme(targetUri.getScheme()); + } } if (provider == null) { diff --git a/core/src/test/java/io/grpc/internal/ManagedChannelImplGetNameResolverTest.java b/core/src/test/java/io/grpc/internal/ManagedChannelImplGetNameResolverTest.java index 792f4daca4e..4bfc66beb12 100644 --- a/core/src/test/java/io/grpc/internal/ManagedChannelImplGetNameResolverTest.java +++ b/core/src/test/java/io/grpc/internal/ManagedChannelImplGetNameResolverTest.java @@ -118,7 +118,8 @@ public void validTargetNoProvider() { NameResolverRegistry nameResolverRegistry = new NameResolverRegistry(); try { ManagedChannelImplBuilder.getNameResolverProvider( - "foo.googleapis.com:8080", nameResolverRegistry); + "foo.googleapis.com:8080", nameResolverRegistry, + null); fail("Should fail"); } catch (IllegalArgumentException e) { // expected @@ -130,7 +131,7 @@ public void validTargetProviderAddrTypesNotSupported() { NameResolverRegistry nameResolverRegistry = getTestRegistry("testscheme"); try { ManagedChannelImplBuilder.getNameResolverProvider( - "testscheme:///foo.googleapis.com:8080", nameResolverRegistry) + "testscheme:///foo.googleapis.com:8080", nameResolverRegistry, null) .checkAddressTypes(Collections.singleton(CustomSocketAddress.class)); fail("Should fail"); } catch (IllegalArgumentException e) { @@ -143,7 +144,7 @@ public void validTargetProviderAddrTypesNotSupported() { private void testValidTarget(String target, String expectedUriString, URI expectedUri) { NameResolverRegistry nameResolverRegistry = getTestRegistry(expectedUri.getScheme()); ManagedChannelImplBuilder.ResolvedNameResolver resolved = - ManagedChannelImplBuilder.getNameResolverProvider(target, nameResolverRegistry); + ManagedChannelImplBuilder.getNameResolverProvider(target, nameResolverRegistry, null); assertThat(resolved.provider).isInstanceOf(FakeNameResolverProvider.class); assertThat(resolved.targetUri).isEqualTo(wrap(expectedUri)); assertThat(resolved.targetUri.toString()).isEqualTo(expectedUriString); @@ -154,7 +155,7 @@ private void testInvalidTarget(String target) { try { ManagedChannelImplBuilder.ResolvedNameResolver resolved = - ManagedChannelImplBuilder.getNameResolverProvider(target, nameResolverRegistry); + ManagedChannelImplBuilder.getNameResolverProvider(target, nameResolverRegistry, null); FakeNameResolverProvider nameResolverProvider = (FakeNameResolverProvider) resolved.provider; fail("Should have failed, but got resolver provider " + nameResolverProvider); } catch (IllegalArgumentException e) { diff --git a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java index 258aa15b005..7b3065e1f95 100644 --- a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java +++ b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java @@ -38,6 +38,8 @@ import io.grpc.HttpConnectProxiedSocketAddress; import io.grpc.Internal; import io.grpc.ManagedChannelBuilder; +import io.grpc.NameResolverProvider; +import io.grpc.NameResolverRegistry; import io.grpc.internal.AtomicBackoff; import io.grpc.internal.ClientTransportFactory; import io.grpc.internal.ConnectionClientTransport; @@ -708,6 +710,24 @@ NettyChannelBuilder setTransportTracerFactory(TransportTracer.Factory transportT return this; } + /** + * Sets the registry used for looking up name resolvers. + */ + @CanIgnoreReturnValue + public NettyChannelBuilder nameResolverRegistry(NameResolverRegistry registry) { + managedChannelImplBuilder.nameResolverRegistry(registry); + return this; + } + + /** + * Sets the {@link io.grpc.NameResolverProvider} to use. + */ + @CanIgnoreReturnValue + public NettyChannelBuilder nameResolverProvider(NameResolverProvider provider) { + managedChannelImplBuilder.nameResolverProvider(provider); + return this; + } + static Collection> getSupportedSocketAddressTypes() { return Collections.singleton(InetSocketAddress.class); } diff --git a/netty/src/main/java/io/grpc/netty/NettyChannelProvider.java b/netty/src/main/java/io/grpc/netty/NettyChannelProvider.java index 1b22a95a44b..f9ff2409cbb 100644 --- a/netty/src/main/java/io/grpc/netty/NettyChannelProvider.java +++ b/netty/src/main/java/io/grpc/netty/NettyChannelProvider.java @@ -19,6 +19,8 @@ import io.grpc.ChannelCredentials; import io.grpc.Internal; import io.grpc.ManagedChannelProvider; +import io.grpc.NameResolverProvider; +import io.grpc.NameResolverRegistry; import java.net.SocketAddress; import java.util.Collection; @@ -55,6 +57,25 @@ public NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentia new NettyChannelBuilder(target, creds, result.callCredentials, result.negotiator)); } + @Override + public NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentials creds, + NameResolverRegistry nameResolverRegistry, + NameResolverProvider nameResolverProvider) { + ProtocolNegotiators.FromChannelCredentialsResult result = ProtocolNegotiators.from(creds); + if (result.error != null) { + return NewChannelBuilderResult.error(result.error); + } + NettyChannelBuilder builder = new NettyChannelBuilder(target, creds, + result.callCredentials, result.negotiator); + if (nameResolverRegistry != null) { + builder.nameResolverRegistry(nameResolverRegistry); + } + if (nameResolverProvider != null) { + builder.nameResolverProvider(nameResolverProvider); + } + return NewChannelBuilderResult.channelBuilder(builder); + } + @Override protected Collection> getSupportedSocketAddressTypes() { return NettyChannelBuilder.getSupportedSocketAddressTypes(); diff --git a/netty/src/main/java/io/grpc/netty/UdsNettyChannelProvider.java b/netty/src/main/java/io/grpc/netty/UdsNettyChannelProvider.java index 4e9895da0a8..23a09889de0 100644 --- a/netty/src/main/java/io/grpc/netty/UdsNettyChannelProvider.java +++ b/netty/src/main/java/io/grpc/netty/UdsNettyChannelProvider.java @@ -20,6 +20,8 @@ import io.grpc.ChannelCredentials; import io.grpc.Internal; import io.grpc.ManagedChannelProvider; +import io.grpc.NameResolverProvider; +import io.grpc.NameResolverRegistry; import io.grpc.internal.SharedResourcePool; import io.netty.channel.unix.DomainSocketAddress; import java.net.SocketAddress; @@ -62,6 +64,21 @@ public NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentia return result; } + @Override + public NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentials creds, + NameResolverRegistry nameResolverRegistry, + NameResolverProvider nameResolverProvider) { + Preconditions.checkState(isAvailable()); + NewChannelBuilderResult result = new NettyChannelProvider().newChannelBuilder( + target, creds, nameResolverRegistry, nameResolverProvider); + if (result.getChannelBuilder() != null) { + ((NettyChannelBuilder) result.getChannelBuilder()) + .eventLoopGroupPool(SharedResourcePool.forResource(Utils.DEFAULT_WORKER_EVENT_LOOP_GROUP)) + .channelType(Utils.EPOLL_DOMAIN_CLIENT_CHANNEL_TYPE, DomainSocketAddress.class); + } + return result; + } + @Override protected Collection> getSupportedSocketAddressTypes() { return Collections.singleton(DomainSocketAddress.class); diff --git a/netty/src/test/java/io/grpc/netty/NettyChannelProviderTest.java b/netty/src/test/java/io/grpc/netty/NettyChannelProviderTest.java index 86c1389f002..fe5a45848e1 100644 --- a/netty/src/test/java/io/grpc/netty/NettyChannelProviderTest.java +++ b/netty/src/test/java/io/grpc/netty/NettyChannelProviderTest.java @@ -87,4 +87,164 @@ public void newChannelBuilder_fail() { TlsChannelCredentials.newBuilder().requireFakeFeature().build()); assertThat(result.getError()).contains("FAKE"); } + + @Test + public void newChannelBuilder_withRegistry() { + io.grpc.NameResolverRegistry registry = new io.grpc.NameResolverRegistry(); + NewChannelBuilderResult result = provider.newChannelBuilder( + "localhost:443", TlsChannelCredentials.create(), registry, null); + assertThat(result.getChannelBuilder()).isInstanceOf(NettyChannelBuilder.class); + } + + @Test + public void newChannelBuilder_withProvider() { + io.grpc.NameResolverProvider resolverProvider = new io.grpc.NameResolverProvider() { + @Override + protected boolean isAvailable() { + return true; + } + + @Override + protected int priority() { + return 5; + } + + @Override + public String getDefaultScheme() { + return "dns"; + } + + @Override + public io.grpc.NameResolver newNameResolver(java.net.URI targetUri, + io.grpc.NameResolver.Args args) { + return null; + } + }; + NewChannelBuilderResult result = provider.newChannelBuilder( + "localhost:443", TlsChannelCredentials.create(), null, + resolverProvider); + assertThat(result.getChannelBuilder()).isInstanceOf(NettyChannelBuilder.class); + } + + @Test + public void newChannelBuilder_registryPropagation_e2e() { + String scheme = "testscheme"; + final io.grpc.NameResolverRegistry registry = new io.grpc.NameResolverRegistry(); + final java.util.concurrent.atomic.AtomicReference + capturedRegistry = new java.util.concurrent.atomic.AtomicReference<>(); + + final io.grpc.NameResolverProvider resolverProvider = new io.grpc.NameResolverProvider() { + @Override + protected boolean isAvailable() { + return true; + } + + @Override + protected int priority() { + return 5; + } + + @Override + public String getDefaultScheme() { + return scheme; + } + + @Override + public io.grpc.NameResolver newNameResolver(java.net.URI targetUri, + io.grpc.NameResolver.Args args) { + capturedRegistry.set(args.getNameResolverRegistry()); + return new io.grpc.NameResolver() { + @Override + public String getServiceAuthority() { + return "authority"; + } + + @Override + public void start(Listener2 listener) { + } + + @Override + public void shutdown() { + } + }; + } + }; + registry.register(resolverProvider); + + NewChannelBuilderResult result = provider.newChannelBuilder( + scheme + ":///target", TlsChannelCredentials.create(), registry, + null); + assertThat(result.getChannelBuilder()).isInstanceOf(NettyChannelBuilder.class); + // Verify build() succeeds + result.getChannelBuilder().build(); + + // Verify the registry passed to args is the exact same instance + assertSame("Registry should be propagated to NameResolver.Args", registry, + capturedRegistry.get()); + + // Verify default registry (empty) fails + NewChannelBuilderResult defaultResult = provider.newChannelBuilder( + scheme + ":///target", TlsChannelCredentials.create(), + new io.grpc.NameResolverRegistry(), null); + // The provider might still return a builder, but build() should fail if it + // can't find the resolver. + // However, NettyChannelProvider just delegates to NettyChannelBuilder. + // NettyChannelBuilder delegates to ManagedChannelImplBuilder. + // ManagedChannelImplBuilder.build() calls getNameResolverProvider(), which + // throws if not found. + try { + defaultResult.getChannelBuilder().build(); + fail("Should have failed to build() without correct registry"); + } catch (IllegalArgumentException e) { + // Expected + } + } + + @Test + public void newChannelBuilder_providerPropagation_e2e() { + String scheme = "otherscheme"; + final io.grpc.NameResolverProvider resolverProvider = new io.grpc.NameResolverProvider() { + @Override + protected boolean isAvailable() { + return true; + } + + @Override + protected int priority() { + return 5; + } + + @Override + public String getDefaultScheme() { + return scheme; + } + + @Override + public io.grpc.NameResolver newNameResolver(java.net.URI targetUri, + io.grpc.NameResolver.Args args) { + return new io.grpc.NameResolver() { + @Override + public String getServiceAuthority() { + return "authority"; + } + + @Override + public void start(Listener2 listener) { + } + + @Override + public void shutdown() { + } + }; + } + }; + + // Pass explicit provider, null registry + NewChannelBuilderResult result = provider.newChannelBuilder( + scheme + ":///target", TlsChannelCredentials.create(), + null, resolverProvider); + assertThat(result.getChannelBuilder()).isInstanceOf(NettyChannelBuilder.class); + // Should succeed because we passed the specific provider + result.getChannelBuilder().build(); + } } diff --git a/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java b/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java index e0c3d5a8525..ad26caf1713 100644 --- a/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java +++ b/netty/src/test/java/io/grpc/netty/UdsNettyChannelProviderTest.java @@ -108,6 +108,16 @@ public void newChannelBuilder_success() { assertThat(result.getChannelBuilder()).isInstanceOf(NettyChannelBuilder.class); } + @Test + public void newChannelBuilder_withRegistry_success() { + Assume.assumeTrue(Utils.isEpollAvailable()); + NewChannelBuilderResult result = provider.newChannelBuilder("unix:sock.sock", + TlsChannelCredentials.create(), + io.grpc.NameResolverRegistry.getDefaultRegistry(), + new io.grpc.internal.DnsNameResolverProvider()); + assertThat(result.getChannelBuilder()).isInstanceOf(NettyChannelBuilder.class); + } + @Test public void managedChannelRegistry_newChannelBuilder() { Assume.assumeTrue(Utils.isEpollAvailable()); diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java index 98f764132fe..abcecd312c6 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java @@ -35,6 +35,8 @@ import io.grpc.InsecureChannelCredentials; import io.grpc.Internal; import io.grpc.ManagedChannelBuilder; +import io.grpc.NameResolverProvider; +import io.grpc.NameResolverRegistry; import io.grpc.TlsChannelCredentials; import io.grpc.internal.AtomicBackoff; import io.grpc.internal.ClientTransportFactory; @@ -588,6 +590,22 @@ SSLSocketFactory createSslSocketFactory() { } } + /** + * Sets the registry used for looking up name resolvers. + */ + public OkHttpChannelBuilder nameResolverRegistry(NameResolverRegistry registry) { + managedChannelImplBuilder.nameResolverRegistry(registry); + return this; + } + + /** + * Sets the {@link NameResolverProvider} to use. + */ + public OkHttpChannelBuilder nameResolverProvider(NameResolverProvider provider) { + managedChannelImplBuilder.nameResolverProvider(provider); + return this; + } + private static final EnumSet understoodTlsFeatures = EnumSet.of( TlsChannelCredentials.Feature.MTLS, TlsChannelCredentials.Feature.CUSTOM_MANAGERS); diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelProvider.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelProvider.java index bf2a9be6fee..3fa1f84d02e 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelProvider.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelProvider.java @@ -20,6 +20,8 @@ import io.grpc.Internal; import io.grpc.InternalServiceProviders; import io.grpc.ManagedChannelProvider; +import io.grpc.NameResolverProvider; +import io.grpc.NameResolverRegistry; import java.net.SocketAddress; import java.util.Collection; @@ -60,6 +62,26 @@ public NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentia target, creds, result.callCredentials, result.factory)); } + @Override + public NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentials creds, + NameResolverRegistry nameResolverRegistry, + NameResolverProvider nameResolverProvider) { + OkHttpChannelBuilder.SslSocketFactoryResult result = + OkHttpChannelBuilder.sslSocketFactoryFrom(creds); + if (result.error != null) { + return NewChannelBuilderResult.error(result.error); + } + OkHttpChannelBuilder builder = new OkHttpChannelBuilder( + target, creds, result.callCredentials, result.factory); + if (nameResolverRegistry != null) { + builder.nameResolverRegistry(nameResolverRegistry); + } + if (nameResolverProvider != null) { + builder.nameResolverProvider(nameResolverProvider); + } + return NewChannelBuilderResult.channelBuilder(builder); + } + @Override protected Collection> getSupportedSocketAddressTypes() { return OkHttpChannelBuilder.getSupportedSocketAddressTypes(); diff --git a/okhttp/src/test/java/io/grpc/okhttp/OkHttpChannelProviderTest.java b/okhttp/src/test/java/io/grpc/okhttp/OkHttpChannelProviderTest.java index 363f11e71eb..40cf0a41449 100644 --- a/okhttp/src/test/java/io/grpc/okhttp/OkHttpChannelProviderTest.java +++ b/okhttp/src/test/java/io/grpc/okhttp/OkHttpChannelProviderTest.java @@ -85,4 +85,13 @@ public void newChannelBuilder_fail() { TlsChannelCredentials.newBuilder().requireFakeFeature().build()); assertThat(result.getError()).contains("FAKE"); } + + @Test + public void newChannelBuilder_withRegistry_success() { + NewChannelBuilderResult result = provider.newChannelBuilder("localhost:443", + TlsChannelCredentials.create(), + io.grpc.NameResolverRegistry.getDefaultRegistry(), + new io.grpc.internal.DnsNameResolverProvider()); + assertThat(result.getChannelBuilder()).isInstanceOf(OkHttpChannelBuilder.class); + } } From a6690344b34d5a4b02aeb4a123228ebb8174802f Mon Sep 17 00:00:00 2001 From: agravator Date: Tue, 20 Jan 2026 11:29:04 +0530 Subject: [PATCH 7/7] use constructor instead of public method --- api/src/main/java/io/grpc/NameResolver.java | 2 +- .../io/grpc/ManagedChannelRegistryTest.java | 47 +++++++++++++++++ .../internal/ManagedChannelImplBuilder.java | 50 ++++++++++++++++--- .../io/grpc/netty/NettyChannelBuilder.java | 28 ++++------- .../io/grpc/netty/NettyChannelProvider.java | 8 +-- .../io/grpc/okhttp/OkHttpChannelBuilder.java | 26 ++++------ .../io/grpc/okhttp/OkHttpChannelProvider.java | 9 +--- 7 files changed, 117 insertions(+), 53 deletions(-) diff --git a/api/src/main/java/io/grpc/NameResolver.java b/api/src/main/java/io/grpc/NameResolver.java index 53dbc5d6888..9810d65bab3 100644 --- a/api/src/main/java/io/grpc/NameResolver.java +++ b/api/src/main/java/io/grpc/NameResolver.java @@ -191,7 +191,7 @@ public abstract static class Factory { */ public NameResolver newNameResolver(Uri targetUri, final Args args) { // Not every io.grpc.Uri can be converted but in the ordinary ManagedChannel creation flow, - // any IllegalArgumentException thrown here would happened anyway, just earlier. That's + // any IllegalArgumentException thrown here would have happened anyway, just earlier. That's // because parse/toString is transparent so java.net.URI#create here sees the original target // string just like it did before the io.grpc.Uri migration. // diff --git a/api/src/test/java/io/grpc/ManagedChannelRegistryTest.java b/api/src/test/java/io/grpc/ManagedChannelRegistryTest.java index 30de2477d77..dd2c63f2240 100644 --- a/api/src/test/java/io/grpc/ManagedChannelRegistryTest.java +++ b/api/src/test/java/io/grpc/ManagedChannelRegistryTest.java @@ -223,6 +223,53 @@ public NewChannelBuilderResult newChannelBuilder( mcb); } + @Test + public void newChannelBuilder_propagatesRegistry() { + final NameResolverRegistry nameResolverRegistry = new NameResolverRegistry(); + class SocketAddress1 extends SocketAddress { + } + + ManagedChannelRegistry registry = new ManagedChannelRegistry(); + class MockChannelBuilder extends ForwardingChannelBuilder2 { + @Override + public ManagedChannelBuilder delegate() { + throw new UnsupportedOperationException(); + } + } + + final ManagedChannelBuilder mcb = new MockChannelBuilder(); + registry.register(new BaseProvider(true, 4) { + @Override + protected Collection> getSupportedSocketAddressTypes() { + return Collections.singleton(SocketAddress1.class); + } + + @Override + public NewChannelBuilderResult newChannelBuilder( + String passedTarget, ChannelCredentials passedCreds, + NameResolverRegistry passedRegistry, NameResolverProvider passedProvider) { + assertThat(passedRegistry).isSameInstanceAs(nameResolverRegistry); + return NewChannelBuilderResult.channelBuilder(mcb); + } + }); + + // ManagedChannelRegistry.newChannelBuilder(NameResolverRegistry, String, ChannelCredentials) + // gets the scheme from target. Then it gets NameResolverProvider from registry for that scheme. + // Then it gets producedSocketAddressTypes from that provider. + // Then it finds a ManagedChannelProvider that supports those types. + // So we need a registered NameResolverProvider for the scheme. + nameResolverRegistry.register(new BaseNameResolverProvider(true, 5, "sc1") { + @Override + public Collection> getProducedSocketAddressTypes() { + return Collections.singleton(SocketAddress1.class); + } + }); + + assertThat( + registry.newChannelBuilder(nameResolverRegistry, "sc1:" + target, creds)).isSameInstanceAs( + mcb); + } + @Test public void newChannelBuilder_unsupportedSocketAddressTypes() { NameResolverRegistry nameResolverRegistry = new NameResolverRegistry(); diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java index 3af1aac4cc1..b662c06f0d4 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java @@ -318,6 +318,49 @@ public ManagedChannelImplBuilder( InternalConfiguratorRegistry.configureChannelBuilder(this); } + /** + * Creates a new managed channel builder with a target string, which can be + * either a valid {@link io.grpc.NameResolver}-compliant URI, or an authority + * string. Transport + * implementors must provide client transport factory builder, and may set + * custom channel default + * port provider. + * + * @param channelCreds The ChannelCredentials provided by the user. + * These may be used when + * creating derivative channels. + * @param nameResolverRegistry the registry used to look up name resolvers. + * @param nameResolverProvider the provider used to look up name resolvers. + */ + public ManagedChannelImplBuilder( + String target, @Nullable ChannelCredentials channelCreds, @Nullable CallCredentials callCreds, + ClientTransportFactoryBuilder clientTransportFactoryBuilder, + @Nullable ChannelBuilderDefaultPortProvider channelBuilderDefaultPortProvider, + @Nullable NameResolverRegistry nameResolverRegistry, + @Nullable NameResolverProvider nameResolverProvider) { + this.target = checkNotNull(target, "target"); + this.channelCredentials = channelCreds; + this.callCredentials = callCreds; + this.clientTransportFactoryBuilder = checkNotNull(clientTransportFactoryBuilder, + "clientTransportFactoryBuilder"); + this.directServerAddress = null; + + if (channelBuilderDefaultPortProvider != null) { + this.channelBuilderDefaultPortProvider = channelBuilderDefaultPortProvider; + } else { + this.channelBuilderDefaultPortProvider = new ManagedChannelDefaultPortProvider(); + } + if (nameResolverRegistry != null) { + this.nameResolverRegistry = nameResolverRegistry; + } + if (nameResolverProvider != null) { + this.nameResolverProvider = nameResolverProvider; + } + + // TODO(dnvindhya): Move configurator to all the individual builders + InternalConfiguratorRegistry.configureChannelBuilder(this); + } + /** * Returns a target string for the SocketAddress. It is only used as a placeholder, because * DirectAddressNameResolverProvider will not actually try to use it. However, it must be a valid @@ -447,16 +490,11 @@ public ManagedChannelImplBuilder nameResolverFactory(NameResolver.Factory resolv return this; } - public ManagedChannelImplBuilder nameResolverRegistry(NameResolverRegistry resolverRegistry) { + ManagedChannelImplBuilder nameResolverRegistry(NameResolverRegistry resolverRegistry) { this.nameResolverRegistry = resolverRegistry; return this; } - public ManagedChannelImplBuilder nameResolverProvider(NameResolverProvider provider) { - this.nameResolverProvider = provider; - return this; - } - @Override public ManagedChannelImplBuilder defaultLoadBalancingPolicy(String policy) { Preconditions.checkState(directServerAddress == null, diff --git a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java index 7b3065e1f95..9aacaa6059c 100644 --- a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java +++ b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java @@ -209,10 +209,20 @@ public int getDefaultPort() { NettyChannelBuilder( String target, ChannelCredentials channelCreds, CallCredentials callCreds, ProtocolNegotiator.ClientFactory negotiator) { + this(target, channelCreds, callCreds, negotiator, null, null); + } + + NettyChannelBuilder( + String target, ChannelCredentials channelCreds, CallCredentials callCreds, + ProtocolNegotiator.ClientFactory negotiator, + NameResolverRegistry nameResolverRegistry, + NameResolverProvider nameResolverProvider) { managedChannelImplBuilder = new ManagedChannelImplBuilder( target, channelCreds, callCreds, new NettyChannelTransportFactoryBuilder(), - new NettyChannelDefaultPortProvider()); + new NettyChannelDefaultPortProvider(), + nameResolverRegistry, + nameResolverProvider); this.protocolNegotiatorFactory = checkNotNull(negotiator, "negotiator"); this.freezeProtocolNegotiatorFactory = true; } @@ -710,23 +720,7 @@ NettyChannelBuilder setTransportTracerFactory(TransportTracer.Factory transportT return this; } - /** - * Sets the registry used for looking up name resolvers. - */ - @CanIgnoreReturnValue - public NettyChannelBuilder nameResolverRegistry(NameResolverRegistry registry) { - managedChannelImplBuilder.nameResolverRegistry(registry); - return this; - } - /** - * Sets the {@link io.grpc.NameResolverProvider} to use. - */ - @CanIgnoreReturnValue - public NettyChannelBuilder nameResolverProvider(NameResolverProvider provider) { - managedChannelImplBuilder.nameResolverProvider(provider); - return this; - } static Collection> getSupportedSocketAddressTypes() { return Collections.singleton(InetSocketAddress.class); diff --git a/netty/src/main/java/io/grpc/netty/NettyChannelProvider.java b/netty/src/main/java/io/grpc/netty/NettyChannelProvider.java index f9ff2409cbb..7b2b747a1c4 100644 --- a/netty/src/main/java/io/grpc/netty/NettyChannelProvider.java +++ b/netty/src/main/java/io/grpc/netty/NettyChannelProvider.java @@ -66,13 +66,7 @@ public NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentia return NewChannelBuilderResult.error(result.error); } NettyChannelBuilder builder = new NettyChannelBuilder(target, creds, - result.callCredentials, result.negotiator); - if (nameResolverRegistry != null) { - builder.nameResolverRegistry(nameResolverRegistry); - } - if (nameResolverProvider != null) { - builder.nameResolverProvider(nameResolverProvider); - } + result.callCredentials, result.negotiator, nameResolverRegistry, nameResolverProvider); return NewChannelBuilderResult.channelBuilder(builder); } diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java index abcecd312c6..3e1d7a774c1 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java @@ -216,10 +216,20 @@ private OkHttpChannelBuilder(String target) { OkHttpChannelBuilder( String target, ChannelCredentials channelCreds, CallCredentials callCreds, SSLSocketFactory factory) { + this(target, channelCreds, callCreds, factory, null, null); + } + + OkHttpChannelBuilder( + String target, ChannelCredentials channelCreds, CallCredentials callCreds, + SSLSocketFactory factory, + NameResolverRegistry nameResolverRegistry, + NameResolverProvider nameResolverProvider) { managedChannelImplBuilder = new ManagedChannelImplBuilder( target, channelCreds, callCreds, new OkHttpChannelTransportFactoryBuilder(), - new OkHttpChannelDefaultPortProvider()); + new OkHttpChannelDefaultPortProvider(), + nameResolverRegistry, + nameResolverProvider); this.sslSocketFactory = factory; this.negotiationType = factory == null ? NegotiationType.PLAINTEXT : NegotiationType.TLS; this.freezeSecurityConfiguration = true; @@ -590,21 +600,7 @@ SSLSocketFactory createSslSocketFactory() { } } - /** - * Sets the registry used for looking up name resolvers. - */ - public OkHttpChannelBuilder nameResolverRegistry(NameResolverRegistry registry) { - managedChannelImplBuilder.nameResolverRegistry(registry); - return this; - } - /** - * Sets the {@link NameResolverProvider} to use. - */ - public OkHttpChannelBuilder nameResolverProvider(NameResolverProvider provider) { - managedChannelImplBuilder.nameResolverProvider(provider); - return this; - } private static final EnumSet understoodTlsFeatures = EnumSet.of( diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelProvider.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelProvider.java index 3fa1f84d02e..f4485d237a3 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelProvider.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelProvider.java @@ -72,13 +72,8 @@ public NewChannelBuilderResult newChannelBuilder(String target, ChannelCredentia return NewChannelBuilderResult.error(result.error); } OkHttpChannelBuilder builder = new OkHttpChannelBuilder( - target, creds, result.callCredentials, result.factory); - if (nameResolverRegistry != null) { - builder.nameResolverRegistry(nameResolverRegistry); - } - if (nameResolverProvider != null) { - builder.nameResolverProvider(nameResolverProvider); - } + target, creds, result.callCredentials, result.factory, + nameResolverRegistry, nameResolverProvider); return NewChannelBuilderResult.channelBuilder(builder); }