diff --git a/core/src/main/java/io/grpc/internal/PickFirstLeafLoadBalancer.java b/core/src/main/java/io/grpc/internal/PickFirstLeafLoadBalancer.java index ebe329ca591..f73013c07a3 100644 --- a/core/src/main/java/io/grpc/internal/PickFirstLeafLoadBalancer.java +++ b/core/src/main/java/io/grpc/internal/PickFirstLeafLoadBalancer.java @@ -449,6 +449,7 @@ private void shutdownRemaining(SubchannelData activeSubchannelData) { */ @Override public void requestConnection() { + boolean wasIdle = rawConnectivityState == IDLE; if (!addressIndex.isValid() || rawConnectivityState == SHUTDOWN) { return; } @@ -464,6 +465,10 @@ public void requestConnection() { case IDLE: subchannelData.subchannel.requestConnection(); subchannelData.updateState(CONNECTING); + if (wasIdle) { + rawConnectivityState = CONNECTING; + updateBalancingState(CONNECTING, new Picker(PickResult.withNoResult())); + } scheduleNextConnection(); break; case CONNECTING: diff --git a/core/src/test/java/io/grpc/internal/PickFirstLeafLoadBalancerTest.java b/core/src/test/java/io/grpc/internal/PickFirstLeafLoadBalancerTest.java index 0e902bfdd56..e50e8a24915 100644 --- a/core/src/test/java/io/grpc/internal/PickFirstLeafLoadBalancerTest.java +++ b/core/src/test/java/io/grpc/internal/PickFirstLeafLoadBalancerTest.java @@ -2461,7 +2461,7 @@ public void happy_eyeballs_pick_pushes_index_over_end() { PickResult pickResult = requestingPicker.pickSubchannel(mockArgs); assertEquals("RequestConnectionPicker", requestingPicker.getClass().getSimpleName()); assertEquals(PickResult.withNoResult(), pickResult); - assertEquals(IDLE, loadBalancer.getConcludedConnectivityState()); + assertEquals(CONNECTING, loadBalancer.getConcludedConnectivityState()); // Second pick moves index to addr 3 pickResult = requestingPicker.pickSubchannel(mockArgs); @@ -2496,7 +2496,7 @@ public void happy_eyeballs_pick_pushes_index_over_end() { pickResult = requestingPicker2.pickSubchannel(mockArgs); assertEquals(PickResult.withNoResult(), pickResult); } - assertEquals(IDLE, loadBalancer.getConcludedConnectivityState()); + assertEquals(CONNECTING, loadBalancer.getConcludedConnectivityState()); listeners[0].onSubchannelState(ConnectivityStateInfo.forTransientFailure(error)); inOrder.verify(mockSubchannel2n2).start(stateListenerCaptor.capture());