@Override public void onSuccess(@Nullable Object result) { stateMachine.transitionToFinishing(); }
@Test public void testFinished() { QueryStateMachine stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToFinishing()); tryGetFutureValue(stateMachine.getStateChange(FINISHING), 2, SECONDS); assertFinalState(stateMachine, FINISHED); }
private static void assertFinalState(QueryStateMachine stateMachine, QueryState expectedState, Exception expectedException) { assertTrue(expectedState.isDone()); assertState(stateMachine, expectedState, expectedException); assertFalse(stateMachine.transitionToPlanning()); assertState(stateMachine, expectedState, expectedException); assertFalse(stateMachine.transitionToStarting()); assertState(stateMachine, expectedState, expectedException); assertFalse(stateMachine.transitionToRunning()); assertState(stateMachine, expectedState, expectedException); assertFalse(stateMachine.transitionToFinishing()); assertState(stateMachine, expectedState, expectedException); assertFalse(stateMachine.transitionToFailed(FAILED_CAUSE)); assertState(stateMachine, expectedState, expectedException); // attempt to fail with another exception, which will fail assertFalse(stateMachine.transitionToFailed(new IOException("failure after finish"))); assertState(stateMachine, expectedState, expectedException); }
@Test public void testBasicStateChanges() { QueryStateMachine stateMachine = createQueryStateMachine(); assertState(stateMachine, QUEUED); assertTrue(stateMachine.transitionToPlanning()); assertState(stateMachine, PLANNING); assertTrue(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); assertTrue(stateMachine.transitionToFinishing()); tryGetFutureValue(stateMachine.getStateChange(FINISHING), 2, SECONDS); assertState(stateMachine, FINISHED); }
@Test public void testStateChangesWithResourceWaiting() { QueryStateMachine stateMachine = createQueryStateMachine(); assertState(stateMachine, QUEUED); assertTrue(stateMachine.transitionToWaitingForResources()); assertState(stateMachine, WAITING_FOR_RESOURCES); assertTrue(stateMachine.transitionToPlanning()); assertState(stateMachine, PLANNING); assertTrue(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); assertTrue(stateMachine.transitionToFinishing()); tryGetFutureValue(stateMachine.getStateChange(FINISHING), 2, SECONDS); assertState(stateMachine, FINISHED); }
rootStage.addStateChangeListener(state -> { if (state == FINISHED) { queryStateMachine.transitionToFinishing();
@Test public void testRunning() { QueryStateMachine stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); assertFalse(stateMachine.transitionToPlanning()); assertState(stateMachine, RUNNING); assertFalse(stateMachine.transitionToStarting()); assertState(stateMachine, RUNNING); assertFalse(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); assertTrue(stateMachine.transitionToFinishing()); tryGetFutureValue(stateMachine.getStateChange(FINISHING), 2, SECONDS); assertState(stateMachine, FINISHED); stateMachine = createQueryStateMachine(); stateMachine.transitionToRunning(); assertTrue(stateMachine.transitionToFailed(FAILED_CAUSE)); assertState(stateMachine, FAILED, FAILED_CAUSE); }
@Test public void testStarting() { QueryStateMachine stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); assertFalse(stateMachine.transitionToPlanning()); assertState(stateMachine, STARTING); assertFalse(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); stateMachine = createQueryStateMachine(); stateMachine.transitionToStarting(); assertTrue(stateMachine.transitionToFinishing()); tryGetFutureValue(stateMachine.getStateChange(FINISHING), 2, SECONDS); assertState(stateMachine, FINISHED); stateMachine = createQueryStateMachine(); stateMachine.transitionToStarting(); assertTrue(stateMachine.transitionToFailed(FAILED_CAUSE)); assertState(stateMachine, FAILED, FAILED_CAUSE); }
@Test public void testPlanning() { QueryStateMachine stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToPlanning()); assertState(stateMachine, PLANNING); assertFalse(stateMachine.transitionToPlanning()); assertState(stateMachine, PLANNING); assertTrue(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); stateMachine = createQueryStateMachine(); stateMachine.transitionToPlanning(); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); stateMachine = createQueryStateMachine(); stateMachine.transitionToPlanning(); assertTrue(stateMachine.transitionToFinishing()); tryGetFutureValue(stateMachine.getStateChange(FINISHING), 2, SECONDS); assertState(stateMachine, FINISHED); stateMachine = createQueryStateMachine(); stateMachine.transitionToPlanning(); assertTrue(stateMachine.transitionToFailed(FAILED_CAUSE)); assertState(stateMachine, FAILED, FAILED_CAUSE); }
assertTrue(stateMachine.transitionToFinishing()); tryGetFutureValue(stateMachine.getStateChange(FINISHING), 2, SECONDS); assertState(stateMachine, FINISHED);
@Test public void testQueued() { // all time before the first state transition is accounted to queueing assertAllTimeSpentInQueueing(QUEUED, queryStateMachine -> {}); assertAllTimeSpentInQueueing(WAITING_FOR_RESOURCES, QueryStateMachine::transitionToWaitingForResources); assertAllTimeSpentInQueueing(PLANNING, QueryStateMachine::transitionToPlanning); assertAllTimeSpentInQueueing(STARTING, QueryStateMachine::transitionToStarting); assertAllTimeSpentInQueueing(RUNNING, QueryStateMachine::transitionToRunning); assertAllTimeSpentInQueueing(FINISHED, stateMachine -> { stateMachine.transitionToFinishing(); tryGetFutureValue(stateMachine.getStateChange(FINISHING), 2, SECONDS); }); assertAllTimeSpentInQueueing(FAILED, stateMachine -> stateMachine.transitionToFailed(FAILED_CAUSE)); }
@Override public void start() { try { // transition to running if (!stateMachine.transitionToRunning()) { // query already running or finished return; } CompletableFuture<?> future = task.execute(statement, transactionManager, metadata, accessControl, stateMachine); future.whenComplete((o, throwable) -> { if (throwable == null) { stateMachine.transitionToFinishing(); } else { fail(throwable); } }); } catch (Throwable e) { fail(e); if (!(e instanceof RuntimeException)) { throw Throwables.propagate(e); } } }
@Test public void testFinished() throws InterruptedException { QueryStateMachine stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToFinishing()); stateMachine.waitForStateChange(FINISHING, new Duration(2, TimeUnit.SECONDS)); assertFinalState(stateMachine, FINISHED); }
queryStateMachine.transitionToFinishing();
private static void assertFinalState(QueryStateMachine stateMachine, QueryState expectedState) { assertTrue(expectedState.isDone()); assertState(stateMachine, expectedState); assertFalse(stateMachine.transitionToPlanning()); assertState(stateMachine, expectedState); assertFalse(stateMachine.transitionToStarting()); assertState(stateMachine, expectedState); assertFalse(stateMachine.transitionToRunning()); assertState(stateMachine, expectedState); assertFalse(stateMachine.transitionToFinishing()); assertState(stateMachine, expectedState); assertFalse(stateMachine.transitionToFailed(FAILED_CAUSE)); assertState(stateMachine, expectedState); // attempt to fail with another exception, which will fail assertFalse(stateMachine.transitionToFailed(new IOException("failure after finish"))); assertState(stateMachine, expectedState); }
@Test public void testBasicStateChanges() throws InterruptedException { QueryStateMachine stateMachine = createQueryStateMachine(); assertState(stateMachine, QUEUED); assertTrue(stateMachine.transitionToPlanning()); assertState(stateMachine, PLANNING); assertTrue(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); assertTrue(stateMachine.transitionToFinishing()); stateMachine.waitForStateChange(FINISHING, new Duration(2, TimeUnit.SECONDS)); assertState(stateMachine, FINISHED); }
@Test public void testRunning() throws InterruptedException { QueryStateMachine stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); assertFalse(stateMachine.transitionToPlanning()); assertState(stateMachine, RUNNING); assertFalse(stateMachine.transitionToStarting()); assertState(stateMachine, RUNNING); assertFalse(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); assertTrue(stateMachine.transitionToFinishing()); stateMachine.waitForStateChange(FINISHING, new Duration(2, TimeUnit.SECONDS)); assertState(stateMachine, FINISHED); stateMachine = createQueryStateMachine(); stateMachine.transitionToRunning(); assertTrue(stateMachine.transitionToFailed(FAILED_CAUSE)); assertState(stateMachine, FAILED); }
@Test public void testStarting() throws InterruptedException { QueryStateMachine stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); assertFalse(stateMachine.transitionToPlanning()); assertState(stateMachine, STARTING); assertFalse(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); stateMachine = createQueryStateMachine(); stateMachine.transitionToStarting(); assertTrue(stateMachine.transitionToFinishing()); stateMachine.waitForStateChange(FINISHING, new Duration(2, TimeUnit.SECONDS)); assertState(stateMachine, FINISHED); stateMachine = createQueryStateMachine(); stateMachine.transitionToStarting(); assertTrue(stateMachine.transitionToFailed(FAILED_CAUSE)); assertState(stateMachine, FAILED); }
@Test public void testQueued() throws InterruptedException { QueryStateMachine stateMachine = createQueryStateMachine(); assertState(stateMachine, QUEUED); assertTrue(stateMachine.transitionToPlanning()); assertState(stateMachine, PLANNING); stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToFinishing()); stateMachine.waitForStateChange(FINISHING, new Duration(2, TimeUnit.SECONDS)); assertState(stateMachine, FINISHED); stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToFailed(FAILED_CAUSE)); assertState(stateMachine, FAILED); }
@Test public void testPlanning() throws InterruptedException { QueryStateMachine stateMachine = createQueryStateMachine(); assertTrue(stateMachine.transitionToPlanning()); assertState(stateMachine, PLANNING); assertFalse(stateMachine.transitionToPlanning()); assertState(stateMachine, PLANNING); assertTrue(stateMachine.transitionToStarting()); assertState(stateMachine, STARTING); stateMachine = createQueryStateMachine(); stateMachine.transitionToPlanning(); assertTrue(stateMachine.transitionToRunning()); assertState(stateMachine, RUNNING); stateMachine = createQueryStateMachine(); stateMachine.transitionToPlanning(); assertTrue(stateMachine.transitionToFinishing()); stateMachine.waitForStateChange(FINISHING, new Duration(2, TimeUnit.SECONDS)); assertState(stateMachine, FINISHED); stateMachine = createQueryStateMachine(); stateMachine.transitionToPlanning(); assertTrue(stateMachine.transitionToFailed(FAILED_CAUSE)); assertState(stateMachine, FAILED); }