@Override public void killFragment(String fragmentId) { synchronized (lock) { TaskWrapper taskWrapper = knownTasks.remove(fragmentId); // Can be null since the task may have completed meanwhile. if (taskWrapper != null) { if (taskWrapper.inWaitQueue) { if (isDebugEnabled) { LOG.debug("Removing {} from waitQueue", fragmentId); } taskWrapper.setIsInWaitQueue(false); waitQueue.remove(taskWrapper); } if (taskWrapper.inPreemptionQueue) { if (isDebugEnabled) { LOG.debug("Removing {} from preemptionQueue", fragmentId); } taskWrapper.setIsInPreemptableQueue(false); preemptionQueue.remove(taskWrapper); } taskWrapper.getTaskRunnerCallable().killTask(); } else { LOG.info("Ignoring killFragment request for {} since it isn't known", fragmentId); } lock.notify(); } }
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(); } }