/** * Returns a reasonable timeout duration for a watch request. * * @param expectedTimeoutMillis timeout duration that a user wants to use, in milliseconds * @return timeout duration in milliseconds, between 1 and the {@link #MAX_MILLIS}. */ public static long makeReasonable(long expectedTimeoutMillis) { return makeReasonable(expectedTimeoutMillis, 0); }
/** * Returns a reasonable timeout duration for a watch request. * * @param expectedTimeoutMillis timeout duration that a user wants to use, in milliseconds * @return timeout duration in milliseconds, between 1 and the {@link #MAX_MILLIS}. */ public static long makeReasonable(long expectedTimeoutMillis) { return makeReasonable(expectedTimeoutMillis, 0); }
private <T> void scheduleTimeout(CompletableFuture<T> result, long timeoutMillis) { pendingFutures.add(result); final ScheduledFuture<?> timeoutFuture; if (timeoutMillis > 0) { timeoutMillis = WatchTimeout.makeReasonable(timeoutMillis); timeoutMillis = applyJitter(timeoutMillis); final EventLoop eventLoop = RequestContext.current().eventLoop(); timeoutFuture = eventLoop.schedule(() -> result.completeExceptionally(CANCELLATION_EXCEPTION), timeoutMillis, TimeUnit.MILLISECONDS); } else { timeoutFuture = null; } result.whenComplete((revision, cause) -> { if (timeoutFuture != null) { timeoutFuture.cancel(true); } pendingFutures.remove(result); }); }
private <T> void scheduleTimeout(CompletableFuture<T> result, long timeoutMillis) { pendingFutures.add(result); final ScheduledFuture<?> timeoutFuture; if (timeoutMillis > 0) { timeoutMillis = WatchTimeout.makeReasonable(timeoutMillis); timeoutMillis = applyJitter(timeoutMillis); final EventLoop eventLoop = RequestContext.current().eventLoop(); timeoutFuture = eventLoop.schedule(() -> result.completeExceptionally(CANCELLATION_EXCEPTION), timeoutMillis, TimeUnit.MILLISECONDS); } else { timeoutFuture = null; } result.whenComplete((revision, cause) -> { if (timeoutFuture != null) { timeoutFuture.cancel(true); } pendingFutures.remove(result); }); }
@Override public RpcResponse serve(ServiceRequestContext ctx, RpcRequest req) throws Exception { if (ctx.requestTimeoutMillis() > 0) { final String method = req.method(); if ("watchFile".equals(method) || "watchRepository".equals(method)) { final List<Object> params = req.params(); final long timeout = (Long) params.get(params.size() - 1); if (timeout > 0) { ctx.setRequestTimeoutMillis( WatchTimeout.makeReasonable(timeout, ctx.requestTimeoutMillis())); } } } return delegate().serve(ctx, req); } }
@Override public RpcResponse execute(ClientRequestContext ctx, RpcRequest req) throws Exception { if (ctx.responseTimeoutMillis() > 0) { final String method = req.method(); if ("watchFile".equals(method) || "watchRepository".equals(method)) { final List<Object> params = req.params(); final long timeout = (Long) params.get(params.size() - 1); if (timeout > 0) { ctx.setResponseTimeoutMillis( WatchTimeout.makeReasonable(timeout, ctx.responseTimeoutMillis())); } } } return delegate().execute(ctx, req); } }
@Override public RpcResponse serve(ServiceRequestContext ctx, RpcRequest req) throws Exception { if (ctx.requestTimeoutMillis() > 0) { final String method = req.method(); if ("watchFile".equals(method) || "watchRepository".equals(method)) { final List<Object> params = req.params(); final long timeout = (Long) params.get(params.size() - 1); if (timeout > 0) { ctx.setRequestTimeoutMillis( WatchTimeout.makeReasonable(timeout, ctx.requestTimeoutMillis())); } } } return delegate().serve(ctx, req); } }
@Override public RpcResponse execute(ClientRequestContext ctx, RpcRequest req) throws Exception { if (ctx.responseTimeoutMillis() > 0) { final String method = req.method(); if ("watchFile".equals(method) || "watchRepository".equals(method)) { final List<Object> params = req.params(); final long timeout = (Long) params.get(params.size() - 1); if (timeout > 0) { ctx.setResponseTimeoutMillis( WatchTimeout.makeReasonable(timeout, ctx.responseTimeoutMillis())); } } } return delegate().execute(ctx, req); } }
/** * Converts the specified {@code request} to {@link Optional} which contains {@link WatchRequest} when * the request has {@link HttpHeaderNames#IF_NONE_MATCH}. {@link Optional#EMPTY} otherwise. */ @Override public Object convertRequest(ServiceRequestContext ctx, AggregatedHttpMessage request, Class<?> expectedResultType) throws Exception { final String ifNoneMatch = request.headers().get(HttpHeaderNames.IF_NONE_MATCH); if (!isNullOrEmpty(ifNoneMatch)) { final Revision lastKnownRevision = new Revision(ifNoneMatch); final String prefer = request.headers().get(HttpHeaderNames.PREFER); final long timeoutMillis; if (!isNullOrEmpty(prefer)) { timeoutMillis = getTimeoutMillis(prefer); } else { timeoutMillis = DEFAULT_TIMEOUT_MILLIS; } // Update timeout according to the watch API specifications. ctx.setRequestTimeoutMillis( WatchTimeout.makeReasonable(timeoutMillis, ctx.requestTimeoutMillis())); return Optional.of(new WatchRequest(lastKnownRevision, timeoutMillis)); } return Optional.empty(); }
/** * Converts the specified {@code request} to {@link Optional} which contains {@link WatchRequest} when * the request has {@link HttpHeaderNames#IF_NONE_MATCH}. {@link Optional#EMPTY} otherwise. */ @Override public Object convertRequest(ServiceRequestContext ctx, AggregatedHttpMessage request, Class<?> expectedResultType) throws Exception { final String ifNoneMatch = request.headers().get(HttpHeaderNames.IF_NONE_MATCH); if (!isNullOrEmpty(ifNoneMatch)) { final Revision lastKnownRevision = new Revision(ifNoneMatch); final String prefer = request.headers().get(HttpHeaderNames.PREFER); final long timeoutMillis; if (!isNullOrEmpty(prefer)) { timeoutMillis = getTimeoutMillis(prefer); } else { timeoutMillis = DEFAULT_TIMEOUT_MILLIS; } // Update timeout according to the watch API specifications. ctx.setRequestTimeoutMillis( WatchTimeout.makeReasonable(timeoutMillis, ctx.requestTimeoutMillis())); return Optional.of(new WatchRequest(lastKnownRevision, timeoutMillis)); } return Optional.empty(); }