public synchronized ListenableFuture<QueryResults> waitForResults(OptionalLong token, UriInfo uriInfo, String scheme, Duration wait, DataSize targetResultSize) { // before waiting, check if this request has already been processed and cached if (token.isPresent()) { Optional<QueryResults> cachedResult = getCachedResult(token.getAsLong(), uriInfo); if (cachedResult.isPresent()) { return immediateFuture(cachedResult.get()); } } // wait for a results data or query to finish, up to the wait timeout ListenableFuture<?> futureStateChange = addTimeout( getFutureStateChange(), () -> null, wait, timeoutExecutor); // when state changes, fetch the next result return Futures.transform(futureStateChange, ignored -> getNextResult(token, uriInfo, scheme, targetResultSize), resultsProcessorExecutor); }
@GET @Path("{taskId}/status") @Produces(MediaType.APPLICATION_JSON) public void getTaskStatus( @PathParam("taskId") TaskId taskId, @HeaderParam(PRESTO_CURRENT_STATE) TaskState currentState, @HeaderParam(PRESTO_MAX_WAIT) Duration maxWait, @Context UriInfo uriInfo, @Suspended AsyncResponse asyncResponse) { requireNonNull(taskId, "taskId is null"); if (currentState == null || maxWait == null) { TaskStatus taskStatus = taskManager.getTaskStatus(taskId); asyncResponse.resume(taskStatus); return; } Duration waitTime = randomizeWaitTime(maxWait); // TODO: With current implementation, a newly completed driver group won't trigger immediate HTTP response, // leading to a slight delay of approx 1 second, which is not a major issue for any query that are heavy weight enough // to justify group-by-group execution. In order to fix this, REST endpoint /v1/{task}/status will need change. ListenableFuture<TaskStatus> futureTaskStatus = addTimeout( taskManager.getTaskStatus(taskId, currentState), () -> taskManager.getTaskStatus(taskId), waitTime, timeoutExecutor); // For hard timeout, add an additional time to max wait for thread scheduling contention and GC Duration timeout = new Duration(waitTime.toMillis() + ADDITIONAL_WAIT_TIME.toMillis(), MILLISECONDS); bindAsyncResponse(asyncResponse, futureTaskStatus, responseExecutor) .withTimeout(timeout); }
ListenableFuture<TaskInfo> futureTaskInfo = addTimeout( taskManager.getTaskInfo(taskId, currentState), () -> taskManager.getTaskInfo(taskId),
ListenableFuture<BufferResult> bufferResultFuture = taskManager.getTaskResults(taskId, bufferId, token, maxSize); Duration waitTime = randomizeWaitTime(DEFAULT_MAX_WAIT_TIME); bufferResultFuture = addTimeout( bufferResultFuture, () -> BufferResult.emptyResults(taskManager.getTaskInstanceId(taskId), token, false),
@Test public void testTimeoutCancel() throws Exception { CompletableFuture<String> rootFuture = new CompletableFuture<>(); CompletableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(10, SECONDS), executorService); // check timeout assertEquals(tryGetFutureValue(timeoutFuture, 10, MILLISECONDS), Optional.<String>empty()); assertTrue(timeoutFuture.cancel(true)); assertTrue(timeoutFuture.isDone()); assertTrue(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testTimeout() throws Exception { CompletableFuture<String> rootFuture = new CompletableFuture<>(); CompletableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(0, MILLISECONDS), executorService); assertEquals(tryGetFutureValue(timeoutFuture, 10, SECONDS).get(), "timeout"); assertTrue(timeoutFuture.isDone()); assertFalse(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testTimeout() throws Exception { CompletableFuture<String> rootFuture = new CompletableFuture<>(); CompletableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(0, MILLISECONDS), executorService); assertEquals(tryGetFutureValue(timeoutFuture, 10, SECONDS).orElse("failed"), "timeout"); assertTrue(timeoutFuture.isDone()); assertFalse(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testTimeout() throws Exception { CompletableFuture<String> rootFuture = new CompletableFuture<>(); CompletableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(0, MILLISECONDS), executorService); assertEquals(tryGetFutureValue(timeoutFuture, 10, SECONDS).orElse("failed"), "timeout"); assertTrue(timeoutFuture.isDone()); assertFalse(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testTimeoutCancel() throws Exception { CompletableFuture<String> rootFuture = new CompletableFuture<>(); CompletableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(10, SECONDS), executorService); // check timeout assertEquals(tryGetFutureValue(timeoutFuture, 10, MILLISECONDS), Optional.<String>empty()); assertTrue(timeoutFuture.cancel(true)); assertTrue(timeoutFuture.isDone()); assertTrue(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testTimeoutCancel() throws Exception { CompletableFuture<String> rootFuture = new CompletableFuture<>(); CompletableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(10, SECONDS), executorService); // check timeout assertEquals(tryGetFutureValue(timeoutFuture, 10, MILLISECONDS), Optional.<String>empty()); assertTrue(timeoutFuture.cancel(true)); assertTrue(timeoutFuture.isDone()); assertTrue(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testTimeoutExceptionValue() throws Exception { CompletableFuture<String> rootFuture = new CompletableFuture<>(); CompletableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> { throw new SQLException("timeout"); }, new Duration(0, MILLISECONDS), executorService); assertFailure(() -> tryGetFutureValue(timeoutFuture, 10, SECONDS, SQLException.class), e -> { assertInstanceOf(e, SQLException.class); assertEquals(e.getMessage(), "timeout"); }); assertTrue(timeoutFuture.isDone()); assertFalse(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testListenableTimeout() throws Exception { SettableFuture<String> rootFuture = SettableFuture.create(); ListenableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(0, MILLISECONDS), executorService); assertEquals(tryGetFutureValue(timeoutFuture, 10, SECONDS).orElse("failed"), "timeout"); assertTrue(timeoutFuture.isDone()); assertFalse(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testListenableTimeout() throws Exception { SettableFuture<String> rootFuture = SettableFuture.create(); ListenableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(0, MILLISECONDS), executorService); assertEquals(tryGetFutureValue(timeoutFuture, 10, SECONDS).orElse("failed"), "timeout"); assertTrue(timeoutFuture.isDone()); assertFalse(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
private void assertGetUnchecked(UncheckedGetter getter) throws Exception { assertGetUncheckedInternal(getter); // run all test wrapped in a timeout future that does not timeout assertGetUncheckedInternal(future -> getter.get(addTimeout(future, () -> { throw new RuntimeException("timeout"); }, new Duration(10, SECONDS), executorService))); }
public void assertGetUnchecked(UncheckedGetter getter) throws Exception { assertGetUncheckedInternal(getter); // run all test wrapped in a timeout future that does not timeout assertGetUncheckedInternal(future -> getter.get(addTimeout(future, () -> { throw new RuntimeException("timeout"); }, new Duration(10, SECONDS), executorService))); }
private void assertGetUnchecked(UncheckedGetter getter) throws Exception { assertGetUncheckedInternal(getter); // run all test wrapped in a timeout future that does not timeout assertGetUncheckedInternal(future -> getter.get(addTimeout(future, () -> { throw new RuntimeException("timeout"); }, new Duration(10, SECONDS), executorService))); }
@Test public void testListenableTimeoutCancel() throws Exception { SettableFuture<String> rootFuture = SettableFuture.create(); ListenableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(10, SECONDS), executorService); // check timeout assertEquals(tryGetFutureValue(timeoutFuture, 10, MILLISECONDS), Optional.<String>empty()); assertTrue(timeoutFuture.cancel(true)); assertTrue(timeoutFuture.isDone()); assertTrue(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testListenableTimeoutCancel() throws Exception { SettableFuture<String> rootFuture = SettableFuture.create(); ListenableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> "timeout", new Duration(10, SECONDS), executorService); // check timeout assertEquals(tryGetFutureValue(timeoutFuture, 10, MILLISECONDS), Optional.<String>empty()); assertTrue(timeoutFuture.cancel(true)); assertTrue(timeoutFuture.isDone()); assertTrue(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testListenableTimeoutExceptionValue() throws Exception { SettableFuture<String> rootFuture = SettableFuture.create(); ListenableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> { throw new SQLException("timeout"); }, new Duration(0, MILLISECONDS), executorService); assertFailure(() -> tryGetFutureValue(timeoutFuture, 10, SECONDS, SQLException.class), e -> { assertInstanceOf(e, SQLException.class); assertEquals(e.getMessage(), "timeout"); }); assertTrue(timeoutFuture.isDone()); assertFalse(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }
@Test public void testListenableTimeoutExceptionValue() throws Exception { SettableFuture<String> rootFuture = SettableFuture.create(); ListenableFuture<String> timeoutFuture = addTimeout(rootFuture, () -> { throw new SQLException("timeout"); }, new Duration(0, MILLISECONDS), executorService); assertFailure(() -> tryGetFutureValue(timeoutFuture, 10, SECONDS, SQLException.class), e -> { assertInstanceOf(e, SQLException.class); assertEquals(e.getMessage(), "timeout"); }); assertTrue(timeoutFuture.isDone()); assertFalse(timeoutFuture.isCancelled()); // root exception is cancelled on a timeout assertFailure(() -> rootFuture.get(10, SECONDS), e -> assertInstanceOf(e, CancellationException.class)); assertTrue(rootFuture.isDone()); assertTrue(rootFuture.isCancelled()); }