package cz.cuni.mff.d3s.been.manager.action; import static cz.cuni.mff.d3s.been.manager.TaskManagerConfiguration.DEFAULT_MAXIMUM_ALLOWED_RESUBMITS; import static cz.cuni.mff.d3s.been.manager.TaskManagerConfiguration.MAXIMUM_ALLOWED_RESUBMITS; import java.util.List; import com.hazelcast.core.IMap; import cz.cuni.mff.d3s.been.cluster.context.ClusterContext; import cz.cuni.mff.d3s.been.core.benchmark.BenchmarkEntry; import cz.cuni.mff.d3s.been.core.benchmark.ResubmitHistoryItem; import cz.cuni.mff.d3s.been.core.task.TaskEntry; import cz.cuni.mff.d3s.been.core.task.TaskState; import cz.cuni.mff.d3s.been.util.PropertyReader; /** * @author Kuba Brecka */ final class ResubmitBenchmarkAction implements TaskAction { private final ClusterContext ctx; private final TaskEntry entry; /** * Creates ResubmitBenchmarkAction. * * @param ctx * connection to the cluster * @param entry * targeted task entry */ public ResubmitBenchmarkAction(ClusterContext ctx, TaskEntry entry) { this.ctx = ctx; this.entry = entry; } @Override public void execute() throws TaskActionException { String benchmarkId = entry.getBenchmarkId(); IMap<String, BenchmarkEntry> benchmarksMap = ctx.getBenchmarks().getBenchmarksMap(); benchmarksMap.lock(benchmarkId); try { BenchmarkEntry benchmarkEntry = ctx.getBenchmarks().get(benchmarkId); String generatorId = benchmarkEntry.getGeneratorId(); TaskEntry generatorTask = ctx.getTasks().getTask(generatorId); if (!benchmarkEntry.isAllowResubmit()) { return; } List<ResubmitHistoryItem> resubmits = benchmarkEntry.getResubmitHistory().getResubmitHistoryItem(); PropertyReader propertyReader = PropertyReader.on(ctx.getProperties()); int maximumResubmits = propertyReader.getInteger(MAXIMUM_ALLOWED_RESUBMITS, DEFAULT_MAXIMUM_ALLOWED_RESUBMITS); if (resubmits.size() >= maximumResubmits) { return; } // fail-safe check for race conditions if (generatorTask.getState() != TaskState.ABORTED) { return; } ctx.getBenchmarks().resubmit(benchmarkEntry); } finally { benchmarksMap.unlock(benchmarkId); } } }