From c40d81f6381d86c672fe56d0ae79f7dc81c58513 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 17 Feb 2025 14:26:37 +0530 Subject: [PATCH 1/5] 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 4bd47e2f45c15089091892f40af7f602508b7d89 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 19 Feb 2025 11:18:09 +0530 Subject: [PATCH 2/5] 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 5cc2d8df520c114dbd6d86279d89ab6c590e0def Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 25 Mar 2025 11:54:31 +0530 Subject: [PATCH 3/5] 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 148853649852f8b7bc3e70eab5cb2169aa27adea Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 25 Mar 2025 12:14:01 +0530 Subject: [PATCH 4/5] 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 69131560bb9767e87a174d1f604f279f3e65229f Mon Sep 17 00:00:00 2001 From: AgraVator Date: Wed, 24 Dec 2025 15:50:24 +0530 Subject: [PATCH 5/5] 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());