Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[SPARK-40235][CORE] Use interruptible lock instead of synchronized in…
… Executor.updateDependencies() ### 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 a `Thread.interrupt()` to the canceled task, the task will continue waiting because threads blocked on a `synchronized` won'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 `synchronized` with a `ReentrantLock`, which has a `lockInterruptibly` method. ### 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. Closes #37681 from JoshRosen/SPARK-40235-update-dependencies-lock. Authored-by: Josh Rosen <[email protected]> Signed-off-by: Josh Rosen <[email protected]>
- Loading branch information