You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 8410194
Browse filesBrowse the repository at this point in the historyBrowse files
Fix ExecutionSequencer queue stall when delegate executor throws RejectedExecutionException.
When a delegate `Executor` throws a `RejectedExecutionException` during task execution or queue draining, `ExecutionSequencer` fails to catch the exception, leaving `taskFuture` and `newFuture` permanently uncompleted. As a result, the `ExecutionSequencer` queue permanently stalls, causing all subsequently submitted tasks to leak in memory.
This change handles exceptions thrown by delegate executors in both non-reentrant and reentrant queue draining paths, cancelling unexecuted task futures to allow downstream tasks to execute.
RELNOTES=`util.concurrent`: Fixed `ExecutionSequencer` queue stall when delegate executor throws `RejectedExecutionException`.
PiperOrigin-RevId: 962615495
Copy file name to clipboardExpand all lines: cycle_suppress_list.txt
+6Lines changed: 6 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -41,8 +41,14 @@ FIELD com.google.common.collect.TreeTraverser.PostOrderNode.childIterator
41
41
FIELD com.google.common.collect.TreeTraverser.PreOrderIterator.stack
42
42
FIELD com.google.common.util.concurrent.AbstractFuture.Listener.executor com.google.common.util.concurrent.MoreExecutors.rejectionPropagatingExecutor.$
43
43
FIELD com.google.common.util.concurrent.AbstractService.listeners
44
+
44
45
# NonReentrantExecutor is not exposed to this field
45
46
FIELD com.google.common.util.concurrent.ExecutionSequencer.ThreadConfinedTaskQueue.nextExecutor com.google.common.util.concurrent.ExecutionSequencer.TaskNonReentrantExecutor
47
+
48
+
# There is no way for a CombinedFutureInterruptibleTask to receive a TaskNonReentrantExecutor as its listenerExecutor:
49
+
# A TaskNonReentrantExecutor instance is used as an Executor only in a direct call to addListener.
50
+
FIELD com.google.common.util.concurrent.CombinedFuture.CombinedFutureInterruptibleTask.listenerExecutor com.google.common.util.concurrent.ExecutionSequencer.TaskNonReentrantExecutor
51
+
46
52
# Real cycle, but the runningState field is null'ed on completion of the future.
47
53
FIELD com.google.common.util.concurrent.AggregateFuture.runningState
48
54
FIELD java.util.AbstractMap.keySet com.google.common.collect.AbstractMapBasedMultimap.NavigableKeySet
0 commit comments