package com.breakersoft.plow.dispatcher.pipeline; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.breakersoft.plow.Job; import com.breakersoft.plow.Layer; import com.breakersoft.plow.LayerE; import com.breakersoft.plow.Task; import com.breakersoft.plow.dispatcher.DispatchService; import com.breakersoft.plow.dispatcher.ProcDispatcher; import com.breakersoft.plow.dispatcher.domain.DispatchProc; import com.breakersoft.plow.monitor.PlowStats; import com.breakersoft.plow.rnd.thrift.RunTaskResult; import com.breakersoft.plow.service.JobService; import com.breakersoft.plow.service.StateManager; import com.breakersoft.plow.thrift.TaskState; @Component public class PipelineCommandService { private static final Logger logger = org.slf4j.LoggerFactory.getLogger(PipelineCommandService.class); @Autowired private DispatchService dispatchService; @Autowired private ProcDispatcher procDispatcher; @Autowired private JobService jobService; @Autowired private StateManager stateManager; void stopTask(RunTaskResult result, Task task, DispatchProc proc) { TaskState newState; if (result.exitStatus == 0) { newState = TaskState.SUCCEEDED; } else { if (dispatchService.isAtMaxRetries(task)) { newState = TaskState.DEAD; } else { newState = TaskState.WAITING; } } boolean deallocateProc = false; if (dispatchService.stopTask( task, newState, result.exitStatus, result.exitSignal)) { dispatchService.unassignProc(proc); PlowStats.taskStoppedCount.incrementAndGet(); if (newState.equals(TaskState.SUCCEEDED)) { stateManager.satisfyDependsOn(task); final Layer layer = new LayerE(task); if (jobService.isLayerComplete(layer)) { stateManager.satisfyDependsOn(layer); } try { if (jobService.isJobFinished(task)) { deallocateProc = true; final Job job = jobService.getJob(task.getJobId()); stateManager.shutdownJob(job); } } catch (RuntimeException e) { deallocateProc = true; logger.warn("Failed to shutdown job after task complete {}", task); } //TODO: do I even need this anymore once durable pipeline works? dispatchService.dependQueueProcessed(task); } } else { deallocateProc = true; PlowStats.taskStoppedFailCount.incrementAndGet(); logger.error("Unable to stop stop task {}", task); } if (!jobService.isDispatchable(proc)) { deallocateProc = true; } if (deallocateProc) { dispatchService.markAsDeallocated(proc); } else { procDispatcher.dispatch(proc); } } void dispatchProc(DispatchProc proc) { procDispatcher.dispatch(proc); } }