Skip to content

Gradle user home clean-up fails due to Windows holding on to native-platform dlls #714

@alllex

Description

@alllex

This happens both inside the production code and in the integration test clean-up logic, resulting in failing CI jobs.


On Windows, the org.gradle.profiler.ProfilerIntegrationTest.clean Gradle user home cache when configured test fails, because the build mutator can't clean the gradle-user-home used for the benchmark:

org.gradle.profiler.Main$ScenarioFailedException: java.io.UncheckedIOException: Failed to delete 'C:\tcagent1\work\7b79572c01edd19a\build\tmp\test-files\ProfilerInt.Test\ygdic\project\gradle-user-home\native'
  at app//org.gradle.profiler.Main.run(Main.java:131)
  at app//org.gradle.profiler.ProfilerIntegrationTest.benchmarkScenario(ProfilerIntegrationTest.groovy:1611)
  at app//org.gradle.profiler.ProfilerIntegrationTest.benchmarkScenario(ProfilerIntegrationTest.groovy:1599)
  at org.gradle.profiler.ProfilerIntegrationTest.clean Gradle user home cache when configured(ProfilerIntegrationTest.groovy:1419)
Caused by: java.io.UncheckedIOException: Failed to delete 'C:\tcagent1\work\7b79572c01edd19a\build\tmp\test-files\ProfilerInt.Test\ygdic\project\gradle-user-home\native'
  at org.gradle.profiler.mutations.AbstractScheduledMutator.deleteFileOrDirectory(AbstractScheduledMutator.java:58)
  at org.gradle.profiler.mutations.ClearDirectoryMutator.lambda$executeOnSchedule$1(ClearDirectoryMutator.java:44)
  at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
  at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
  at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
  at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
  at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
  at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
  at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
  at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
  at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
  at org.gradle.profiler.mutations.ClearDirectoryMutator.executeOnSchedule(ClearDirectoryMutator.java:44)
  at org.gradle.profiler.mutations.AbstractScheduledMutator.beforeBuild(AbstractScheduledMutator.java:32)
  at org.gradle.profiler.RunBuildStepAction.run(RunBuildStepAction.java:26)
  at org.gradle.profiler.ScenarioInvoker.runMeasured(ScenarioInvoker.java:28)
  at org.gradle.profiler.gradle.GradleScenarioInvoker.run(GradleScenarioInvoker.java:123)
  at org.gradle.profiler.gradle.GradleScenarioInvoker.run(GradleScenarioInvoker.java:23)
  at org.gradle.profiler.Main.invoke(Main.java:158)
  at org.gradle.profiler.Main.run(Main.java:109)
  ... 3 more
Caused by: java.io.IOException: Cannot delete file: C:\tcagent1\work\7b79572c01edd19a\build\tmp\test-files\ProfilerInt.Test\ygdic\project\gradle-user-home\native
  at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:1390)
  at org.gradle.profiler.mutations.AbstractScheduledMutator.deleteFileOrDirectory(AbstractScheduledMutator.java:55)
  ... 22 more
Caused by: java.nio.file.AccessDeniedException: C:\tcagent1\work\7b79572c01edd19a\build\tmp\test-files\ProfilerInt.Test\ygdic\project\gradle-user-home\native\1def1411415f61bf3af743bc5b6707747c0891f09f0c88961ee8f79bc544acac\windows-amd64\native-platform.dll
  at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:89)
  at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
  at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
  at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:275)
  at java.base/sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:110)
  at java.base/java.nio.file.Files.deleteIfExists(Files.java:1191)
  at org.apache.commons.io.file.DeletingPathVisitor.visitFile(DeletingPathVisitor.java:159)
  at org.apache.commons.io.file.DeletingPathVisitor.visitFile(DeletingPathVisitor.java:37)
  at java.base/java.nio.file.Files.walkFileTree(Files.java:2811)
  at java.base/java.nio.file.Files.walkFileTree(Files.java:2882)
  at org.apache.commons.io.file.PathUtils.visitFileTree(PathUtils.java:1730)
  at org.apache.commons.io.file.PathUtils.deleteDirectory(PathUtils.java:518)
  at org.apache.commons.io.file.PathUtils.delete(PathUtils.java:477)
  at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:1386)
  ... 23 more

Similarly, many tests that allocate a custom gradle-user-home under the test directory fail to clean it up after the test:

java.lang.IllegalStateException: Couldn't delete test dir for `does Git checkout when asked(org.gradle.profiler.ProfilerIntegrationTest)` (test is holding files open).
  at org.gradle.profiler.fixtures.file.TestNameTestDirectoryProvider$TestDirectoryCleaningStatement.cleanup(TestNameTestDirectoryProvider.java:113)
  at org.gradle.profiler.fixtures.file.TestNameTestDirectoryProvider$TestDirectoryCleaningStatement.evaluate(TestNameTestDirectoryProvider.java:120)
  at org.spockframework.junit4.AbstractRuleInterceptor.evaluateStatement(AbstractRuleInterceptor.java:66)
  at org.spockframework.junit4.TestRuleInterceptor.intercept(TestRuleInterceptor.java:43)
  at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
  at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
  at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
  at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
  at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
  at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
  at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
  at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
  at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
  at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
  at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
  at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
  at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
  at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
  at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
  at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
  at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
  at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
  at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
  at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
  at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
  at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
  at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
  at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
  at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124)
  at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99)
  at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94)
  at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63)
  at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
  at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
  at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
  at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92)
  at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200)
  at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132)
  at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103)
  at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63)
  at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
  at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
  at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72)
  at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
  at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
Caused by: java.lang.RuntimeException: Could not delete 'C:\tcagent1\work\7b79572c01edd19a\build\tmp\test-files\ProfilerInt.Test\e94md\project\repo\gradle-user-home\native\1def1411415f61bf3af743bc5b6707747c0891f09f0c88961ee8f79bc544acac\windows-amd64\native-platform.dll'
  at org.gradle.profiler.fixtures.file.TestFile.forceDeleteDir(TestFile.java:189)
  at org.gradle.profiler.fixtures.file.TestFile.forceDeleteDir(TestFile.java:182)
  at org.gradle.profiler.fixtures.file.TestFile.forceDeleteDir(TestFile.java:182)
  at org.gradle.profiler.fixtures.file.TestFile.forceDeleteDir(TestFile.java:182)
  at org.gradle.profiler.fixtures.file.TestFile.forceDeleteDir(TestFile.java:182)
  at org.gradle.profiler.fixtures.file.TestFile.forceDeleteDir(TestFile.java:182)
  at org.gradle.profiler.fixtures.file.TestFile.forceDeleteDir(TestFile.java:182)
  at org.gradle.profiler.fixtures.file.TestFile.forceDeleteDir(TestFile.java:182)
  at org.gradle.profiler.fixtures.file.TestNameTestDirectoryProvider.lambda$cleanup$0(TestNameTestDirectoryProvider.java:68)
  at org.gradle.profiler.fixtures.util.RetryUtil.poll(RetryUtil.groovy:24)
  at org.gradle.profiler.fixtures.file.TestNameTestDirectoryProvider.cleanup(TestNameTestDirectoryProvider.java:68)
  at org.gradle.profiler.fixtures.file.TestNameTestDirectoryProvider$TestDirectoryCleaningStatement.cleanup(TestNameTestDirectoryProvider.java:111)
  ... 57 more

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions