core: fix a bug that Channel won't work if NameResolver returns a ServiceConfig without LB config. (#5134)
diff --git a/core/src/main/java/io/grpc/internal/AutoConfiguredLoadBalancerFactory.java b/core/src/main/java/io/grpc/internal/AutoConfiguredLoadBalancerFactory.java
index 22803f1..6c47655 100644
--- a/core/src/main/java/io/grpc/internal/AutoConfiguredLoadBalancerFactory.java
+++ b/core/src/main/java/io/grpc/internal/AutoConfiguredLoadBalancerFactory.java
@@ -222,9 +222,11 @@
}
roundRobinDueToGrpclbDepMissing = false;
+ List<Map<String, Object>> lbConfigs = null;
if (config != null) {
- List<Map<String, Object>> lbConfigs =
- ServiceConfigUtil.getLoadBalancingConfigsFromServiceConfig(config);
+ lbConfigs = ServiceConfigUtil.getLoadBalancingConfigsFromServiceConfig(config);
+ }
+ if (lbConfigs != null && !lbConfigs.isEmpty()) {
LinkedHashSet<String> policiesTried = new LinkedHashSet<>();
for (Map<String, Object> lbConfig : lbConfigs) {
if (lbConfig.size() != 1) {
diff --git a/core/src/test/java/io/grpc/internal/AutoConfiguredLoadBalancerFactoryTest.java b/core/src/test/java/io/grpc/internal/AutoConfiguredLoadBalancerFactoryTest.java
index d95af10..a74a7fe 100644
--- a/core/src/test/java/io/grpc/internal/AutoConfiguredLoadBalancerFactoryTest.java
+++ b/core/src/test/java/io/grpc/internal/AutoConfiguredLoadBalancerFactoryTest.java
@@ -518,6 +518,21 @@
}
@Test
+ public void decideLoadBalancerProvider_serviceConfigHasZeroLbConfig() throws Exception {
+ AutoConfiguredLoadBalancer lb =
+ (AutoConfiguredLoadBalancer) lbf.newLoadBalancer(new TestHelper());
+ List<EquivalentAddressGroup> servers =
+ Collections.singletonList(new EquivalentAddressGroup(new SocketAddress(){}));
+ PolicySelection selection = lb.decideLoadBalancerProvider(
+ servers, Collections.<String, Object>emptyMap());
+
+ assertThat(selection.provider).isInstanceOf(PickFirstLoadBalancerProvider.class);
+ assertThat(selection.serverList).isEqualTo(servers);
+ assertThat(selection.config).isNull();
+ verifyZeroInteractions(channelLogger);
+ }
+
+ @Test
public void channelTracing_lbPolicyChanged() {
final FakeClock clock = new FakeClock();
List<EquivalentAddressGroup> servers =