/** * Marks task as cancelled. * <p> * Returns true if cancellation was successful, false otherwise. */ public boolean cancel(String reason, Runnable listener) { final boolean cancelled; synchronized (this) { assert reason != null; if (cancellationReason == null) { cancellationReason = reason; cancellationListener = listener; cancelled = true; } else { // Already cancelled by somebody else cancelled = false; } } if (cancelled) { task.cancel(reason); } return cancelled; }
@Override public void applyClusterState(ClusterChangedEvent event) { lastDiscoveryNodes = event.state().getNodes(); if (event.nodesRemoved()) { synchronized (banedParents) { lastDiscoveryNodes = event.state().getNodes(); // Remove all bans that were registered by nodes that are no longer in the cluster state Iterator<TaskId> banIterator = banedParents.keySet().iterator(); while (banIterator.hasNext()) { TaskId taskId = banIterator.next(); if (lastDiscoveryNodes.nodeExists(taskId.getNodeId()) == false) { logger.debug("Removing ban for the parent [{}] on the node [{}], reason: the parent node is gone", taskId, event.state().getNodes().getLocalNode()); banIterator.remove(); } } } // Cancel cancellable tasks for the nodes that are gone for (Map.Entry<Long, CancellableTaskHolder> taskEntry : cancellableTasks.entrySet()) { CancellableTaskHolder holder = taskEntry.getValue(); CancellableTask task = holder.getTask(); TaskId parentTaskId = task.getParentTaskId(); if (parentTaskId.isSet() && lastDiscoveryNodes.nodeExists(parentTaskId.getNodeId()) == false) { if (task.cancelOnParentLeaving()) { holder.cancel("Coordinating node [" + parentTaskId.getNodeId() + "] left the cluster"); } } } } }
String nodeId = clusterService.localNode().getId(); final boolean canceled; if (cancellableTask.shouldCancelChildrenOnCancellation()) { DiscoveryNodes childNodes = clusterService.state().nodes(); final BanLock banLock = new BanLock(childNodes.getSize(), () -> removeBanOnNodes(cancellableTask, childNodes)); if (canceled) { logger.trace("cancelling task {} on child nodes", cancellableTask.getId()); AtomicInteger responses = new AtomicInteger(childNodes.getSize()); List<Exception> failures = new ArrayList<>(); () -> listener.onResponse(cancellableTask.taskInfo(nodeId, false))); if (canceled) { logger.trace("task {} doesn't have any children that should be cancelled", cancellableTask.getId()); logger.trace("task {} is already cancelled", cancellableTask.getId()); throw new IllegalStateException("task with id " + cancellableTask.getId() + " is already cancelled");
private void processResponse() { banLock.onBanSet(); if (responses.decrementAndGet() == 0) { if (failures.isEmpty() == false) { IllegalStateException exception = new IllegalStateException("failed to cancel children of the task [" + cancellableTask.getId() + "]"); failures.forEach(exception::addSuppressed); listener.onFailure(exception); } else { listener.onResponse(cancellableTask.taskInfo(nodeId, false)); } } } });
/** * Cancels a task * <p> * Returns true if cancellation was started successful, null otherwise. * * After starting cancellation on the parent task, the task manager tries to cancel all children tasks * of the current task. Once cancellation of the children tasks is done, the listener is triggered. */ public boolean cancel(CancellableTask task, String reason, Runnable listener) { CancellableTaskHolder holder = cancellableTasks.get(task.getId()); if (holder != null) { logger.trace("cancelling task with id {}", task.getId()); return holder.cancel(reason, listener); } return false; }
/** * This method is called by the task manager when this task is cancelled. */ final void cancel(String reason) { assert reason != null; this.reason.compareAndSet(null, reason); onCancelled(); }
public boolean hasParent(TaskId parentTaskId) { return task.getParentTaskId().equals(parentTaskId); }
/** * Returns the list of currently running tasks on the node that can be cancelled */ public Map<Long, CancellableTask> getCancellableTasks() { HashMap<Long, CancellableTask> taskHashMap = new HashMap<>(); for (CancellableTaskHolder holder : cancellableTasks.values()) { taskHashMap.put(holder.getTask().getId(), holder.getTask()); } return Collections.unmodifiableMap(taskHashMap); }
private void processResponse() { banLock.onBanSet(); if (responses.decrementAndGet() == 0) { if (failures.isEmpty() == false) { IllegalStateException exception = new IllegalStateException("failed to cancel children of the task [" + cancellableTask.getId() + "]"); failures.forEach(exception::addSuppressed); listener.onFailure(exception); } else { listener.onResponse(cancellableTask.taskInfo(nodeId, false)); } } } });
/** * This method is called by the task manager when this task is cancelled. */ final void cancel(String reason) { assert reason != null; this.reason.compareAndSet(null, reason); onCancelled(); }
public boolean hasParent(TaskId parentTaskId) { return task.getParentTaskId().equals(parentTaskId); }
String nodeId = clusterService.localNode().getId(); final boolean canceled; if (cancellableTask.shouldCancelChildrenOnCancellation()) { DiscoveryNodes childNodes = clusterService.state().nodes(); final BanLock banLock = new BanLock(childNodes.getSize(), () -> removeBanOnNodes(cancellableTask, childNodes)); if (canceled) { logger.trace("cancelling task {} on child nodes", cancellableTask.getId()); AtomicInteger responses = new AtomicInteger(childNodes.getSize()); List<Exception> failures = new ArrayList<>(); () -> listener.onResponse(cancellableTask.taskInfo(nodeId, false))); if (canceled) { logger.trace("task {} doesn't have any children that should be cancelled", cancellableTask.getId()); logger.trace("task {} is already cancelled", cancellableTask.getId()); throw new IllegalStateException("task with id " + cancellableTask.getId() + " is already cancelled");
/** * Returns the list of currently running tasks on the node */ public Map<Long, Task> getTasks() { HashMap<Long, Task> taskHashMap = new HashMap<>(this.tasks); for (CancellableTaskHolder holder : cancellableTasks.values()) { taskHashMap.put(holder.getTask().getId(), holder.getTask()); } return Collections.unmodifiableMap(taskHashMap); }
private void processResponse() { banLock.onBanSet(); if (responses.decrementAndGet() == 0) { if (failures.isEmpty() == false) { IllegalStateException exception = new IllegalStateException("failed to cancel children of the task [" + cancellableTask.getId() + "]"); failures.forEach(exception::addSuppressed); listener.onFailure(exception); } else { listener.onResponse(cancellableTask.taskInfo(nodeId, false)); } } } });
@Override public void applyClusterState(ClusterChangedEvent event) { lastDiscoveryNodes = event.state().getNodes(); if (event.nodesRemoved()) { synchronized (banedParents) { lastDiscoveryNodes = event.state().getNodes(); // Remove all bans that were registered by nodes that are no longer in the cluster state Iterator<TaskId> banIterator = banedParents.keySet().iterator(); while (banIterator.hasNext()) { TaskId taskId = banIterator.next(); if (lastDiscoveryNodes.nodeExists(taskId.getNodeId()) == false) { logger.debug("Removing ban for the parent [{}] on the node [{}], reason: the parent node is gone", taskId, event.state().getNodes().getLocalNode()); banIterator.remove(); } } } // Cancel cancellable tasks for the nodes that are gone for (Map.Entry<Long, CancellableTaskHolder> taskEntry : cancellableTasks.entrySet()) { CancellableTaskHolder holder = taskEntry.getValue(); CancellableTask task = holder.getTask(); TaskId parentTaskId = task.getParentTaskId(); if (parentTaskId.isSet() && lastDiscoveryNodes.nodeExists(parentTaskId.getNodeId()) == false) { if (task.cancelOnParentLeaving()) { holder.cancel("Coordinating node [" + parentTaskId.getNodeId() + "] left the cluster"); } } } } }
/** * This method is called by the task manager when this task is cancelled. */ final void cancel(String reason) { assert reason != null; this.reason.compareAndSet(null, reason); onCancelled(); }
public boolean hasParent(TaskId parentTaskId) { return task.getParentTaskId().equals(parentTaskId); }
/** * Marks task as cancelled. * <p> * Returns true if cancellation was successful, false otherwise. */ public boolean cancel(String reason, Runnable listener) { final boolean cancelled; synchronized (this) { assert reason != null; if (cancellationReason == null) { cancellationReason = reason; cancellationListener = listener; cancelled = true; } else { // Already cancelled by somebody else cancelled = false; } } if (cancelled) { task.cancel(reason); } return cancelled; }
String nodeId = clusterService.localNode().getId(); final boolean canceled; if (cancellableTask.shouldCancelChildrenOnCancellation()) { DiscoveryNodes childNodes = clusterService.state().nodes(); final BanLock banLock = new BanLock(childNodes.getSize(), () -> removeBanOnNodes(cancellableTask, childNodes)); if (canceled) { logger.trace("cancelling task {} on child nodes", cancellableTask.getId()); AtomicInteger responses = new AtomicInteger(childNodes.getSize()); List<Exception> failures = new ArrayList<>(); () -> listener.onResponse(cancellableTask.taskInfo(nodeId, false))); if (canceled) { logger.trace("task {} doesn't have any children that should be cancelled", cancellableTask.getId()); logger.trace("task {} is already cancelled", cancellableTask.getId()); throw new IllegalStateException("task with id " + cancellableTask.getId() + " is already cancelled");
private void removeBanOnNodes(CancellableTask task, DiscoveryNodes nodes) { sendRemoveBanRequest(nodes, BanParentTaskRequest.createRemoveBanParentTaskRequest(new TaskId(clusterService.localNode().getId(), task.getId()))); }