diff --git a/src/flux/stores/task-queue.coffee b/src/flux/stores/task-queue.coffee index 826c06ad2..064458f78 100644 --- a/src/flux/stores/task-queue.coffee +++ b/src/flux/stores/task-queue.coffee @@ -247,7 +247,7 @@ class TaskQueue # Recursively notifies tasks of dependent errors _notifyOfDependentError: (failedTask, err) -> - downstream = @_tasksDependingOn(failedTask) ? [] + downstream = @_tasksToDequeueOnFailure(failedTask) ? [] Promise.map downstream, (downstreamTask) => return Promise.resolve(null) unless downstreamTask @@ -280,9 +280,11 @@ class TaskQueue otherTask.queueState.debugStatus = Task.DebugStatus.DequeuedObsolete @dequeue(otherTask) - _tasksDependingOn: (task) -> + _tasksToDequeueOnFailure: (failedTask) -> _.filter @_queue, (otherTask) -> - task isnt otherTask and otherTask.isDependentOnTask(task) + failedTask isnt otherTask and + otherTask.isDependentOnTask(failedTask) and + otherTask.shouldBeDequeuedOnDependencyFailure() _taskIsBlocked: (task) => _.any @_queue, (otherTask) -> diff --git a/src/flux/tasks/notify-plugins-of-send-task.es6 b/src/flux/tasks/notify-plugins-of-send-task.es6 index 6746bdd86..6d6612e0e 100644 --- a/src/flux/tasks/notify-plugins-of-send-task.es6 +++ b/src/flux/tasks/notify-plugins-of-send-task.es6 @@ -62,6 +62,10 @@ Any plugins you used in your sent message will not be available.` return (other instanceof SyncbackMetadataTask) && (other.clientId === this.messageClientId) } + shouldBeDequeuedOnDependencyFailure() { + return false + } + performLocal() { this.validateRequiredFields([ "messageId", diff --git a/src/flux/tasks/task.es6 b/src/flux/tasks/task.es6 index 4ae07e5fb..f201f6e93 100644 --- a/src/flux/tasks/task.es6 +++ b/src/flux/tasks/task.es6 @@ -513,6 +513,14 @@ export default class Task { return false; } + // Public: determines if the current task should be dequeued if one of the + // tasks it depends on fails. + // + // Returns `true` (should dequeue) or `false` (should not dequeue) + shouldBeDequeuedOnDependencyFailure() { + return true; + } + onDependentTaskError(other, error) { }