Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion xds/src/main/java/io/grpc/xds/PriorityLoadBalancer.java
Original file line number Diff line number Diff line change
Expand Up @@ -320,13 +320,14 @@ public void updateBalancingState(final ConnectivityState newState,
if (!children.containsKey(priority)) {
return;
}
ConnectivityState oldState = connectivityState;
connectivityState = newState;
picker = newPicker;

if (deletionTimer != null && deletionTimer.isPending()) {
return;
}
if (newState.equals(CONNECTING)) {
if (newState.equals(CONNECTING) && !oldState.equals(newState)) {
if (!failOverTimer.isPending() && seenReadyOrIdleSinceTransientFailure) {
failOverTimer = syncContext.schedule(new FailOverTask(), 10, TimeUnit.SECONDS,
executor);
Expand Down
51 changes: 51 additions & 0 deletions xds/src/test/java/io/grpc/xds/PriorityLoadBalancerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
Expand Down Expand Up @@ -70,6 +71,7 @@
import org.junit.runners.JUnit4;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
Expand Down Expand Up @@ -554,6 +556,55 @@ public void connectingResetFailOverIfSeenReadyOrIdleSinceTransientFailure() {
assertThat(fooHelpers).hasSize(2);
}

@Test
public void failoverTimerNotRestartedOnDupConnecting() {
InOrder inOrder = inOrder(helper);
PriorityChildConfig priorityChildConfig0 =
new PriorityChildConfig(newChildConfig(fooLbProvider, new Object()), true);
PriorityChildConfig priorityChildConfig1 =
new PriorityChildConfig(newChildConfig(fooLbProvider, new Object()), true);
PriorityLbConfig priorityLbConfig =
new PriorityLbConfig(
ImmutableMap.of("p0", priorityChildConfig0, "p1", priorityChildConfig1),
ImmutableList.of("p0", "p1"));
priorityLb.acceptResolvedAddresses(
ResolvedAddresses.newBuilder()
.setAddresses(ImmutableList.<EquivalentAddressGroup>of())
.setLoadBalancingPolicyConfig(priorityLbConfig)
.build());
// Nothing important about this verify, other than to provide a baseline
inOrder.verify(helper)
.updateBalancingState(eq(CONNECTING), pickerReturns(PickResult.withNoResult()));
assertThat(fooBalancers).hasSize(1);
assertThat(fooHelpers).hasSize(1);
Helper helper0 = Iterables.getOnlyElement(fooHelpers);

// Cause seenReadyOrIdleSinceTransientFailure = true
helper0.updateBalancingState(IDLE, EMPTY_PICKER);
inOrder.verify(helper)
.updateBalancingState(eq(IDLE), pickerReturns(PickResult.withNoResult()));
helper0.updateBalancingState(CONNECTING, EMPTY_PICKER);

// p0 keeps repeating CONNECTING, failover happens
fakeClock.forwardTime(5, TimeUnit.SECONDS);
helper0.updateBalancingState(CONNECTING, EMPTY_PICKER);
fakeClock.forwardTime(5, TimeUnit.SECONDS);
assertThat(fooBalancers).hasSize(2);
assertThat(fooHelpers).hasSize(2);
inOrder.verify(helper, times(2))
.updateBalancingState(eq(CONNECTING), pickerReturns(PickResult.withNoResult()));
Helper helper1 = Iterables.getLast(fooHelpers);

// p0 keeps repeating CONNECTING, no reset of failover timer
helper1.updateBalancingState(IDLE, EMPTY_PICKER); // Stop timer for p1
inOrder.verify(helper)
.updateBalancingState(eq(IDLE), pickerReturns(PickResult.withNoResult()));
helper0.updateBalancingState(CONNECTING, EMPTY_PICKER);
fakeClock.forwardTime(10, TimeUnit.SECONDS);
inOrder.verify(helper, never())
.updateBalancingState(eq(CONNECTING), any());
}

@Test
public void readyToConnectDoesNotFailOverButUpdatesPicker() {
PriorityChildConfig priorityChildConfig0 =
Expand Down