package com.breakersoft.plow.dispatcher.domain; import java.util.List; import org.slf4j.Logger; import com.breakersoft.plow.dispatcher.DispatchConfig; import com.google.common.collect.Lists; public class DispatchResult { private static final Logger logger = org.slf4j.LoggerFactory.getLogger(DispatchResult.class); public final DispatchResource resource; public DispatchProfile profile = new DispatchProfile(); public int cores = 0; public int ram = 0; public int procs = 0; public boolean continueDispatch = true; public boolean isTest = false; public long startTime = System.currentTimeMillis(); public int reservationFailures = 0; public final List<DispatchPair> pairs = Lists.newArrayListWithExpectedSize(DispatchConfig.MAX_PROCS_PER_JOB); public DispatchResult(DispatchResource resource) { this.resource = resource; } /** * Check if the given resource can still be dispatched. * * @return */ public boolean continueDispatching() { if (reservationFailures >= 5) { logger.trace("Stopped dispatching due to contention."); return false; } if (pairs.size() >= DispatchConfig.MAX_PROCS_PER_JOB) { logger.trace("Stopped dispatching by procs/maxprocs {} >= {}", pairs.size(), DispatchConfig.MAX_PROCS_PER_JOB); return false; } if (cores >= DispatchConfig.MAX_CORES_PER_JOB) { logger.trace("Stopped dispatching by cores/maxcores {} >= {}", cores, DispatchConfig.MAX_CORES_PER_JOB); return false; } if (resource.getIdleCores() < 1) { logger.trace("Stopped dispatching resource cores {} < 1", resource.getIdleCores()); return false; } if (resource.getIdleRam() <= 0) { logger.trace("Stopped dispatching resource ram {} <=0", resource.getIdleRam()); return false; } return continueDispatch; } public boolean canDispatch(DispatchTask task) { if (resource.getIdleCores() < task.minCores) { logger.trace("Stopped dispatching by cores {} < {}", resource.getIdleCores(), task.minCores); return false; } if (resource.getIdleRam() < task.minRam) { logger.info("Stopped dispatching by ram {} < {}", resource.getIdleRam(), task.minRam); return false; } return true; } public void addDispatchPair(DispatchProc proc, DispatchTask task) { cores+=task.minCores; ram+=task.minRam; procs++; pairs.add(new DispatchPair(proc, task)); resource.allocate(task.minCores, task.minRam); } }