From d48aa310e6442ff7ed2909c7686496822cea5ab4 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Tue, 3 Apr 2018 16:02:52 +0100 Subject: [PATCH 1/2] Catch RejectedExecutionException in Execute#runKeep --- main/src/main/scala/sbt/EvaluateTask.scala | 7 +----- tasks/src/main/scala/sbt/Execute.scala | 29 +++++++++++----------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/main/src/main/scala/sbt/EvaluateTask.scala b/main/src/main/scala/sbt/EvaluateTask.scala index 558fe2daf..1d17f5cc3 100644 --- a/main/src/main/scala/sbt/EvaluateTask.scala +++ b/main/src/main/scala/sbt/EvaluateTask.scala @@ -11,7 +11,6 @@ import sbt.internal.{ Load, BuildStructure, TaskTimings, TaskName, GCUtil } import sbt.internal.util.{ Attributed, ErrorHandling, HList, RMap, Signals, Types } import sbt.util.{ Logger, Show } import sbt.librarymanagement.{ Resolver, UpdateReport } -import java.util.concurrent.RejectedExecutionException import scala.concurrent.duration.Duration import java.io.File @@ -388,11 +387,7 @@ object EvaluateTask { val results = x.runKeep(root)(service) storeValuesForPrevious(results, state, streams) applyResults(results, state, root) - } catch { - case _: RejectedExecutionException => - (state, Inc(Incomplete(None, message = Some("cancelled")))) - case inc: Incomplete => (state, Inc(inc)) - } finally shutdown() + } catch { case inc: Incomplete => (state, Inc(inc)) } finally shutdown() val replaced = transformInc(result) logIncResult(replaced, state, streams) (newState, replaced) diff --git a/tasks/src/main/scala/sbt/Execute.scala b/tasks/src/main/scala/sbt/Execute.scala index e3030cc00..f063080ca 100644 --- a/tasks/src/main/scala/sbt/Execute.scala +++ b/tasks/src/main/scala/sbt/Execute.scala @@ -78,22 +78,21 @@ private[sbt] final class Execute[A[_] <: AnyRef]( "State: " + state.toString + "\n\nResults: " + results + "\n\nCalls: " + callers + "\n\n" def run[T](root: A[T])(implicit strategy: Strategy): Result[T] = - try { - runKeep(root)(strategy)(root) - } catch { - case i: Incomplete => Inc(i) - case _: RejectedExecutionException => Inc(Incomplete(None, message = Some("cancelled"))) - } - def runKeep[T](root: A[T])(implicit strategy: Strategy): RMap[A, Result] = { - assert(state.isEmpty, "Execute already running/ran.") + try { runKeep(root)(strategy)(root) } catch { case i: Incomplete => Inc(i) } - addNew(root) - processAll() - assert(results contains root, "No result for root node.") - val finalResults = triggers.onComplete(results) - progressState = progress.allCompleted(progressState, finalResults) - finalResults - } + def runKeep[T](root: A[T])(implicit strategy: Strategy): RMap[A, Result] = + try { + assert(state.isEmpty, "Execute already running/ran.") + + addNew(root) + processAll() + assert(results contains root, "No result for root node.") + val finalResults = triggers.onComplete(results) + progressState = progress.allCompleted(progressState, finalResults) + finalResults + } catch { + case _: RejectedExecutionException => throw Incomplete(None, message = Some("cancelled")) + } def processAll()(implicit strategy: Strategy): Unit = { @tailrec def next(): Unit = { From b78a0f667be2c0d27d4f313aeacb98a53833d2cd Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Tue, 3 Apr 2018 16:05:56 +0100 Subject: [PATCH 2/2] Catch RejectedExecutionException in CompletionService.submit --- .../main/scala/sbt/CompletionService.scala | 7 ++++-- tasks/src/main/scala/sbt/Execute.scala | 23 ++++++++----------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/tasks/src/main/scala/sbt/CompletionService.scala b/tasks/src/main/scala/sbt/CompletionService.scala index f6fc3a957..88f00a5e8 100644 --- a/tasks/src/main/scala/sbt/CompletionService.scala +++ b/tasks/src/main/scala/sbt/CompletionService.scala @@ -17,7 +17,8 @@ import java.util.concurrent.{ CompletionService => JCompletionService, Executor, Executors, - ExecutorCompletionService + ExecutorCompletionService, + RejectedExecutionException, } object CompletionService { @@ -33,7 +34,9 @@ object CompletionService { def take() = completion.take().get() } def submit[T](work: () => T, completion: JCompletionService[T]): () => T = { - val future = completion.submit { new Callable[T] { def call = work() } } + val future = try completion.submit { new Callable[T] { def call = work() } } catch { + case _: RejectedExecutionException => throw Incomplete(None, message = Some("cancelled")) + } () => future.get() } diff --git a/tasks/src/main/scala/sbt/Execute.scala b/tasks/src/main/scala/sbt/Execute.scala index f063080ca..c5d16288e 100644 --- a/tasks/src/main/scala/sbt/Execute.scala +++ b/tasks/src/main/scala/sbt/Execute.scala @@ -7,8 +7,6 @@ package sbt -import java.util.concurrent.RejectedExecutionException - import sbt.internal.util.ErrorHandling.wideConvert import sbt.internal.util.{ DelegatingPMap, IDSet, PMap, RMap, ~> } import sbt.internal.util.Types._ @@ -80,19 +78,16 @@ private[sbt] final class Execute[A[_] <: AnyRef]( def run[T](root: A[T])(implicit strategy: Strategy): Result[T] = try { runKeep(root)(strategy)(root) } catch { case i: Incomplete => Inc(i) } - def runKeep[T](root: A[T])(implicit strategy: Strategy): RMap[A, Result] = - try { - assert(state.isEmpty, "Execute already running/ran.") + def runKeep[T](root: A[T])(implicit strategy: Strategy): RMap[A, Result] = { + assert(state.isEmpty, "Execute already running/ran.") - addNew(root) - processAll() - assert(results contains root, "No result for root node.") - val finalResults = triggers.onComplete(results) - progressState = progress.allCompleted(progressState, finalResults) - finalResults - } catch { - case _: RejectedExecutionException => throw Incomplete(None, message = Some("cancelled")) - } + addNew(root) + processAll() + assert(results contains root, "No result for root node.") + val finalResults = triggers.onComplete(results) + progressState = progress.allCompleted(progressState, finalResults) + finalResults + } def processAll()(implicit strategy: Strategy): Unit = { @tailrec def next(): Unit = {