-
Notifications
You must be signed in to change notification settings - Fork 28.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[SPARK-51030][CORE][TESTS] Add a check before Utils.deleteRecursively(tempDir)
to ensure tempDir
won't be cleaned up by the ShutdownHook in afterEach
of LocalRootDirsTest
#49723
base: master
Are you sure you want to change the base?
Conversation
.github/workflows/build_and_test.yml
Outdated
@@ -1291,3 +1291,16 @@ jobs: | |||
cd ui-test | |||
npm install --save-dev | |||
node --experimental-vm-modules node_modules/.bin/jest | |||
maven-test: | |||
name: "Run Maven Test on macos" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you!
hasRootAsShutdownDeleteDir
check for tempDir
in the afterEach
of LocalRootDirsTest
.hasShutdownDeleteDir
check for tempDir
in the afterEach
of LocalRootDirsTest
.
hasShutdownDeleteDir
check for tempDir
in the afterEach
of LocalRootDirsTest
.tempDir
before manual cleanup in the afterEach
method of LocalRootDirsTest
@@ -46,7 +46,10 @@ trait LocalRootDirsTest extends SparkFunSuite with LocalSparkContext { | |||
|
|||
override def afterEach(): Unit = { | |||
try { | |||
Utils.deleteRecursively(tempDir) | |||
if (!ShutdownHookManager.hasShutdownDeleteDir(tempDir) && |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tempDir = Utils.createTempDir(namePrefix = "local") |
In the beforeEach
method, tempDir = Utils.createTempDir(namePrefix = "local")
invokes ShutdownHookManager.registerShutdownDeleteDir
to register tempDir
for deletion via a shutdown hook. Therefore, if tempDir
remains unchanged during the test case, manual cleanup is unnecessary.
However, given that tempDir
is defined as protected var tempDir
, it is possible for it to be altered within the test case. Hence, additional checks are implemented before manually cleaning up tempDir
:
tempDir
has not been registered for cleanup via a shutdown hook.tempDir
is not a subpath of any path that has been registered for cleanup via a shutdown hook.
This approach helps to minimize the risk of a race condition where multiple threads attempt to clean up the tempDir
concurrently. It seems that this issue is more prevalent on macOS, so let's conduct several more rounds of testing to ensure its effectiveness.
tempDir
before manual cleanup in the afterEach
method of LocalRootDirsTest
tempDir
to ensure that it won't be cleaned up by the ShutdownHook in the afterEach
of LocalRootDirsTest
tempDir
to ensure that it won't be cleaned up by the ShutdownHook in the afterEach
of LocalRootDirsTest
Utils.deleteRecursively(tempDir)
to ensure tempDir
won't be cleaned up by the ShutdownHook in the afterEach
of LocalRootDirsTest
Utils.deleteRecursively(tempDir)
to ensure tempDir
won't be cleaned up by the ShutdownHook in the afterEach
of LocalRootDirsTest
Utils.deleteRecursively(tempDir)
to ensure tempDir
won't be cleaned up by the ShutdownHook in afterEach
of LocalRootDirsTest
Utils.deleteRecursively(tempDir)
to ensure tempDir
won't be cleaned up by the ShutdownHook in afterEach
of LocalRootDirsTest
Utils.deleteRecursively(tempDir)
to ensure tempDir
won't be cleaned up by the ShutdownHook in afterEach
of LocalRootDirsTest
What changes were proposed in this pull request?
This pr add a check before
Utils.deleteRecursively(tempDir)
to ensuretempDir
won't be cleaned up by the ShutdownHook inafterEach
ofLocalRootDirsTest
to minimize the risk of test failures caused by race conditions in multi-threaded deletion of thetempdir
.Why are the changes needed?
In the daily tests on macOS, you may see test failures similar to the following:
This appears to be an issue caused by multi-threaded deletion of the
tempdir
.spark/core/src/test/scala/org/apache/spark/LocalRootDirsTest.scala
Line 42 in 42898c6
Refer to the code above, in
LocalRootDirsTest#beforeEach
method,tempDir = Utils.createTempDir(namePrefix = "local")
invokesShutdownHookManager.registerShutdownDeleteDir
to registertempDir
for deletion via a shutdown hook. Therefore, iftempDir
remains unchanged during the test case, manual cleanup is unnecessary inLocalRootDirsTest#afterEach
method.However, given that
tempDir
is defined asprotected var tempDir
, it is possible for it to be altered within the test case. Hence, additional checks are implemented before manually cleaning uptempDir
:tempDir
has not been registered for cleanup via a shutdown hook.tempDir
is not a subpath of any path that has been registered for cleanup via a shutdown hook.This approach helps to minimize the risk of a race condition where multiple threads attempt to clean up the
tempDir
concurrently.Does this PR introduce any user-facing change?
No
How was this patch tested?
Was this patch authored or co-authored using generative AI tooling?
No