package com.breakersoft.plow.crond; import java.util.List; import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import com.breakersoft.plow.ExitStatus; import com.breakersoft.plow.Signal; import com.breakersoft.plow.Task; import com.breakersoft.plow.dispatcher.DispatchService; import com.breakersoft.plow.dispatcher.domain.DispatchProc; import com.breakersoft.plow.monitor.PlowStats; import com.breakersoft.plow.service.JobService; import com.breakersoft.plow.thrift.TaskState; /** * * Cleans up orphaned procs. * * @author chambers * */ public class OrphanProcChecker extends AbstractCrondTask { private static final Logger logger = LoggerFactory.getLogger(OrphanProcChecker.class); @Autowired DispatchService dispatchService; @Autowired JobService jobService; public OrphanProcChecker() { super(CrondTask.ORPHAN_PROC_CHECK); } protected void run() { final List<DispatchProc> procs = dispatchService.getOrphanProcs(); logger.info("Orphan proc checker found {} orphan procs.", procs.size()); for (DispatchProc proc: procs) { try { final UUID taskId = proc.getTaskId(); if (proc.getTaskId() != null) { final Task task = jobService.getTask(taskId); logger.warn("Found orphaned {}", task); PlowStats.procOrphanedCount.incrementAndGet(); dispatchService.stopTask(task, TaskState.WAITING, ExitStatus.FAIL, Signal.ORPANED_TASK); } logger.warn("Deallocating orphan {}", proc); dispatchService.markAsDeallocated(proc); } catch (Exception e) { logger.warn("Failed to handled orphaned proc, " + e.getMessage(), e); } } } }