package cz.cuni.mff.d3s.been.manager.msg;
import static cz.cuni.mff.d3s.been.core.task.TaskState.ABORTED;
import static cz.cuni.mff.d3s.been.core.task.TaskState.FINISHED;
import cz.cuni.mff.d3s.been.cluster.context.ClusterContext;
import cz.cuni.mff.d3s.been.core.task.TaskEntry;
import cz.cuni.mff.d3s.been.core.task.TaskState;
import cz.cuni.mff.d3s.been.manager.action.Actions;
import cz.cuni.mff.d3s.been.manager.action.TaskAction;
import cz.cuni.mff.d3s.been.manager.selector.NoRuntimeFoundException;
import cz.cuni.mff.d3s.been.manager.selector.RuntimeSelectors;
/**
* Message which checks scheduability of a task.
*
* If a task can be scheduled an appropriate action should take place.
*
* @author Martin Sixta
*/
public class CheckSchedulabilityMessage implements TaskMessage {
private final TaskEntry entry;
/**
* Creates new CheckSchedulabilityMessage
*
* @param entry
* targeted entry
*/
public CheckSchedulabilityMessage(TaskEntry entry) {
this.entry = entry;
}
@Override
public TaskAction createAction(ClusterContext ctx) {
if (isWaitingOnTask(ctx)) {
return Actions.createNullAction();
}
try {
RuntimeSelectors.fromEntry(entry, ctx).select();
return Actions.createScheduleTaskAction(ctx, entry);
} catch (NoRuntimeFoundException e) {
// do nothing, will have to wait
}
return Actions.createNullAction();
}
/**
* Checks whether the task is waiting on another task.
*
* @param ctx
* connection to the cluster
* @return true if the task is waiting on another task, false otherwise
*/
private boolean isWaitingOnTask(final ClusterContext ctx) {
final String taskDependency = entry.getTaskDependency();
if (taskDependency == null || taskDependency.isEmpty()) {
return false;
}
final TaskEntry task = ctx.getTasks().getTask(taskDependency);
if (task == null) {
return false;
} else {
return !isTaskDone();
}
}
/**
* Checks whether the task is done executing
*
* @return whether the task is in ABORTED or FINISHED state
*/
private boolean isTaskDone() {
final TaskState state = entry.getState();
return (state == ABORTED) || (state == FINISHED);
}
}