package com.breakersoft.plow.dispatcher;
import java.util.List;
import com.breakersoft.plow.Cluster;
import com.breakersoft.plow.JobId;
import com.breakersoft.plow.Proc;
import com.breakersoft.plow.Project;
import com.breakersoft.plow.Task;
import com.breakersoft.plow.dispatcher.domain.DispatchJob;
import com.breakersoft.plow.dispatcher.domain.DispatchNode;
import com.breakersoft.plow.dispatcher.domain.DispatchProc;
import com.breakersoft.plow.dispatcher.domain.DispatchProject;
import com.breakersoft.plow.dispatcher.domain.DispatchResource;
import com.breakersoft.plow.dispatcher.domain.DispatchTask;
import com.breakersoft.plow.rnd.thrift.RunTaskCommand;
import com.breakersoft.plow.thrift.TaskState;
/**
* Transactional dispatcher opterations.
*
* @author chambers
*
*/
public interface DispatchService {
List<DispatchProject> getSortedProjectList(DispatchNode node);
DispatchNode getDispatchNode(String name);
boolean reserveTask(Task task);
boolean unreserveTask(Task task);
DispatchProc getDispatchProc(String id);
DispatchProc getDispatchProc(Task task);
/**
* Unassigns the task from the proc. The proc is still assigned to
* the job, and folder/job/layer counts are not changed.
*
* @param proc
*/
void unassignProc(DispatchProc proc);
boolean stopTask(Task task, TaskState state, int exitStatus, int exitSignal);
// New stuff.
List<DispatchTask> getDispatchableTasks(JobId job, DispatchResource resource, int limit);
/**
* Removes the proc from the proc table and updates proc counts.
*
* @param proc
* @param why
*/
void deallocateProc(Proc proc, String why);
DispatchProc allocateProc(DispatchNode node, DispatchTask task);
List<DispatchProc> getOrphanProcs();
RunTaskCommand getRuntaskCommand(Task task);
boolean startTask(DispatchTask task, DispatchProc proc);
void assignProc(DispatchProc proc, DispatchTask task);
List<DispatchJob> getDispatchJobs(DispatchProject project, DispatchNode node);
boolean isAtMaxRetries(Task task);
boolean quotaCheck(Cluster cluster, Project project);
boolean dependQueueProcessed(Task task);
List<DispatchTask> getDispatchableTasks(JobId job, DispatchResource resource);
void markAsDeallocated(Proc proc);
List<DispatchProc> getDeallocatedProcs();
void unassignAndMarkForDeallocation(Proc proc);
}