diff --git a/xds/src/main/java/io/grpc/xds/WeightedRoundRobinLoadBalancer.java b/xds/src/main/java/io/grpc/xds/WeightedRoundRobinLoadBalancer.java index b7a4d7d5d08..1c6ab246126 100644 --- a/xds/src/main/java/io/grpc/xds/WeightedRoundRobinLoadBalancer.java +++ b/xds/src/main/java/io/grpc/xds/WeightedRoundRobinLoadBalancer.java @@ -378,6 +378,9 @@ public PickResult pickSubchannel(PickSubchannelArgs args) { WeightedChildLbState wChild = (WeightedChildLbState) childLbState; PickResult pickResult = childLbState.getCurrentPicker().pickSubchannel(args); Subchannel subchannel = pickResult.getSubchannel(); + if (subchannel == null) { + return pickResult; + } if (!enableOobLoadReport) { return PickResult.withSubchannel(subchannel, OrcaPerRequestUtil.getInstance().newOrcaClientStreamTracerFactory( diff --git a/xds/src/test/java/io/grpc/xds/WeightedRoundRobinLoadBalancerTest.java b/xds/src/test/java/io/grpc/xds/WeightedRoundRobinLoadBalancerTest.java index dfbbf9b0816..41847d21d87 100644 --- a/xds/src/test/java/io/grpc/xds/WeightedRoundRobinLoadBalancerTest.java +++ b/xds/src/test/java/io/grpc/xds/WeightedRoundRobinLoadBalancerTest.java @@ -47,6 +47,7 @@ import io.grpc.LoadBalancer.Subchannel; import io.grpc.LoadBalancer.SubchannelPicker; import io.grpc.LoadBalancer.SubchannelStateListener; +import io.grpc.Status; import io.grpc.SynchronizationContext; import io.grpc.internal.FakeClock; import io.grpc.internal.TestUtils; @@ -162,6 +163,22 @@ public ClientCall answer( verify(helper, times(3)).createSubchannel(any(CreateSubchannelArgs.class)); } + @Test + public void pickChildLbTF() throws Exception { + syncContext.execute(() -> wrr.acceptResolvedAddresses(ResolvedAddresses.newBuilder() + .setAddresses(servers.subList(0, 1)).setLoadBalancingPolicyConfig(weightedConfig) + .setAttributes(affinity).build())); + Iterator it = subchannels.values().iterator(); + Subchannel readySubchannel1 = it.next(); + getSubchannelStateListener(readySubchannel1).onSubchannelState(ConnectivityStateInfo + .forTransientFailure(Status.UNAVAILABLE)); + verify(helper).updateBalancingState( + eq(ConnectivityState.TRANSIENT_FAILURE), pickerCaptor.capture()); + final WeightedRoundRobinPicker weightedPicker = + (WeightedRoundRobinPicker) pickerCaptor.getValue(); + weightedPicker.pickSubchannel(mockArgs); + } + @Test public void wrrLifeCycle() { syncContext.execute(() -> wrr.acceptResolvedAddresses(ResolvedAddresses.newBuilder()