From 439218ab52fafbe31fdf0d80ba9da27407fb2783 Mon Sep 17 00:00:00 2001 From: Mohak Agrawal Date: Sun, 15 Mar 2026 19:19:00 +0530 Subject: [PATCH 1/3] core: Validate policy name in defaultLoadBalancingPolicy() immediately --- .../java/io/grpc/ManagedChannelBuilder.java | 5 +++ .../internal/ManagedChannelImplBuilder.java | 6 ++- .../ManagedChannelImplBuilderTest.java | 43 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/io/grpc/ManagedChannelBuilder.java b/api/src/main/java/io/grpc/ManagedChannelBuilder.java index 3f370ab3003..e338ec821fb 100644 --- a/api/src/main/java/io/grpc/ManagedChannelBuilder.java +++ b/api/src/main/java/io/grpc/ManagedChannelBuilder.java @@ -274,6 +274,11 @@ public T useTransportSecurity() { *

Policy implementations are looked up in the * {@link LoadBalancerRegistry#getDefaultRegistry default LoadBalancerRegistry}. * + *

The provided policy name is validated against the + * {@link LoadBalancerRegistry#getDefaultRegistry default LoadBalancerRegistry} immediately. + * If no provider is found for the given policy name, an {@link IllegalArgumentException} + * is thrown. + * *

This method is implemented by all stock channel builders that are shipped with gRPC, but may * not be implemented by custom channel builders, in which case this method will throw. * diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java index 128c929ec0e..4ff7d40cc73 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java @@ -39,6 +39,8 @@ import io.grpc.InternalChannelz; import io.grpc.InternalConfiguratorRegistry; import io.grpc.InternalFeatureFlags; +import io.grpc.LoadBalancerProvider; +import io.grpc.LoadBalancerRegistry; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.MethodDescriptor; @@ -447,7 +449,9 @@ public ManagedChannelImplBuilder defaultLoadBalancingPolicy(String policy) { "directServerAddress is set (%s), which forbids the use of load-balancing policy", directServerAddress); Preconditions.checkArgument(policy != null, "policy cannot be null"); - this.defaultLbPolicy = policy; + LoadBalancerProvider provider = LoadBalancerRegistry.getDefaultRegistry().getProvider(policy); + Preconditions.checkArgument(provider != null, "No provider available for the '%s' load balancing policy.", policy); + this.defaultLbPolicy = provider.getPolicyName(); 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 b0939239477..3474a5164e6 100644 --- a/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java +++ b/core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java @@ -43,6 +43,9 @@ import io.grpc.InternalConfiguratorRegistry; import io.grpc.InternalFeatureFlags; import io.grpc.InternalManagedChannelBuilder.InternalInterceptorFactory; +import io.grpc.LoadBalancer; +import io.grpc.LoadBalancerProvider; +import io.grpc.LoadBalancerRegistry; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.MethodDescriptor; @@ -67,6 +70,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; +import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -85,6 +89,7 @@ public class ManagedChannelImplBuilderTest { private static final String DUMMY_TARGET = "fake-target"; private static final String DUMMY_AUTHORITY_VALID = "valid:1234"; private static final String DUMMY_AUTHORITY_INVALID = "[ : : 1]"; + private static final String FAKE_POLICY_NAME = "magic_balancer"; private static final ClientInterceptor DUMMY_USER_INTERCEPTOR = new ClientInterceptor() { @Override @@ -101,6 +106,29 @@ public ClientCall interceptCall( return next.newCall(method, callOptions); } }; + + private final LoadBalancerProvider fakeProvider = + new LoadBalancerProvider() { + @Override + public LoadBalancer newLoadBalancer(LoadBalancer.Helper helper) { + return mock(LoadBalancer.class); + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public int getPriority() { + return 5; + } + + @Override + public String getPolicyName() { + return FAKE_POLICY_NAME; + } + }; @Parameters(name = "enableRfc3986UrisParam={0}") public static Iterable data() { @@ -141,6 +169,13 @@ public void setUp() throws Exception { DUMMY_TARGET, new UnsupportedClientTransportFactoryBuilder(), new FixedPortProvider(DUMMY_PORT)); + + LoadBalancerRegistry.getDefaultRegistry().register(fakeProvider); + } + + @After + public void tearDown() { + LoadBalancerRegistry.getDefaultRegistry().deregister(fakeProvider); } /** Ensure getDefaultPort() returns default port when no custom implementation provided. */ @@ -249,6 +284,14 @@ public void nameResolverFactory_notAllowedWithDirectAddress() { directAddressBuilder.nameResolverFactory(mock(NameResolver.Factory.class)); } + @Test + public void defaultLoadBalancingPolicy_unregisteredPolicy() { + assertThrows( + IllegalArgumentException.class, + () -> builder.defaultLoadBalancingPolicy("unregistered_balancer") + ); + } + @Test public void defaultLoadBalancingPolicy_default() { assertEquals("pick_first", builder.defaultLbPolicy); From 72c8cbb1394ee07fbc7713af0421bdd8b55cbc72 Mon Sep 17 00:00:00 2001 From: Mohak Agrawal Date: Sun, 15 Mar 2026 19:38:16 +0530 Subject: [PATCH 2/3] fix: styling error (limitation of 100 chars per line) --- .../java/io/grpc/internal/ManagedChannelImplBuilder.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java index 4ff7d40cc73..9bc05f62b6d 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java @@ -450,7 +450,10 @@ public ManagedChannelImplBuilder defaultLoadBalancingPolicy(String policy) { directServerAddress); Preconditions.checkArgument(policy != null, "policy cannot be null"); LoadBalancerProvider provider = LoadBalancerRegistry.getDefaultRegistry().getProvider(policy); - Preconditions.checkArgument(provider != null, "No provider available for the '%s' load balancing policy.", policy); + Preconditions.checkArgument( + provider != null, + "No provider available for the '%s' load balancing policy.", + policy); this.defaultLbPolicy = provider.getPolicyName(); return this; } From f6b9459e81114e838afe7493f0b3eccffe47e31b Mon Sep 17 00:00:00 2001 From: Mohak Agrawal Date: Sun, 15 Mar 2026 19:48:48 +0530 Subject: [PATCH 3/3] fix: styling error (spacing) --- .../java/io/grpc/internal/ManagedChannelImplBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java index 9bc05f62b6d..34ae6f620e3 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java @@ -451,9 +451,9 @@ public ManagedChannelImplBuilder defaultLoadBalancingPolicy(String policy) { Preconditions.checkArgument(policy != null, "policy cannot be null"); LoadBalancerProvider provider = LoadBalancerRegistry.getDefaultRegistry().getProvider(policy); Preconditions.checkArgument( - provider != null, - "No provider available for the '%s' load balancing policy.", - policy); + provider != null, + "No provider available for the '%s' load balancing policy.", + policy); this.defaultLbPolicy = provider.getPolicyName(); return this; }