[ 
https://issues.apache.org/jira/browse/SPARK-60222?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

L. C. Hsieh updated SPARK-60222:
--------------------------------
    Affects Version/s: 4.3.0
                       4.4.0
                           (was: 5.0.0)

> Keep task completion listeners on the completing thread when another thread 
> invokes listeners
> ---------------------------------------------------------------------------------------------
>
>                 Key: SPARK-60222
>                 URL: https://issues.apache.org/jira/browse/SPARK-60222
>             Project: Spark
>          Issue Type: Bug
>          Components: Spark Core
>    Affects Versions: 4.3.0, 4.4.0
>            Reporter: L. C. Hsieh
>            Priority: Major
>
> TaskContextImpl runs task listeners on one thread at a time, tracked by 
> listenerInvocationThread. In two cases, the completion listeners do not run 
> on the thread that completes the task:
> 1. When another thread is invoking listeners as the task completes, 
> markTaskCompleted returns without running any completion listener. For 
> example, Task.kill calls markInterrupted on the kill thread, and if an 
> interrupt listener throws, markTaskFailed runs the failure listeners on that 
> thread. The completion listeners are then left until some other thread adds a 
> listener, or skipped entirely. The task can then reach 
> cleanUpAllAllocatedMemory while resources that the completion listeners would 
> release are still in use. The ErrorNotifier doc and a StreamingShuffleSuite 
> test describe this race.
> 2. When a listener throws, invokeListeners clears listenerInvocationThread 
> while markTaskFailed runs the failure listeners, and reclaims it afterwards. 
> Another thread that adds a listener in between can take over running the 
> pending listeners, possibly concurrently with this thread.
> Failure listeners that another thread queues while a thread runs the 
> completion listeners, and completion listeners queued while a thread runs 
> failure listeners after completion, are also dropped.
> This matters for helper threads that the completion listeners stop and wait 
> for, such as the pipelined Python UDF writer (SPARK-60113): if the helper 
> thread adds a listener lazily at such a moment, it ends up running the 
> listener that waits for itself.
> The proposed fix keeps the completion listeners on the completing thread: 
> markTaskCompleted waits for another thread invoking listeners and takes the 
> invocation over directly, failure listeners run inside the current invocation 
> when a listener throws, and a thread runs the listeners left to it before it 
> releases the invocation. This was first done in apache/spark#59332 and split 
> out of it during review.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to