private void finishableStateUpdated(TaskWrapper taskWrapper, boolean newFinishableState) { synchronized (lock) { if (taskWrapper.isInWaitQueue()) { // Re-order the wait queue LOG.debug( "Re-ordering the wait queue since {} finishable state moved to {}", taskWrapper.getRequestId(), newFinishableState); if (waitQueue.remove(taskWrapper)) { // Put element back only if it existed. waitQueue.offer(taskWrapper); } else { LOG.warn( "Failed to remove {} from waitQueue", taskWrapper.getTaskRunnerCallable().getRequestId()); } } if (newFinishableState == true && taskWrapper.isInPreemptionQueue()) { LOG.debug( "Removing {} from preemption queue because it's state changed to {}", taskWrapper.getRequestId(), newFinishableState); preemptionQueue.remove(taskWrapper.getTaskRunnerCallable()); } else if (newFinishableState == false && !taskWrapper.isInPreemptionQueue() && !taskWrapper.isInWaitQueue()) { LOG.debug( "Adding {} to preemption queue since finishable state changed to {}", taskWrapper.getRequestId(), newFinishableState); preemptionQueue.offer(taskWrapper); } lock.notify(); } }
@Override public Set<String> getExecutorsStatus() { Set<String> result = new HashSet<>(); StringBuilder value = new StringBuilder(); for (Map.Entry<String, TaskWrapper> e : knownTasks.entrySet()) { value.setLength(0); value.append(e.getKey()); TaskWrapper task = e.getValue(); boolean isFirst = true; TaskRunnerCallable c = task.getTaskRunnerCallable(); if (c != null && c.getRequest() != null && c.getRequest().getFragmentSpec() != null) { FragmentSpecProto fs = c.getRequest().getFragmentSpec(); value .append(isFirst ? " (" : ", ") .append(fs.getDagName()) .append("/") .append(fs.getVertexName()); isFirst = false; } value.append(isFirst ? " (" : ", "); if (task.isInWaitQueue()) { value.append("in queue"); } else if (c != null) { long startTime = c.getStartTime(); if (startTime != 0) { value.append("started at ").append(sdf.get().format(new Date(startTime))); } else { value.append("not started"); } } else { value.append("has no callable"); } if (task.isInPreemptionQueue()) { value.append(", ").append("preemptable"); } value.append(")"); result.add(value.toString()); } return result; }