private Optional<QueryFailureInfo> createQueryFailureInfo(ExecutionFailureInfo failureInfo, Optional<StageInfo> outputStage) { if (failureInfo == null) { return Optional.empty(); } Optional<TaskInfo> failedTask = outputStage.flatMap(QueryMonitor::findFailedTask); return Optional.of(new QueryFailureInfo( failureInfo.getErrorCode(), Optional.ofNullable(failureInfo.getType()), Optional.ofNullable(failureInfo.getMessage()), failedTask.map(task -> task.getTaskStatus().getTaskId().toString()), failedTask.map(task -> task.getTaskStatus().getSelf().getHost()), executionFailureInfoCodec.toJson(failureInfo))); }
private static Failure toException(ExecutionFailureInfo executionFailureInfo) { if (executionFailureInfo == null) { return null; } Failure failure = new Failure(executionFailureInfo.getType(), executionFailureInfo.getMessage(), executionFailureInfo.getErrorCode(), toException(executionFailureInfo.getCause())); for (ExecutionFailureInfo suppressed : executionFailureInfo.getSuppressed()) { failure.addSuppressed(toException(suppressed)); } ImmutableList.Builder<StackTraceElement> stackTraceBuilder = ImmutableList.builder(); for (String stack : executionFailureInfo.getStack()) { stackTraceBuilder.add(toStackTraceElement(stack)); } ImmutableList<StackTraceElement> stackTrace = stackTraceBuilder.build(); failure.setStackTrace(stackTrace.toArray(new StackTraceElement[stackTrace.size()])); return failure; }
assertEquals(failure.getMessage(), "fake exception 1"); assertNull(failure.getCause()); assertEquals(failure.getSuppressed().size(), 1); assertEquals(failure.getSuppressed().get(0).getMessage(), "fake exception 2"); assertEquals(failure.getErrorCode(), TOO_MANY_REQUESTS_FAILED.toErrorCode()); assertEquals(failure.getMessage(), "fake exception 2"); assertNotNull(failure.getCause()); assertEquals(failure.getCause().getMessage(), "fake exception 1"); assertEquals(failure.getSuppressed().size(), 0); assertEquals(failure.getErrorCode(), TOO_MANY_REQUESTS_FAILED.toErrorCode()); exception2.addSuppressed(exception1); failure = toFailure(exception1); assertEquals(failure.getMessage(), "fake exception 1"); assertNull(failure.getCause()); assertEquals(failure.getSuppressed().size(), 1); assertEquals(failure.getSuppressed().get(0).getMessage(), "fake exception 2"); assertEquals(failure.getErrorCode(), TOO_MANY_REQUESTS_FAILED.toErrorCode()); exception1.initCause(exception2); failure = toFailure(exception2); assertEquals(failure.getMessage(), "fake exception 2"); assertNotNull(failure.getCause()); assertEquals(failure.getCause().getMessage(), "fake exception 1"); assertEquals(failure.getSuppressed().size(), 0); assertEquals(failure.getErrorCode(), GENERIC_INTERNAL_ERROR.toErrorCode());
private static void assertState(StageStateMachine stateMachine, StageState expectedState) { assertEquals(stateMachine.getStageId(), STAGE_ID); assertEquals(stateMachine.getLocation(), LOCATION); assertSame(stateMachine.getSession(), TEST_SESSION); StageInfo stageInfo = stateMachine.getStageInfo(ImmutableList::of); assertEquals(stageInfo.getStageId(), STAGE_ID); assertEquals(stageInfo.getSelf(), LOCATION); assertEquals(stageInfo.getSubStages(), ImmutableList.of()); assertEquals(stageInfo.getTasks(), ImmutableList.of()); assertEquals(stageInfo.getTypes(), ImmutableList.of(VARCHAR)); assertSame(stageInfo.getPlan(), PLAN_FRAGMENT); assertEquals(stateMachine.getState(), expectedState); assertEquals(stageInfo.getState(), expectedState); if (expectedState == StageState.FAILED) { ExecutionFailureInfo failure = stageInfo.getFailureCause(); assertEquals(failure.getMessage(), FAILED_CAUSE.getMessage()); assertEquals(failure.getType(), FAILED_CAUSE.getClass().getName()); } else { assertNull(stageInfo.getFailureCause()); } }
private ExecutionFailureInfo rewriteTransportFailure(ExecutionFailureInfo executionFailureInfo) { if (executionFailureInfo.getRemoteHost() == null || failureDetector.getState(executionFailureInfo.getRemoteHost()) != GONE) { return executionFailureInfo; } return new ExecutionFailureInfo( executionFailureInfo.getType(), executionFailureInfo.getMessage(), executionFailureInfo.getCause(), executionFailureInfo.getSuppressed(), executionFailureInfo.getStack(), executionFailureInfo.getErrorLocation(), REMOTE_HOST_GONE.toErrorCode(), executionFailureInfo.getRemoteHost()); }
@Test(timeOut = 60_000L) public void testFailQuery() throws Exception { QueryManager queryManager = queryRunner.getCoordinator().getQueryManager(); QueryId queryId = queryManager.createQueryId(); queryManager.createQuery( queryId, new TestingSessionContext(TEST_SESSION), "SELECT * FROM lineitem") .get(); // wait until query starts running while (true) { QueryState state = queryManager.getQueryState(queryId); if (state.isDone()) { fail("unexpected query state: " + state); } if (state == RUNNING) { break; } Thread.sleep(100); } // cancel query queryManager.failQuery(queryId, new PrestoException(GENERIC_INTERNAL_ERROR, "mock exception")); QueryInfo queryInfo = queryManager.getFullQueryInfo(queryId); assertEquals(queryInfo.getState(), FAILED); assertEquals(queryInfo.getErrorCode(), GENERIC_INTERNAL_ERROR.toErrorCode()); assertNotNull(queryInfo.getFailureInfo()); assertEquals(queryInfo.getFailureInfo().getMessage(), "mock exception"); }
private static Failure toException(ExecutionFailureInfo executionFailureInfo) { if (executionFailureInfo == null) { return null; } Failure failure = new Failure(executionFailureInfo.getType(), executionFailureInfo.getMessage(), executionFailureInfo.getErrorCode(), toException(executionFailureInfo.getCause())); for (ExecutionFailureInfo suppressed : executionFailureInfo.getSuppressed()) { failure.addSuppressed(toException(suppressed)); } ImmutableList.Builder<StackTraceElement> stackTraceBuilder = ImmutableList.builder(); for (String stack : executionFailureInfo.getStack()) { stackTraceBuilder.add(toStackTraceElement(stack)); } ImmutableList<StackTraceElement> stackTrace = stackTraceBuilder.build(); failure.setStackTrace(stackTrace.toArray(new StackTraceElement[stackTrace.size()])); return failure; }
private static void assertState(StageStateMachine stateMachine, StageState expectedState) { assertEquals(stateMachine.getStageId(), STAGE_ID); assertEquals(stateMachine.getLocation(), LOCATION); assertSame(stateMachine.getSession(), TEST_SESSION); StageInfo stageInfo = stateMachine.getStageInfo(ImmutableList::of, ImmutableList::of); assertEquals(stageInfo.getStageId(), STAGE_ID); assertEquals(stageInfo.getSelf(), LOCATION); assertEquals(stageInfo.getSubStages(), ImmutableList.of()); assertEquals(stageInfo.getTasks(), ImmutableList.of()); assertEquals(stageInfo.getTypes(), ImmutableList.of(VARCHAR)); assertSame(stageInfo.getPlan(), PLAN_FRAGMENT); assertEquals(stateMachine.getState(), expectedState); assertEquals(stageInfo.getState(), expectedState); if (expectedState == StageState.FAILED) { ExecutionFailureInfo failure = stageInfo.getFailureCause(); assertEquals(failure.getMessage(), FAILED_CAUSE.getMessage()); assertEquals(failure.getType(), FAILED_CAUSE.getClass().getName()); } else { assertNull(stageInfo.getFailureCause()); } }
@Test(timeOut = 60_000L) public void testFailQuery() throws Exception { QueryManager queryManager = queryRunner.getCoordinator().getQueryManager(); QueryId queryId = queryManager.createQueryId(); queryManager.createQuery( queryId, new TestingSessionContext(TEST_SESSION), "SELECT * FROM lineitem") .get(); // wait until query starts running while (true) { QueryState state = queryManager.getQueryState(queryId); if (state.isDone()) { fail("unexpected query state: " + state); } if (state == RUNNING) { break; } Thread.sleep(100); } // cancel query queryManager.failQuery(queryId, new PrestoException(GENERIC_INTERNAL_ERROR, "mock exception")); QueryInfo queryInfo = queryManager.getFullQueryInfo(queryId); assertEquals(queryInfo.getState(), FAILED); assertEquals(queryInfo.getErrorCode(), GENERIC_INTERNAL_ERROR.toErrorCode()); assertNotNull(queryInfo.getFailureInfo()); assertEquals(queryInfo.getFailureInfo().getMessage(), "mock exception"); }