Uh oh!
There was an error while loading. Please reload this page.
[SPARK-40235][CORE] Use interruptible lock instead of synchronized in Executor.updateDependencies() - #37681
Conversation
Uh oh!
There was an error while loading. Please reload this page.
JoshRosen
commented
Aug 29, 2022
Good catch: I agree that we should fix this for I'd like to do that in a separate followup PR, though, since I'm still thinking through some details of how/if I want to test that other change. Filed https://issues.apache.org/jira/browse/SPARK-40263 for that followup. I skimmed through other uses of I'm going to merge this to master and will aim to get a followup PR open soon. |
What changes were proposed in this pull request?
This patch modifies the synchronization in
Executor.updateDependencies()in order to allow tasks to be interrupted while they are blocked and waiting on other tasks to finish downloading dependencies.This synchronization was added years ago in mesos/spark@7b9e96c in order to prevent concurrently-launching tasks from performing concurrent dependency updates. If one task is downloading dependencies, all other newly-launched tasks will block until the original dependency download is complete.
Let's say that a Spark task launches, becomes blocked on a
updateDependencies()call, then is cancelled while it is blocked. Although Spark will send aThread.interrupt()to the canceled task, the task will continue waiting because threads blocked on asynchronizedwon't throw an InterruptedException in response to the interrupt. As a result, the blocked thread will continue to wait until the other thread exits the synchronized block.This PR aims to fix this problem by replacing the
synchronizedwith aReentrantLock, which has alockInterruptiblymethod.Why are the changes needed?
In a real-world scenario, we hit a case where a task was canceled right after being launched while another task was blocked in a slow library download. The slow library download took so long that the TaskReaper killed the executor because the canceled task could not exit in a timely fashion. This patch's fix prevents this issue.
Does this PR introduce any user-facing change?
No.
How was this patch tested?
New unit test case.