use of org.apache.flink.api.common.time.Time in project flink by apache.
the class ExecutionGraphSchedulingTest method testTimeoutForSlotAllocation.
/**
* This test verifies that the slot allocations times out after a certain time, and that
* all slots are released in that case.
*/
@Test
public void testTimeoutForSlotAllocation() throws Exception {
// we construct a simple graph: (task)
final int parallelism = 3;
final JobVertex vertex = new JobVertex("task");
vertex.setParallelism(parallelism);
vertex.setInvokableClass(NoOpInvokable.class);
final JobID jobId = new JobID();
final JobGraph jobGraph = new JobGraph(jobId, "test", vertex);
final SlotOwner slotOwner = mock(SlotOwner.class);
final TaskManagerGateway taskManager = mock(TaskManagerGateway.class);
final SimpleSlot[] slots = new SimpleSlot[parallelism];
@SuppressWarnings({ "unchecked", "rawtypes" }) final FlinkCompletableFuture<SimpleSlot>[] slotFutures = new FlinkCompletableFuture[parallelism];
for (int i = 0; i < parallelism; i++) {
slots[i] = createSlot(taskManager, jobId, slotOwner);
slotFutures[i] = new FlinkCompletableFuture<>();
}
ProgrammedSlotProvider slotProvider = new ProgrammedSlotProvider(parallelism);
slotProvider.addSlots(vertex.getID(), slotFutures);
final ExecutionGraph eg = createExecutionGraph(jobGraph, slotProvider, Time.milliseconds(20));
final TerminalJobStatusListener statusListener = new TerminalJobStatusListener();
eg.registerJobStatusListener(statusListener);
// we complete one future
slotFutures[1].complete(slots[1]);
// kick off the scheduling
eg.setScheduleMode(ScheduleMode.EAGER);
eg.setQueuedSchedulingAllowed(true);
eg.scheduleForExecution();
// we complete another future
slotFutures[2].complete(slots[2]);
// since future[0] is still missing the while operation must time out
// we have no restarts allowed, so the job will go terminal
statusListener.waitForTerminalState(2000);
// wait until all slots are back
verify(slotOwner, new Timeout(2000, times(2))).returnAllocatedSlot(any(Slot.class));
// verify that no deployments have happened
verify(taskManager, times(0)).submitTask(any(TaskDeploymentDescriptor.class), any(Time.class));
for (Future<SimpleSlot> future : slotFutures) {
if (future.isDone()) {
assertTrue(future.get().isCanceled());
}
}
}
Aggregations