Skip to content
Prev Previous commit
Next Next commit
Only need to do state transition based on RR LB's state without looki…
…ng into each subchannel's state.
  • Loading branch information
voidzcy committed Apr 3, 2020
commit b3fd8a74b89b041fc1c5f335a74d7b10bb701b1c
11 changes: 4 additions & 7 deletions core/src/main/java/io/grpc/util/RoundRobinLoadBalancer.java
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,7 @@ private void processSubchannelState(Subchannel subchannel, ConnectivityStateInfo
if (stateInfo.getState() == IDLE) {
subchannel.requestConnection();
}
Ref<ConnectivityStateInfo> subchannelStateRef = getSubchannelStateInfoRef(subchannel);
if (subchannelStateRef.value.getState().equals(TRANSIENT_FAILURE)) {
if (stateInfo.getState().equals(CONNECTING)) {
return;
}
}
subchannelStateRef.value = stateInfo;
getSubchannelStateInfoRef(subchannel).value = stateInfo;
updateBalancingState();
}

Expand Down Expand Up @@ -203,6 +197,9 @@ private void updateBalancingState() {

private void updateBalancingState(ConnectivityState state, RoundRobinPicker picker) {
if (state != currentState || !picker.isEquivalentTo(currentPicker)) {
if (currentState == TRANSIENT_FAILURE && state != READY) {
return;
}
helper.updateBalancingState(state, picker);
currentState = state;
currentPicker = picker;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,13 @@ public void stayTransientFailureUntilReady() {
}
inOrder.verify(mockHelper).updateBalancingState(eq(TRANSIENT_FAILURE), isA(EmptyPicker.class));

for (Subchannel sc : loadBalancer.getSubchannels()) {
deliverSubchannelState(
sc,
ConnectivityStateInfo.forNonError(IDLE));
}
inOrder.verifyNoMoreInteractions();

for (Subchannel sc : loadBalancer.getSubchannels()) {
deliverSubchannelState(
sc,
Expand Down