private void runInputTask(ExecSession exec, ProcessTask task, ProcessState state, int taskIndex) {
InputPlugin inputPlugin = exec.newPlugin(InputPlugin.class, task.getInputPluginType());
List<FilterPlugin> filterPlugins = Filters.newFilterPlugins(exec, task.getFilterPluginTypes());
OutputPlugin outputPlugin = exec.newPlugin(OutputPlugin.class, task.getOutputPluginType());
try (ScatterTransactionalPageOutput tran = new ScatterTransactionalPageOutput(state, taskIndex, scatterCount)) {
tran.openOutputs(outputPlugin, task.getOutputSchema(), task.getOutputTaskSource());
try (AbortTransactionResource aborter = new AbortTransactionResource(tran)) {
tran.openFilters(filterPlugins, task.getFilterSchemas(), task.getFilterTaskSources());
tran.startWorkers(outputExecutor);
state.getInputTaskState(taskIndex).start();
for (int i = 0; i < scatterCount; i++) {
state.getOutputTaskState(taskIndex * scatterCount + i).start();
}
TaskReport inputTaskReport = inputPlugin.run(task.getInputTaskSource(), task.getInputSchema(), taskIndex, tran);
if (inputTaskReport == null) {
inputTaskReport = exec.newTaskReport();
}
state.getInputTaskState(taskIndex).setTaskReport(inputTaskReport);
tran.commit();
aborter.dontAbort();
}
} finally {
state.getInputTaskState(taskIndex).finish();
state.getOutputTaskState(taskIndex).finish();
}
}
}