Search in sources :

Example 6 with BufferResult

use of io.trino.execution.buffer.BufferResult in project trino by trinodb.

the class TestSqlTask method testSimpleQuery.

@Test(timeOut = 30_000)
public void testSimpleQuery() throws Exception {
    SqlTask sqlTask = createInitialTask();
    assertEquals(sqlTask.getTaskStatus().getState(), TaskState.RUNNING);
    assertEquals(sqlTask.getTaskStatus().getVersion(), STARTING_VERSION);
    sqlTask.updateTask(TEST_SESSION, Optional.of(PLAN_FRAGMENT), ImmutableList.of(new SplitAssignment(TABLE_SCAN_NODE_ID, ImmutableSet.of(SPLIT), true)), createInitialEmptyOutputBuffers(PARTITIONED).withBuffer(OUT, 0).withNoMoreBufferIds(), ImmutableMap.of());
    TaskInfo taskInfo = sqlTask.getTaskInfo(STARTING_VERSION).get();
    assertEquals(taskInfo.getTaskStatus().getState(), TaskState.FLUSHING);
    assertEquals(taskInfo.getTaskStatus().getVersion(), STARTING_VERSION + 1);
    // completed future should be returned immediately when old caller's version is used
    assertTrue(sqlTask.getTaskInfo(STARTING_VERSION).isDone());
    BufferResult results = sqlTask.getTaskResults(OUT, 0, DataSize.of(1, MEGABYTE)).get();
    assertFalse(results.isBufferComplete());
    assertEquals(results.getSerializedPages().size(), 1);
    assertEquals(getSerializedPagePositionCount(results.getSerializedPages().get(0)), 1);
    for (boolean moreResults = true; moreResults; moreResults = !results.isBufferComplete()) {
        results = sqlTask.getTaskResults(OUT, results.getToken() + results.getSerializedPages().size(), DataSize.of(1, MEGABYTE)).get();
    }
    assertEquals(results.getSerializedPages().size(), 0);
    // complete the task by calling destroy on it
    TaskInfo info = sqlTask.destroyTaskResults(OUT);
    assertEquals(info.getOutputBuffers().getState(), BufferState.FINISHED);
    taskInfo = sqlTask.getTaskInfo(info.getTaskStatus().getVersion()).get();
    assertEquals(taskInfo.getTaskStatus().getState(), TaskState.FINISHED);
    // completed future should be returned immediately when task is finished
    assertTrue(sqlTask.getTaskInfo(STARTING_VERSION + 100).isDone());
    taskInfo = sqlTask.getTaskInfo();
    assertEquals(taskInfo.getTaskStatus().getState(), TaskState.FINISHED);
}
Also used : SqlTask.createSqlTask(io.trino.execution.SqlTask.createSqlTask) BufferResult(io.trino.execution.buffer.BufferResult) Test(org.testng.annotations.Test)

Example 7 with BufferResult

use of io.trino.execution.buffer.BufferResult in project trino by trinodb.

the class TaskResource method getResults.

@ResourceSecurity(INTERNAL_ONLY)
@GET
@Path("{taskId}/results/{bufferId}/{token}")
@Produces(TRINO_PAGES)
public void getResults(@PathParam("taskId") TaskId taskId, @PathParam("bufferId") OutputBufferId bufferId, @PathParam("token") long token, @HeaderParam(TRINO_MAX_SIZE) DataSize maxSize, @Suspended AsyncResponse asyncResponse) {
    requireNonNull(taskId, "taskId is null");
    requireNonNull(bufferId, "bufferId is null");
    if (injectFailure(taskManager.getTraceToken(taskId), taskId, RequestType.GET_RESULTS, asyncResponse)) {
        return;
    }
    TaskState state = taskManager.getTaskStatus(taskId).getState();
    boolean taskFailed = state == TaskState.ABORTED || state == TaskState.FAILED;
    long start = System.nanoTime();
    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), waitTime, timeoutExecutor);
    ListenableFuture<Response> responseFuture = Futures.transform(bufferResultFuture, result -> {
        List<Slice> serializedPages = result.getSerializedPages();
        GenericEntity<?> entity = null;
        Status status;
        if (serializedPages.isEmpty()) {
            status = Status.NO_CONTENT;
        } else {
            entity = new GenericEntity<>(serializedPages, new TypeToken<List<Slice>>() {
            }.getType());
            status = Status.OK;
        }
        return Response.status(status).entity(entity).header(TRINO_TASK_INSTANCE_ID, result.getTaskInstanceId()).header(TRINO_PAGE_TOKEN, result.getToken()).header(TRINO_PAGE_NEXT_TOKEN, result.getNextToken()).header(TRINO_BUFFER_COMPLETE, result.isBufferComplete()).header(TRINO_TASK_FAILED, taskFailed).build();
    }, directExecutor());
    // 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, responseFuture, responseExecutor).withTimeout(timeout, Response.status(Status.NO_CONTENT).header(TRINO_TASK_INSTANCE_ID, taskManager.getTaskInstanceId(taskId)).header(TRINO_PAGE_TOKEN, token).header(TRINO_PAGE_NEXT_TOKEN, token).header(TRINO_BUFFER_COMPLETE, false).header(TRINO_TASK_FAILED, taskFailed).build());
    responseFuture.addListener(() -> readFromOutputBufferTime.add(Duration.nanosSince(start)), directExecutor());
    asyncResponse.register((CompletionCallback) throwable -> resultsRequestTime.add(Duration.nanosSince(start)));
}
Also used : Status(javax.ws.rs.core.Response.Status) TaskStatus(io.trino.execution.TaskStatus) ResourceSecurity(io.trino.server.security.ResourceSecurity) Produces(javax.ws.rs.Produces) Iterables.transform(com.google.common.collect.Iterables.transform) TRINO_PAGES(io.trino.TrinoMediaTypes.TRINO_PAGES) Path(javax.ws.rs.Path) OutputBufferId(io.trino.execution.buffer.OutputBuffers.OutputBufferId) Duration(io.airlift.units.Duration) MediaType(javax.ws.rs.core.MediaType) QueryParam(javax.ws.rs.QueryParam) Consumes(javax.ws.rs.Consumes) BoundedExecutor(io.airlift.concurrent.BoundedExecutor) DefaultValue(javax.ws.rs.DefaultValue) HeaderParam(javax.ws.rs.HeaderParam) INTERNAL_ONLY(io.trino.server.security.ResourceSecurity.AccessType.INTERNAL_ONLY) FailureInjector(io.trino.execution.FailureInjector) DELETE(javax.ws.rs.DELETE) Context(javax.ws.rs.core.Context) TRINO_PAGE_TOKEN(io.trino.server.InternalHeaders.TRINO_PAGE_TOKEN) AsyncResponse(javax.ws.rs.container.AsyncResponse) GenericEntity(javax.ws.rs.core.GenericEntity) MILLISECONDS(java.util.concurrent.TimeUnit.MILLISECONDS) TaskId(io.trino.execution.TaskId) Suspended(javax.ws.rs.container.Suspended) InjectedFailure(io.trino.execution.FailureInjector.InjectedFailure) MoreExecutors.directExecutor(com.google.common.util.concurrent.MoreExecutors.directExecutor) TRINO_TASK_INSTANCE_ID(io.trino.server.InternalHeaders.TRINO_TASK_INSTANCE_ID) SessionPropertyManager(io.trino.metadata.SessionPropertyManager) DataSize(io.airlift.units.DataSize) List(java.util.List) Response(javax.ws.rs.core.Response) CompletionCallback(javax.ws.rs.container.CompletionCallback) TaskInfo(io.trino.execution.TaskInfo) Optional(java.util.Optional) UriInfo(javax.ws.rs.core.UriInfo) TRINO_CURRENT_VERSION(io.trino.server.InternalHeaders.TRINO_CURRENT_VERSION) AsyncResponseHandler.bindAsyncResponse(io.airlift.jaxrs.AsyncResponseHandler.bindAsyncResponse) Session(io.trino.Session) Nested(org.weakref.jmx.Nested) PathParam(javax.ws.rs.PathParam) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) Slice(io.airlift.slice.Slice) TRINO_TASK_FAILED(io.trino.server.InternalHeaders.TRINO_TASK_FAILED) Logger(io.airlift.log.Logger) GET(javax.ws.rs.GET) SqlTaskManager(io.trino.execution.SqlTaskManager) TypeToken(com.google.common.reflect.TypeToken) TRINO_PAGE_NEXT_TOKEN(io.trino.server.InternalHeaders.TRINO_PAGE_NEXT_TOKEN) TRINO_MAX_SIZE(io.trino.server.InternalHeaders.TRINO_MAX_SIZE) Inject(javax.inject.Inject) BufferResult(io.trino.execution.buffer.BufferResult) ImmutableList(com.google.common.collect.ImmutableList) Managed(org.weakref.jmx.Managed) TRINO_MAX_WAIT(io.trino.server.InternalHeaders.TRINO_MAX_WAIT) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Objects.requireNonNull(java.util.Objects.requireNonNull) TaskState(io.trino.execution.TaskState) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) MoreFutures.addTimeout(io.airlift.concurrent.MoreFutures.addTimeout) TimeStat(io.airlift.stats.TimeStat) Status(javax.ws.rs.core.Response.Status) TRINO_BUFFER_COMPLETE(io.trino.server.InternalHeaders.TRINO_BUFFER_COMPLETE) POST(javax.ws.rs.POST) Executor(java.util.concurrent.Executor) TaskStatus(io.trino.execution.TaskStatus) Futures(com.google.common.util.concurrent.Futures) SECONDS(java.util.concurrent.TimeUnit.SECONDS) Duration(io.airlift.units.Duration) AsyncResponse(javax.ws.rs.container.AsyncResponse) Response(javax.ws.rs.core.Response) AsyncResponseHandler.bindAsyncResponse(io.airlift.jaxrs.AsyncResponseHandler.bindAsyncResponse) BufferResult(io.trino.execution.buffer.BufferResult) Slice(io.airlift.slice.Slice) List(java.util.List) ImmutableList(com.google.common.collect.ImmutableList) TaskState(io.trino.execution.TaskState) Path(javax.ws.rs.Path) Produces(javax.ws.rs.Produces) GET(javax.ws.rs.GET) ResourceSecurity(io.trino.server.security.ResourceSecurity)

Aggregations

BufferResult (io.trino.execution.buffer.BufferResult)7 Test (org.testng.annotations.Test)5 SqlTask.createSqlTask (io.trino.execution.SqlTask.createSqlTask)4 Slice (io.airlift.slice.Slice)2 DataSize (io.airlift.units.DataSize)2 ImmutableList (com.google.common.collect.ImmutableList)1 Iterables.transform (com.google.common.collect.Iterables.transform)1 TypeToken (com.google.common.reflect.TypeToken)1 Futures (com.google.common.util.concurrent.Futures)1 ListenableFuture (com.google.common.util.concurrent.ListenableFuture)1 MoreExecutors.directExecutor (com.google.common.util.concurrent.MoreExecutors.directExecutor)1 BoundedExecutor (io.airlift.concurrent.BoundedExecutor)1 MoreFutures.addTimeout (io.airlift.concurrent.MoreFutures.addTimeout)1 HttpStatus (io.airlift.http.client.HttpStatus)1 TestingResponse (io.airlift.http.client.testing.TestingResponse)1 AsyncResponseHandler.bindAsyncResponse (io.airlift.jaxrs.AsyncResponseHandler.bindAsyncResponse)1 Logger (io.airlift.log.Logger)1 DynamicSliceOutput (io.airlift.slice.DynamicSliceOutput)1 TimeStat (io.airlift.stats.TimeStat)1 Duration (io.airlift.units.Duration)1