use of io.grpc.internal.FakeClock.ScheduledTask in project grpc-java by grpc.
the class ClientXdsClientTestBase method streamClosedAndRetryRestartsResourceInitialFetchTimerForUnresolvedResources.
@Test
public void streamClosedAndRetryRestartsResourceInitialFetchTimerForUnresolvedResources() {
xdsClient.watchLdsResource(LDS_RESOURCE, ldsResourceWatcher);
xdsClient.watchRdsResource(RDS_RESOURCE, rdsResourceWatcher);
xdsClient.watchCdsResource(CDS_RESOURCE, cdsResourceWatcher);
xdsClient.watchEdsResource(EDS_RESOURCE, edsResourceWatcher);
DiscoveryRpcCall call = resourceDiscoveryCalls.poll();
ScheduledTask ldsResourceTimeout = Iterables.getOnlyElement(fakeClock.getPendingTasks(LDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER));
ScheduledTask rdsResourceTimeout = Iterables.getOnlyElement(fakeClock.getPendingTasks(RDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER));
ScheduledTask cdsResourceTimeout = Iterables.getOnlyElement(fakeClock.getPendingTasks(CDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER));
ScheduledTask edsResourceTimeout = Iterables.getOnlyElement(fakeClock.getPendingTasks(EDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER));
call.sendResponse(LDS, testListenerRds, VERSION_1, "0000");
assertThat(ldsResourceTimeout.isCancelled()).isTrue();
call.sendResponse(RDS, testRouteConfig, VERSION_1, "0000");
assertThat(rdsResourceTimeout.isCancelled()).isTrue();
call.sendError(Status.UNAVAILABLE.asException());
assertThat(cdsResourceTimeout.isCancelled()).isTrue();
assertThat(edsResourceTimeout.isCancelled()).isTrue();
fakeClock.forwardNanos(10L);
assertThat(fakeClock.getPendingTasks(LDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER)).hasSize(0);
assertThat(fakeClock.getPendingTasks(RDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER)).hasSize(0);
assertThat(fakeClock.getPendingTasks(CDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER)).hasSize(1);
assertThat(fakeClock.getPendingTasks(EDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER)).hasSize(1);
}
use of io.grpc.internal.FakeClock.ScheduledTask in project grpc-java by grpc.
the class ClientXdsClientTestBase method startResourceWatcher.
private DiscoveryRpcCall startResourceWatcher(ResourceType type, String name, ResourceWatcher watcher) {
FakeClock.TaskFilter timeoutTaskFilter;
switch(type) {
case LDS:
timeoutTaskFilter = LDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER;
xdsClient.watchLdsResource(name, (LdsResourceWatcher) watcher);
break;
case RDS:
timeoutTaskFilter = RDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER;
xdsClient.watchRdsResource(name, (RdsResourceWatcher) watcher);
break;
case CDS:
timeoutTaskFilter = CDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER;
xdsClient.watchCdsResource(name, (CdsResourceWatcher) watcher);
break;
case EDS:
timeoutTaskFilter = EDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER;
xdsClient.watchEdsResource(name, (EdsResourceWatcher) watcher);
break;
case UNKNOWN:
default:
throw new AssertionError("should never be here");
}
DiscoveryRpcCall call = resourceDiscoveryCalls.poll();
call.verifyRequest(type, Collections.singletonList(name), "", "", NODE);
ScheduledTask timeoutTask = Iterables.getOnlyElement(fakeClock.getPendingTasks(timeoutTaskFilter));
assertThat(timeoutTask.getDelay(TimeUnit.SECONDS)).isEqualTo(ClientXdsClient.INITIAL_RESOURCE_FETCH_TIMEOUT_SEC);
return call;
}
use of io.grpc.internal.FakeClock.ScheduledTask in project grpc-java by grpc.
the class ManagedChannelImplIdlenessTest method allPendingTasksAreRun.
@After
public void allPendingTasksAreRun() {
Collection<ScheduledTask> pendingTimerTasks = timer.getPendingTasks();
for (ScheduledTask a : pendingTimerTasks) {
assertFalse(Rescheduler.isEnabled(a.command));
}
assertEquals(executor.getPendingTasks() + " should be empty", 0, executor.numPendingTasks());
}
use of io.grpc.internal.FakeClock.ScheduledTask in project grpc-java by grpc.
the class ClientXdsClientTestBase method streamClosedAndRetryRaceWithAddRemoveWatchers.
@Test
public void streamClosedAndRetryRaceWithAddRemoveWatchers() {
xdsClient.watchLdsResource(LDS_RESOURCE, ldsResourceWatcher);
xdsClient.watchRdsResource(RDS_RESOURCE, rdsResourceWatcher);
DiscoveryRpcCall call = resourceDiscoveryCalls.poll();
call.sendError(Status.UNAVAILABLE.asException());
verify(ldsResourceWatcher).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
verify(rdsResourceWatcher).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
ScheduledTask retryTask = Iterables.getOnlyElement(fakeClock.getPendingTasks(RPC_RETRY_TASK_FILTER));
assertThat(retryTask.getDelay(TimeUnit.NANOSECONDS)).isEqualTo(10L);
xdsClient.cancelLdsResourceWatch(LDS_RESOURCE, ldsResourceWatcher);
xdsClient.cancelRdsResourceWatch(RDS_RESOURCE, rdsResourceWatcher);
xdsClient.watchCdsResource(CDS_RESOURCE, cdsResourceWatcher);
xdsClient.watchEdsResource(EDS_RESOURCE, edsResourceWatcher);
fakeClock.forwardNanos(10L);
call = resourceDiscoveryCalls.poll();
call.verifyRequest(CDS, CDS_RESOURCE, "", "", NODE);
call.verifyRequest(EDS, EDS_RESOURCE, "", "", NODE);
call.verifyNoMoreRequest();
call.sendResponse(LDS, testListenerRds, VERSION_1, "0000");
List<Any> routeConfigs = ImmutableList.of(Any.pack(mf.buildRouteConfiguration(RDS_RESOURCE, mf.buildOpaqueVirtualHosts(VHOST_SIZE))));
call.sendResponse(RDS, routeConfigs, VERSION_1, "0000");
verifyNoMoreInteractions(ldsResourceWatcher, rdsResourceWatcher);
}
use of io.grpc.internal.FakeClock.ScheduledTask in project grpc-java by grpc.
the class ClientXdsClientTestBase method streamClosedAndRetryWithBackoff.
@Test
public void streamClosedAndRetryWithBackoff() {
InOrder inOrder = Mockito.inOrder(backoffPolicyProvider, backoffPolicy1, backoffPolicy2);
xdsClient.watchLdsResource(LDS_RESOURCE, ldsResourceWatcher);
xdsClient.watchRdsResource(RDS_RESOURCE, rdsResourceWatcher);
xdsClient.watchCdsResource(CDS_RESOURCE, cdsResourceWatcher);
xdsClient.watchEdsResource(EDS_RESOURCE, edsResourceWatcher);
DiscoveryRpcCall call = resourceDiscoveryCalls.poll();
call.verifyRequest(LDS, LDS_RESOURCE, "", "", NODE);
call.verifyRequest(RDS, RDS_RESOURCE, "", "", NODE);
call.verifyRequest(CDS, CDS_RESOURCE, "", "", NODE);
call.verifyRequest(EDS, EDS_RESOURCE, "", "", NODE);
// Management server closes the RPC stream with an error.
call.sendError(Status.UNKNOWN.asException());
verify(ldsResourceWatcher).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNKNOWN);
verify(rdsResourceWatcher).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNKNOWN);
verify(cdsResourceWatcher).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNKNOWN);
verify(edsResourceWatcher).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNKNOWN);
// Retry after backoff.
inOrder.verify(backoffPolicyProvider).get();
inOrder.verify(backoffPolicy1).nextBackoffNanos();
ScheduledTask retryTask = Iterables.getOnlyElement(fakeClock.getPendingTasks(RPC_RETRY_TASK_FILTER));
assertThat(retryTask.getDelay(TimeUnit.NANOSECONDS)).isEqualTo(10L);
fakeClock.forwardNanos(10L);
call = resourceDiscoveryCalls.poll();
call.verifyRequest(LDS, LDS_RESOURCE, "", "", NODE);
call.verifyRequest(RDS, RDS_RESOURCE, "", "", NODE);
call.verifyRequest(CDS, CDS_RESOURCE, "", "", NODE);
call.verifyRequest(EDS, EDS_RESOURCE, "", "", NODE);
// Management server becomes unreachable.
call.sendError(Status.UNAVAILABLE.asException());
verify(ldsResourceWatcher, times(2)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
verify(rdsResourceWatcher, times(2)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
verify(cdsResourceWatcher, times(2)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
verify(edsResourceWatcher, times(2)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
// Retry after backoff.
inOrder.verify(backoffPolicy1).nextBackoffNanos();
retryTask = Iterables.getOnlyElement(fakeClock.getPendingTasks(RPC_RETRY_TASK_FILTER));
assertThat(retryTask.getDelay(TimeUnit.NANOSECONDS)).isEqualTo(100L);
fakeClock.forwardNanos(100L);
call = resourceDiscoveryCalls.poll();
call.verifyRequest(LDS, LDS_RESOURCE, "", "", NODE);
call.verifyRequest(RDS, RDS_RESOURCE, "", "", NODE);
call.verifyRequest(CDS, CDS_RESOURCE, "", "", NODE);
call.verifyRequest(EDS, EDS_RESOURCE, "", "", NODE);
List<Any> listeners = ImmutableList.of(Any.pack(mf.buildListenerWithApiListener(LDS_RESOURCE, mf.buildRouteConfiguration("do not care", mf.buildOpaqueVirtualHosts(2)))));
call.sendResponse(LDS, listeners, "63", "3242");
call.verifyRequest(LDS, LDS_RESOURCE, "63", "3242", NODE);
List<Any> routeConfigs = ImmutableList.of(Any.pack(mf.buildRouteConfiguration(RDS_RESOURCE, mf.buildOpaqueVirtualHosts(2))));
call.sendResponse(RDS, routeConfigs, "5", "6764");
call.verifyRequest(RDS, RDS_RESOURCE, "5", "6764", NODE);
call.sendError(Status.DEADLINE_EXCEEDED.asException());
verify(ldsResourceWatcher, times(3)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.DEADLINE_EXCEEDED);
verify(rdsResourceWatcher, times(3)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.DEADLINE_EXCEEDED);
verify(cdsResourceWatcher, times(3)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.DEADLINE_EXCEEDED);
verify(edsResourceWatcher, times(3)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.DEADLINE_EXCEEDED);
// Reset backoff sequence and retry immediately.
inOrder.verify(backoffPolicyProvider).get();
fakeClock.runDueTasks();
call = resourceDiscoveryCalls.poll();
call.verifyRequest(LDS, LDS_RESOURCE, "63", "", NODE);
call.verifyRequest(RDS, RDS_RESOURCE, "5", "", NODE);
call.verifyRequest(CDS, CDS_RESOURCE, "", "", NODE);
call.verifyRequest(EDS, EDS_RESOURCE, "", "", NODE);
// Management server becomes unreachable again.
call.sendError(Status.UNAVAILABLE.asException());
verify(ldsResourceWatcher, times(4)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
verify(rdsResourceWatcher, times(4)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
verify(cdsResourceWatcher, times(4)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
verify(edsResourceWatcher, times(4)).onError(errorCaptor.capture());
assertThat(errorCaptor.getValue().getCode()).isEqualTo(Code.UNAVAILABLE);
// Retry after backoff.
inOrder.verify(backoffPolicy2).nextBackoffNanos();
retryTask = Iterables.getOnlyElement(fakeClock.getPendingTasks(RPC_RETRY_TASK_FILTER));
assertThat(retryTask.getDelay(TimeUnit.NANOSECONDS)).isEqualTo(20L);
fakeClock.forwardNanos(20L);
call = resourceDiscoveryCalls.poll();
call.verifyRequest(LDS, LDS_RESOURCE, "63", "", NODE);
call.verifyRequest(RDS, RDS_RESOURCE, "5", "", NODE);
call.verifyRequest(CDS, CDS_RESOURCE, "", "", NODE);
call.verifyRequest(EDS, EDS_RESOURCE, "", "", NODE);
inOrder.verifyNoMoreInteractions();
}
Aggregations