diff --git a/rls/src/main/java/io/grpc/rls/LbPolicyConfiguration.java b/rls/src/main/java/io/grpc/rls/LbPolicyConfiguration.java index 0abef014f8a..5b8dde3d39c 100644 --- a/rls/src/main/java/io/grpc/rls/LbPolicyConfiguration.java +++ b/rls/src/main/java/io/grpc/rls/LbPolicyConfiguration.java @@ -302,8 +302,10 @@ public ChildPolicyWrapper( new Runnable() { @Override public void run() { - lb.handleResolvedAddresses( - childLbResolvedAddressFactory.create(lbConfig.getConfig())); + if (!lb.acceptResolvedAddresses( + childLbResolvedAddressFactory.create(lbConfig.getConfig()))) { + helper.refreshNameResolution(); + } lb.requestConnection(); } }); diff --git a/rls/src/test/java/io/grpc/rls/LbPolicyConfigurationTest.java b/rls/src/test/java/io/grpc/rls/LbPolicyConfigurationTest.java index 36022cb25e6..760be9a8501 100644 --- a/rls/src/test/java/io/grpc/rls/LbPolicyConfigurationTest.java +++ b/rls/src/test/java/io/grpc/rls/LbPolicyConfigurationTest.java @@ -57,6 +57,7 @@ public class LbPolicyConfigurationTest { private final Helper helper = mock(Helper.class); private final LoadBalancerProvider lbProvider = mock(LoadBalancerProvider.class); + private final LoadBalancer lb = mock(LoadBalancer.class); private final SubchannelStateManager subchannelStateManager = new SubchannelStateManagerImpl(); private final SubchannelPicker picker = mock(SubchannelPicker.class); private final ChildLbStatusListener childLbStatusListener = mock(ChildLbStatusListener.class); @@ -91,7 +92,7 @@ public void uncaughtException(Thread t, Throwable e) { } })) .when(helper).getSynchronizationContext(); - doReturn(mock(LoadBalancer.class)).when(lbProvider).newLoadBalancer(any(Helper.class)); + doReturn(lb).when(lbProvider).newLoadBalancer(any(Helper.class)); doReturn(ConfigOrError.fromConfig(new Object())) .when(lbProvider).parseLoadBalancingPolicyConfig(ArgumentMatchers.>any()); } @@ -120,6 +121,13 @@ public void childPolicyWrapper_refCounted() { } } + @Test + public void childPolicyWrapper_addressesRejected() { + when(lb.acceptResolvedAddresses(any(ResolvedAddresses.class))).thenReturn(false); + factory.createOrGet("target"); + verify(helper).refreshNameResolution(); + } + @Test public void childLoadBalancingPolicy_effectiveChildPolicy() { LoadBalancerProvider mockProvider = mock(LoadBalancerProvider.class);