use of org.apache.flink.runtime.scheduler.strategy.ExecutionVertexID in project flink by splunk.
the class DefaultPreferredLocationsRetriever method getInputLocationFutures.
private Collection<CompletableFuture<TaskManagerLocation>> getInputLocationFutures(final Set<ExecutionVertexID> producersToIgnore, final Collection<ExecutionVertexID> producers) {
final Collection<CompletableFuture<TaskManagerLocation>> locationsFutures = new ArrayList<>();
for (ExecutionVertexID producer : producers) {
final Optional<CompletableFuture<TaskManagerLocation>> optionalLocationFuture;
if (!producersToIgnore.contains(producer)) {
optionalLocationFuture = inputsLocationsRetriever.getTaskManagerLocation(producer);
} else {
optionalLocationFuture = Optional.empty();
}
optionalLocationFuture.ifPresent(locationsFutures::add);
// be a long time to wait for all the location futures to complete
if (locationsFutures.size() > MAX_DISTINCT_LOCATIONS_TO_CONSIDER) {
return Collections.emptyList();
}
}
return locationsFutures;
}
use of org.apache.flink.runtime.scheduler.strategy.ExecutionVertexID in project flink by splunk.
the class DefaultScheduler method assignResource.
private BiFunction<LogicalSlot, Throwable, LogicalSlot> assignResource(final DeploymentHandle deploymentHandle) {
final ExecutionVertexVersion requiredVertexVersion = deploymentHandle.getRequiredVertexVersion();
final ExecutionVertexID executionVertexId = deploymentHandle.getExecutionVertexId();
return (logicalSlot, throwable) -> {
if (executionVertexVersioner.isModified(requiredVertexVersion)) {
if (throwable == null) {
log.debug("Refusing to assign slot to execution vertex {} because this deployment was " + "superseded by another deployment", executionVertexId);
releaseSlotIfPresent(logicalSlot);
}
return null;
}
// a task which is about to cancel in #restartTasksWithDelay(...)
if (throwable != null) {
throw new CompletionException(maybeWrapWithNoResourceAvailableException(throwable));
}
final ExecutionVertex executionVertex = getExecutionVertex(executionVertexId);
executionVertex.tryAssignResource(logicalSlot);
startReserveAllocation(executionVertexId, logicalSlot.getAllocationId());
return logicalSlot;
};
}
use of org.apache.flink.runtime.scheduler.strategy.ExecutionVertexID in project flink by splunk.
the class DefaultScheduler method restartTasksWithDelay.
private void restartTasksWithDelay(final FailureHandlingResult failureHandlingResult) {
final Set<ExecutionVertexID> verticesToRestart = failureHandlingResult.getVerticesToRestart();
final Set<ExecutionVertexVersion> executionVertexVersions = new HashSet<>(executionVertexVersioner.recordVertexModifications(verticesToRestart).values());
final boolean globalRecovery = failureHandlingResult.isGlobalFailure();
addVerticesToRestartPending(verticesToRestart);
final CompletableFuture<?> cancelFuture = cancelTasksAsync(verticesToRestart);
final FailureHandlingResultSnapshot failureHandlingResultSnapshot = FailureHandlingResultSnapshot.create(failureHandlingResult, id -> this.getExecutionVertex(id).getCurrentExecutionAttempt());
delayExecutor.schedule(() -> FutureUtils.assertNoException(cancelFuture.thenRunAsync(() -> {
archiveFromFailureHandlingResult(failureHandlingResultSnapshot);
restartTasks(executionVertexVersions, globalRecovery);
}, getMainThreadExecutor())), failureHandlingResult.getRestartDelayMS(), TimeUnit.MILLISECONDS);
}
use of org.apache.flink.runtime.scheduler.strategy.ExecutionVertexID in project flink by splunk.
the class DefaultScheduler method deployOrHandleError.
private BiFunction<Object, Throwable, Void> deployOrHandleError(final DeploymentHandle deploymentHandle) {
final ExecutionVertexVersion requiredVertexVersion = deploymentHandle.getRequiredVertexVersion();
final ExecutionVertexID executionVertexId = requiredVertexVersion.getExecutionVertexId();
return (ignored, throwable) -> {
if (executionVertexVersioner.isModified(requiredVertexVersion)) {
log.debug("Refusing to deploy execution vertex {} because this deployment was " + "superseded by another deployment", executionVertexId);
return null;
}
if (throwable == null) {
deployTaskSafe(executionVertexId);
} else {
handleTaskDeploymentFailure(executionVertexId, throwable);
}
return null;
};
}
use of org.apache.flink.runtime.scheduler.strategy.ExecutionVertexID in project flink by splunk.
the class UpdatePartitionConsumersTest method testUpdatePartitionConsumers.
/**
* Test BLOCKING partition information are properly updated to consumers when its producer
* finishes.
*/
@Test
public void testUpdatePartitionConsumers() throws Exception {
final SimpleAckingTaskManagerGateway taskManagerGateway = new SimpleAckingTaskManagerGateway();
final SchedulerBase scheduler = SchedulerTestingUtils.newSchedulerBuilder(jobGraph, ComponentMainThreadExecutorServiceAdapter.forMainThread()).setExecutionSlotAllocatorFactory(new TestExecutionSlotAllocatorFactory(taskManagerGateway)).build();
final ExecutionVertex ev1 = scheduler.getExecutionVertex(new ExecutionVertexID(v1.getID(), 0));
final ExecutionVertex ev2 = scheduler.getExecutionVertex(new ExecutionVertexID(v2.getID(), 0));
final ExecutionVertex ev3 = scheduler.getExecutionVertex(new ExecutionVertexID(v3.getID(), 0));
final ExecutionVertex ev4 = scheduler.getExecutionVertex(new ExecutionVertexID(v4.getID(), 0));
final CompletableFuture<TaskDeploymentDescriptor> ev4TddFuture = new CompletableFuture<>();
taskManagerGateway.setSubmitConsumer(tdd -> {
if (tdd.getExecutionAttemptId().equals(ev4.getCurrentExecutionAttempt().getAttemptId())) {
ev4TddFuture.complete(tdd);
}
});
scheduler.startScheduling();
assertThat(ev1.getExecutionState(), is(ExecutionState.DEPLOYING));
assertThat(ev2.getExecutionState(), is(ExecutionState.DEPLOYING));
assertThat(ev3.getExecutionState(), is(ExecutionState.DEPLOYING));
assertThat(ev4.getExecutionState(), is(ExecutionState.DEPLOYING));
updateState(scheduler, ev1, ExecutionState.INITIALIZING);
updateState(scheduler, ev1, ExecutionState.RUNNING);
updateState(scheduler, ev2, ExecutionState.INITIALIZING);
updateState(scheduler, ev2, ExecutionState.RUNNING);
updateState(scheduler, ev3, ExecutionState.INITIALIZING);
updateState(scheduler, ev3, ExecutionState.RUNNING);
updateState(scheduler, ev4, ExecutionState.INITIALIZING);
updateState(scheduler, ev4, ExecutionState.RUNNING);
final InputGateDeploymentDescriptor ev4Igdd2 = ev4TddFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).getInputGates().get(1);
assertThat(ev4Igdd2.getShuffleDescriptors()[0], instanceOf(UnknownShuffleDescriptor.class));
final CompletableFuture<Void> updatePartitionFuture = new CompletableFuture<>();
taskManagerGateway.setUpdatePartitionsConsumer((attemptId, partitionInfos, time) -> {
assertThat(attemptId, equalTo(ev4.getCurrentExecutionAttempt().getAttemptId()));
final List<PartitionInfo> partitionInfoList = IterableUtils.toStream(partitionInfos).collect(Collectors.toList());
assertThat(partitionInfoList, hasSize(1));
final PartitionInfo partitionInfo = partitionInfoList.get(0);
assertThat(partitionInfo.getIntermediateDataSetID(), equalTo(v3.getProducedDataSets().get(0).getId()));
assertThat(partitionInfo.getShuffleDescriptor(), instanceOf(NettyShuffleDescriptor.class));
updatePartitionFuture.complete(null);
});
updateState(scheduler, ev1, ExecutionState.FINISHED);
updateState(scheduler, ev3, ExecutionState.FINISHED);
updatePartitionFuture.get(TIMEOUT, TimeUnit.MILLISECONDS);
}
Aggregations