/** Calculate the job state based on the state of its tasks */ private boolean calculateJobState(boolean force) { boolean err = false, sched = false, run = false, reb = false, stopped = false; for (JobTask t : nodes) { if (t.getWasStopped()) { stopped = true; } if (t.getState() == JobTaskState.REBALANCE) { reb = true; } else if (t.isRunning()) { run = true; } else if (t.getState() == JobTaskState.ALLOCATED || t.getState().isQueuedState()) { sched = true; } else if (t.getState() == JobTaskState.ERROR) { err = true; break; } } JobState oldJobState = getState(); JobState nextState = (err) ? JobState.ERROR : (reb) ? JobState.REBALANCE : (run) ? JobState.RUNNING : (sched) ? JobState.SCHEDULED : JobState.IDLE; if (setState(nextState, force)) { // If transitioning from error to non-error state, enable job as long as it has run recently. if (oldJobState == JobState.ERROR && nextState != JobState.ERROR && getSubmitTime() != null && System.currentTimeMillis() - getSubmitTime() < AUTO_ENABLE_CUTOFF) { setEnabled(true); } wasStopped = stopped; return true; } else { return false; } }