grpclb: refresh name resolution when balancer stream closed. (#5127)

This commit is contained in:
Kun Zhang 2018-12-05 16:35:42 -08:00 committed by GitHub
parent edede01da6
commit 28587b449b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 2 deletions

View File

@ -583,6 +583,8 @@ final class GrpclbState {
syncContext.schedule(new LbRpcRetryTask(), delayNanos, TimeUnit.NANOSECONDS, syncContext.schedule(new LbRpcRetryTask(), delayNanos, TimeUnit.NANOSECONDS,
timerService); timerService);
} }
helper.refreshNameResolution();
} }
void close(@Nullable Exception error) { void close(@Nullable Exception error) {

View File

@ -1467,14 +1467,14 @@ public class GrpclbLoadBalancerTest {
} }
@Test @Test
public void grpclbBalancerStreamRetry() throws Exception { public void grpclbBalancerStreamClosedAndRetried() throws Exception {
LoadBalanceRequest expectedInitialRequest = LoadBalanceRequest expectedInitialRequest =
LoadBalanceRequest.newBuilder() LoadBalanceRequest.newBuilder()
.setInitialRequest( .setInitialRequest(
InitialLoadBalanceRequest.newBuilder().setName(SERVICE_AUTHORITY).build()) InitialLoadBalanceRequest.newBuilder().setName(SERVICE_AUTHORITY).build())
.build(); .build();
InOrder inOrder = InOrder inOrder =
inOrder(mockLbService, backoffPolicyProvider, backoffPolicy1, backoffPolicy2); inOrder(mockLbService, backoffPolicyProvider, backoffPolicy1, backoffPolicy2, helper);
List<EquivalentAddressGroup> grpclbResolutionList = createResolvedServerAddresses(true); List<EquivalentAddressGroup> grpclbResolutionList = createResolvedServerAddresses(true);
Attributes grpclbResolutionAttrs = Attributes.EMPTY; Attributes grpclbResolutionAttrs = Attributes.EMPTY;
deliverResolvedAddresses(grpclbResolutionList, grpclbResolutionAttrs); deliverResolvedAddresses(grpclbResolutionList, grpclbResolutionAttrs);
@ -1493,10 +1493,12 @@ public class GrpclbLoadBalancerTest {
// Balancer closes it immediately (erroneously) // Balancer closes it immediately (erroneously)
lbResponseObserver.onCompleted(); lbResponseObserver.onCompleted();
// Will start backoff sequence 1 (10ns) // Will start backoff sequence 1 (10ns)
inOrder.verify(backoffPolicyProvider).get(); inOrder.verify(backoffPolicyProvider).get();
inOrder.verify(backoffPolicy1).nextBackoffNanos(); inOrder.verify(backoffPolicy1).nextBackoffNanos();
assertEquals(1, fakeClock.numPendingTasks(LB_RPC_RETRY_TASK_FILTER)); assertEquals(1, fakeClock.numPendingTasks(LB_RPC_RETRY_TASK_FILTER));
inOrder.verify(helper).refreshNameResolution();
// Fast-forward to a moment before the retry // Fast-forward to a moment before the retry
fakeClock.forwardNanos(9); fakeClock.forwardNanos(9);
@ -1516,6 +1518,7 @@ public class GrpclbLoadBalancerTest {
verifyNoMoreInteractions(backoffPolicyProvider); verifyNoMoreInteractions(backoffPolicyProvider);
inOrder.verify(backoffPolicy1).nextBackoffNanos(); inOrder.verify(backoffPolicy1).nextBackoffNanos();
assertEquals(1, fakeClock.numPendingTasks(LB_RPC_RETRY_TASK_FILTER)); assertEquals(1, fakeClock.numPendingTasks(LB_RPC_RETRY_TASK_FILTER));
inOrder.verify(helper).refreshNameResolution();
// Fast-forward to a moment before the retry // Fast-forward to a moment before the retry
fakeClock.forwardNanos(100 - 1); fakeClock.forwardNanos(100 - 1);
@ -1542,6 +1545,7 @@ public class GrpclbLoadBalancerTest {
assertEquals(1, lbRequestObservers.size()); assertEquals(1, lbRequestObservers.size());
lbRequestObserver = lbRequestObservers.poll(); lbRequestObserver = lbRequestObservers.poll();
verify(lbRequestObserver).onNext(eq(expectedInitialRequest)); verify(lbRequestObserver).onNext(eq(expectedInitialRequest));
inOrder.verify(helper).refreshNameResolution();
// Fail the retry after spending 4ns // Fail the retry after spending 4ns
fakeClock.forwardNanos(4); fakeClock.forwardNanos(4);
@ -1550,6 +1554,7 @@ public class GrpclbLoadBalancerTest {
// Will be on the first retry (10ns) of backoff sequence 2. // Will be on the first retry (10ns) of backoff sequence 2.
inOrder.verify(backoffPolicy2).nextBackoffNanos(); inOrder.verify(backoffPolicy2).nextBackoffNanos();
assertEquals(1, fakeClock.numPendingTasks(LB_RPC_RETRY_TASK_FILTER)); assertEquals(1, fakeClock.numPendingTasks(LB_RPC_RETRY_TASK_FILTER));
inOrder.verify(helper).refreshNameResolution();
// Fast-forward to a moment before the retry, the time spent in the last try is deducted. // Fast-forward to a moment before the retry, the time spent in the last try is deducted.
fakeClock.forwardNanos(10 - 4 - 1); fakeClock.forwardNanos(10 - 4 - 1);
@ -1566,6 +1571,7 @@ public class GrpclbLoadBalancerTest {
verify(backoffPolicyProvider, times(2)).get(); verify(backoffPolicyProvider, times(2)).get();
verify(backoffPolicy1, times(2)).nextBackoffNanos(); verify(backoffPolicy1, times(2)).nextBackoffNanos();
verify(backoffPolicy2, times(1)).nextBackoffNanos(); verify(backoffPolicy2, times(1)).nextBackoffNanos();
verify(helper, times(4)).refreshNameResolution();
} }
private void deliverSubchannelState( private void deliverSubchannelState(