@Test public void testNoRpcTimeout() { parentFuture.timedAttemptSettings = parentFuture.timedAttemptSettings.toBuilder().setRpcTimeout(Duration.ZERO).build(); MutateRowsRequest request = MutateRowsRequest.newBuilder().addEntries(Entry.getDefaultInstance()).build(); innerCallable.response.add( MutateRowsResponse.newBuilder() .addEntries( MutateRowsResponse.Entry.newBuilder().setIndex(0).setStatus(OK_STATUS_PROTO)) .build()); MutateRowsAttemptCallable attemptCallable = new MutateRowsAttemptCallable(innerCallable, request, callContext, retryCodes); attemptCallable.setExternalFuture(parentFuture); attemptCallable.call(); assertThat(innerCallable.lastContext.getTimeout()).isNull(); }
@Override public RetryingFuture<Void> futureCall(MutateRowsRequest request, ApiCallContext inputContext) { ApiCallContext context = callContextPrototype.nullToSelf(inputContext); MutateRowsAttemptCallable retryCallable = new MutateRowsAttemptCallable(callable.all(), request, context, retryCodes); RetryingFuture<Void> retryingFuture = executor.createFuture(retryCallable); retryCallable.setExternalFuture(retryingFuture); retryCallable.call(); return retryingFuture; }
if (!externalFuture.getAttemptSettings().getRpcTimeout().isZero()) { currentCallContext = currentCallContext.withTimeout(externalFuture.getAttemptSettings().getRpcTimeout());
@Override public ResponseT call() { ApiCallContext callContext = originalCallContext; try { Duration rpcTimeout = externalFuture.getAttemptSettings().getRpcTimeout(); if (!rpcTimeout.isZero()) { callContext = callContext.withTimeout(rpcTimeout); } externalFuture.setAttemptFuture(new NonCancellableFuture<ResponseT>()); if (externalFuture.isDone()) { return null; } callContext .getTracer() .attemptStarted(externalFuture.getAttemptSettings().getOverallAttemptCount()); ApiFuture<ResponseT> internalFuture = callable.futureCall(request, callContext); externalFuture.setAttemptFuture(internalFuture); } catch (Throwable e) { externalFuture.setAttemptFuture(ApiFutures.<ResponseT>immediateFailedFuture(e)); } return null; } }
@Override public void call( RequestT request, ResponseObserver<ResponseT> responseObserver, ApiCallContext context) { // If the caller never configured the timeouts, disable them Duration waitTimeout = MoreObjects.firstNonNull(context.getStreamWaitTimeout(), Duration.ZERO); Duration idleTimeout = MoreObjects.firstNonNull(context.getStreamIdleTimeout(), Duration.ZERO); responseObserver = watchdog.watch(responseObserver, waitTimeout, idleTimeout); inner.call(request, responseObserver, context); } }
@Override public ApiFuture<Void> cancel(String operationName, ApiCallContext thisCallContext) { return OperationCallable.this.cancel( operationName, defaultCallContext.merge(thisCallContext)); } };
attemptContext.withStreamWaitTimeout( outerRetryingFuture.getAttemptSettings().getRpcTimeout()); .getTracer() .attemptStarted(outerRetryingFuture.getAttemptSettings().getOverallAttemptCount());
transportChannel.getEmptyCallContext().withTransportChannel(transportChannel); if (credentials != null) { defaultCallContext = defaultCallContext.withCredentials(credentials);
@Test public void testMergeWithNullStreamingWaitTimeout() { Duration timeout = Duration.ofSeconds(10); GrpcCallContext baseContext = GrpcCallContext.createDefault().withStreamWaitTimeout(timeout); GrpcCallContext defaultOverlay = GrpcCallContext.createDefault(); Truth.assertThat(baseContext.merge(defaultOverlay).getStreamWaitTimeout()).isEqualTo(timeout); GrpcCallContext explicitNullOverlay = GrpcCallContext.createDefault().withStreamWaitTimeout(null); Truth.assertThat(baseContext.merge(explicitNullOverlay).getStreamWaitTimeout()) .isEqualTo(timeout); }
@Test public void testMergeWithNullStreamingIdleTimeout() { Duration timeout = Duration.ofSeconds(10); GrpcCallContext baseContext = GrpcCallContext.createDefault().withStreamIdleTimeout(timeout); GrpcCallContext defaultOverlay = GrpcCallContext.createDefault(); Truth.assertThat(baseContext.merge(defaultOverlay).getStreamIdleTimeout()).isEqualTo(timeout); GrpcCallContext explicitNullOverlay = GrpcCallContext.createDefault().withStreamIdleTimeout(null); Truth.assertThat(baseContext.merge(explicitNullOverlay).getStreamIdleTimeout()) .isEqualTo(timeout); }
@Test public void testMergeWithTracer() { ApiTracer explicitTracer = Mockito.mock(ApiTracer.class); GrpcCallContext ctxWithExplicitTracer = GrpcCallContext.createDefault().withTracer(explicitTracer); GrpcCallContext ctxWithDefaultTracer = GrpcCallContext.createDefault(); ApiTracer defaultTracer = ctxWithDefaultTracer.getTracer(); // Explicit tracer overrides the default tracer. Truth.assertThat(ctxWithDefaultTracer.merge(ctxWithExplicitTracer).getTracer()) .isSameAs(explicitTracer); // Default tracer does not override an explicit tracer. Truth.assertThat(ctxWithExplicitTracer.merge(ctxWithDefaultTracer).getTracer()) .isSameAs(explicitTracer); // Default tracer does not override another default tracer. Truth.assertThat(ctxWithDefaultTracer.merge(GrpcCallContext.createDefault()).getTracer()) .isSameAs(defaultTracer); }
@BetaApi("The surface for streaming is not stable yet and may change in the future.") public static <RequestT, ResponseT> ServerStreamingCallable<RequestT, ResponseT> watched( ServerStreamingCallable<RequestT, ResponseT> callable, ServerStreamingCallSettings<RequestT, ResponseT> callSettings, ClientContext clientContext) { callable = new WatchdogServerStreamingCallable<>(callable, clientContext.getStreamWatchdog()); callable = callable.withDefaultCallContext( clientContext .getDefaultCallContext() .withStreamIdleTimeout(callSettings.getIdleTimeout())); return callable; }
@Override public ResponseT call() { ApiCallContext callContext = originalCallContext; try { Duration rpcTimeout = externalFuture.getAttemptSettings().getRpcTimeout(); if (!rpcTimeout.isZero()) { callContext = callContext.withTimeout(rpcTimeout); } externalFuture.setAttemptFuture(new NonCancellableFuture<ResponseT>()); if (externalFuture.isDone()) { return null; } callContext .getTracer() .attemptStarted(externalFuture.getAttemptSettings().getOverallAttemptCount()); ApiFuture<ResponseT> internalFuture = callable.futureCall(request, callContext); externalFuture.setAttemptFuture(internalFuture); } catch (Throwable e) { externalFuture.setAttemptFuture(ApiFutures.<ResponseT>immediateFailedFuture(e)); } return null; } }
@Override public void call( RequestT request, ResponseObserver<ResponseT> responseObserver, ApiCallContext context) { // If the caller never configured the timeouts, disable them Duration waitTimeout = MoreObjects.firstNonNull(context.getStreamWaitTimeout(), Duration.ZERO); Duration idleTimeout = MoreObjects.firstNonNull(context.getStreamIdleTimeout(), Duration.ZERO); responseObserver = watchdog.watch(responseObserver, waitTimeout, idleTimeout); inner.call(request, responseObserver, context); } }
@Override public ApiFuture<ResponseT> futureCall(RequestT request, ApiCallContext thisCallContext) { return UnaryCallable.this.futureCall(request, defaultCallContext.merge(thisCallContext)); } };
attemptContext.withStreamWaitTimeout( outerRetryingFuture.getAttemptSettings().getRpcTimeout()); .getTracer() .attemptStarted(outerRetryingFuture.getAttemptSettings().getOverallAttemptCount());
transportChannel.getEmptyCallContext().withTransportChannel(transportChannel); if (credentials != null) { defaultCallContext = defaultCallContext.withCredentials(credentials);
@Test public void testMergeWithStreamingWaitTimeout() { Duration timeout = Duration.ofSeconds(19); GrpcCallContext ctx1 = GrpcCallContext.createDefault(); GrpcCallContext ctx2 = GrpcCallContext.createDefault().withStreamWaitTimeout(timeout); Truth.assertThat(ctx1.merge(ctx2).getStreamWaitTimeout()).isEqualTo(timeout); }
@Test public void testMergeWithStreamingIdleTimeout() { Duration timeout = Duration.ofSeconds(19); GrpcCallContext ctx1 = GrpcCallContext.createDefault(); GrpcCallContext ctx2 = GrpcCallContext.createDefault().withStreamIdleTimeout(timeout); Truth.assertThat(ctx1.merge(ctx2).getStreamIdleTimeout()).isEqualTo(timeout); }
@BetaApi("The surface for streaming is not stable yet and may change in the future.") public static <RequestT, ResponseT> ServerStreamingCallable<RequestT, ResponseT> watched( ServerStreamingCallable<RequestT, ResponseT> callable, ServerStreamingCallSettings<RequestT, ResponseT> callSettings, ClientContext clientContext) { callable = new WatchdogServerStreamingCallable<>(callable, clientContext.getStreamWatchdog()); callable = callable.withDefaultCallContext( clientContext .getDefaultCallContext() .withStreamIdleTimeout(callSettings.getIdleTimeout())); return callable; }