Running tests for JDK-8374219 AsyncTest test keeps failing sporadically with the following errors:
---
java.io.UncheckedIOException: java.nio.file.FileSystemException: jtreg_open_test_jdk_tools_jpackage\tmp\jdk.jpackage4236893185129326440\msi\Foo-1.0.msi: The process cannot access the file because it is being used by another process
at jdk.jpackage/jdk.jpackage.internal.DefaultBundlingEnvironment.createBundle(DefaultBundlingEnvironment.java:222)
at jdk.jpackage/jdk.jpackage.internal.WinBundlingEnvironment.createBundle(WinBundlingEnvironment.java:35)
at jdk.jpackage/jdk.jpackage.internal.cli.OptionsProcessor.runBundling(OptionsProcessor.java:227)
at java.base/java.util.Optional.map(Optional.java:264)
at jdk.jpackage/jdk.jpackage.internal.util.Result.map(Result.java:63)
at jdk.jpackage/jdk.jpackage.internal.cli.Main.lambda$run$3(Main.java:177)
at jdk.jpackage/jdk.jpackage.internal.cli.Main$Runner.runIt(Main.java:290)
at jdk.jpackage/jdk.jpackage.internal.cli.Main$Runner.run(Main.java:279)
at jdk.jpackage/jdk.jpackage.internal.cli.Main.run(Main.java:148)
at jdk.jpackage/jdk.jpackage.internal.cli.Main$Provider.run(Main.java:76)
at AsyncTest$Workload$1.run(AsyncTest.java:194)
at java.base/java.util.spi.ToolProvider.run(ToolProvider.java:160)
at jdk.jpackage/jdk.jpackage.internal.util.CommandOutputControl.execute(CommandOutputControl.java:1165)
at jdk.jpackage/jdk.jpackage.internal.util.CommandOutputControl$ToolProviderExecutable.execute(CommandOutputControl.java:1831)
at jdk.jpackage.test.Executor.execute(Executor.java:493)
at jdk.jpackage.test.Executor.runToolProvider(Executor.java:485)
at jdk.jpackage.test.Executor.lambda$executeWithoutExitCodeCheck$0(Executor.java:312)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingSupplier.lambda$toSupplier$0(ThrowingSupplier.java:37)
at jdk.jpackage.test.Executor.executeWithoutExitCodeCheck(Executor.java:320)
at jdk.jpackage.test.Executor.execute(Executor.java:324)
at jdk.jpackage.test.JPackageCommand.execute(JPackageCommand.java:1011)
at jdk.jpackage.test.JPackageCommand.execute(JPackageCommand.java:958)
at jdk.jpackage.test.PackageTest$Handler.processAction(PackageTest.java:729)
at jdk.jpackage.test.PackageTest$PackageTypePipeline.accept(PackageTest.java:579)
at jdk.jpackage.test.PackageTest$PackageTypePipeline.accept(PackageTest.java:512)
at java.base/java.util.ImmutableCollections$List12.forEach(ImmutableCollections.java:691)
at jdk.jpackage.test.PackageTest.lambda$runActions$1(PackageTest.java:486)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1612)
at jdk.jpackage.test.PackageTest.lambda$runActions$0(PackageTest.java:485)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at jdk.jpackage.test.PackageTest.runActions(PackageTest.java:484)
at jdk.jpackage.test.RunnablePackageTest.run(RunnablePackageTest.java:58)
at AsyncTest$AsyncInnerTest.testNativeBundle(AsyncTest.java:126)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at jdk.jpackage.test.MethodCall.accept(MethodCall.java:111)
at jdk.jpackage.test.TestInstance.run(TestInstance.java:239)
at jdk.jpackage.test.TKit.lambda$ignoreExceptions$0(TKit.java:233)
at jdk.jpackage.test.TKit.lambda$runTests$2(TKit.java:188)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.lambda$runTests$1(TKit.java:183)
at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:803)
at jdk.jpackage.test.TKit.lambda$runTests$0(TKit.java:182)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.withExtraLogStream(TKit.java:123)
at jdk.jpackage.test.TKit.withExtraLogStream(TKit.java:117)
at jdk.jpackage.test.TKit.runTests(TKit.java:181)
at jdk.jpackage.test.TKit.runTests(TKit.java:171)
at jdk.jpackage.test.Main.runTests(Main.java:122)
at jdk.jpackage.test.Main.lambda$main$5(Main.java:118)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.withExtraLogStream(TKit.java:123)
at jdk.jpackage.test.TKit.withExtraLogStream(TKit.java:117)
at jdk.jpackage.test.Main.main(Main.java:118)
at jdk.jpackage.test.Main.main(Main.java:46)
at AsyncTest.lambda$test$1(AsyncTest.java:88)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.withMainLogStream(TKit.java:129)
at AsyncTest$Workload.lambda$call$0(AsyncTest.java:208)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.withStackTraceStream(TKit.java:135)
at AsyncTest$Workload.call(AsyncTest.java:207)
at AsyncTest$Workload.call(AsyncTest.java:156)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:330)
at java.base/java.util.concurrent.ThreadPerTaskExecutor$ThreadBoundFuture.run(ThreadPerTaskExecutor.java:323)
at java.base/java.lang.VirtualThread.run(VirtualThread.java:471)
Caused by: java.nio.file.FileSystemException: jtreg_open_test_jdk_tools_jpackage\tmp\jdk.jpackage4236893185129326440\msi\Foo-1.0.msi: The process cannot access the file because it is being used by another process
at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:104)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:109)
at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:270)
at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:105)
at java.base/java.nio.file.Files.delete(Files.java:1056)
at jdk.jpackage/jdk.jpackage.internal.util.FileUtils$RecursiveDeleter.runActionOnPath(FileUtils.java:174)
at jdk.jpackage/jdk.jpackage.internal.util.FileUtils$RecursiveDeleter.visitFile(FileUtils.java:148)
at jdk.jpackage/jdk.jpackage.internal.util.FileUtils$RecursiveDeleter.visitFile(FileUtils.java:142)
at java.base/java.nio.file.Files.walkFileTree(Files.java:2547)
at java.base/java.nio.file.Files.walkFileTree(Files.java:2613)
at jdk.jpackage/jdk.jpackage.internal.util.FileUtils.deleteRecursive(FileUtils.java:51)
at jdk.jpackage/jdk.jpackage.internal.TempDirectory.close(TempDirectory.java:65)
at jdk.jpackage/jdk.jpackage.internal.DefaultBundlingEnvironment.createBundle(DefaultBundlingEnvironment.java:221)
... 71 more
---
The error occurs when jpackage attempts to delete the contents of the temporary directory at [1]. It appears in the "exe" packaging when it creates an msi file in the temporary directory and embeds it in the resources of the exe installer. Then, at exit, jpackage tries to delete the temporary msi file. Sometimes the file appears locked (by antivirus?), and the clean-up fails.
The clean-up failure should not cause the jpackage to exit with an error. It should issue a warning and exit with "0" exit code as long as it has successfully created the output package. It should retry the cleanup a few times.
[1] https://github.com/openjdk/jdk/blob/ecb42341a94326b1ee85ddd7b9ebadce8c952b99/src/jdk.jpackage/share/classes/jdk/jpackage/internal/TempDirectory.java#L65
---
java.io.UncheckedIOException: java.nio.file.FileSystemException: jtreg_open_test_jdk_tools_jpackage\tmp\jdk.jpackage4236893185129326440\msi\Foo-1.0.msi: The process cannot access the file because it is being used by another process
at jdk.jpackage/jdk.jpackage.internal.DefaultBundlingEnvironment.createBundle(DefaultBundlingEnvironment.java:222)
at jdk.jpackage/jdk.jpackage.internal.WinBundlingEnvironment.createBundle(WinBundlingEnvironment.java:35)
at jdk.jpackage/jdk.jpackage.internal.cli.OptionsProcessor.runBundling(OptionsProcessor.java:227)
at java.base/java.util.Optional.map(Optional.java:264)
at jdk.jpackage/jdk.jpackage.internal.util.Result.map(Result.java:63)
at jdk.jpackage/jdk.jpackage.internal.cli.Main.lambda$run$3(Main.java:177)
at jdk.jpackage/jdk.jpackage.internal.cli.Main$Runner.runIt(Main.java:290)
at jdk.jpackage/jdk.jpackage.internal.cli.Main$Runner.run(Main.java:279)
at jdk.jpackage/jdk.jpackage.internal.cli.Main.run(Main.java:148)
at jdk.jpackage/jdk.jpackage.internal.cli.Main$Provider.run(Main.java:76)
at AsyncTest$Workload$1.run(AsyncTest.java:194)
at java.base/java.util.spi.ToolProvider.run(ToolProvider.java:160)
at jdk.jpackage/jdk.jpackage.internal.util.CommandOutputControl.execute(CommandOutputControl.java:1165)
at jdk.jpackage/jdk.jpackage.internal.util.CommandOutputControl$ToolProviderExecutable.execute(CommandOutputControl.java:1831)
at jdk.jpackage.test.Executor.execute(Executor.java:493)
at jdk.jpackage.test.Executor.runToolProvider(Executor.java:485)
at jdk.jpackage.test.Executor.lambda$executeWithoutExitCodeCheck$0(Executor.java:312)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingSupplier.lambda$toSupplier$0(ThrowingSupplier.java:37)
at jdk.jpackage.test.Executor.executeWithoutExitCodeCheck(Executor.java:320)
at jdk.jpackage.test.Executor.execute(Executor.java:324)
at jdk.jpackage.test.JPackageCommand.execute(JPackageCommand.java:1011)
at jdk.jpackage.test.JPackageCommand.execute(JPackageCommand.java:958)
at jdk.jpackage.test.PackageTest$Handler.processAction(PackageTest.java:729)
at jdk.jpackage.test.PackageTest$PackageTypePipeline.accept(PackageTest.java:579)
at jdk.jpackage.test.PackageTest$PackageTypePipeline.accept(PackageTest.java:512)
at java.base/java.util.ImmutableCollections$List12.forEach(ImmutableCollections.java:691)
at jdk.jpackage.test.PackageTest.lambda$runActions$1(PackageTest.java:486)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1612)
at jdk.jpackage.test.PackageTest.lambda$runActions$0(PackageTest.java:485)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at jdk.jpackage.test.PackageTest.runActions(PackageTest.java:484)
at jdk.jpackage.test.RunnablePackageTest.run(RunnablePackageTest.java:58)
at AsyncTest$AsyncInnerTest.testNativeBundle(AsyncTest.java:126)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at jdk.jpackage.test.MethodCall.accept(MethodCall.java:111)
at jdk.jpackage.test.TestInstance.run(TestInstance.java:239)
at jdk.jpackage.test.TKit.lambda$ignoreExceptions$0(TKit.java:233)
at jdk.jpackage.test.TKit.lambda$runTests$2(TKit.java:188)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.lambda$runTests$1(TKit.java:183)
at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:803)
at jdk.jpackage.test.TKit.lambda$runTests$0(TKit.java:182)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.withExtraLogStream(TKit.java:123)
at jdk.jpackage.test.TKit.withExtraLogStream(TKit.java:117)
at jdk.jpackage.test.TKit.runTests(TKit.java:181)
at jdk.jpackage.test.TKit.runTests(TKit.java:171)
at jdk.jpackage.test.Main.runTests(Main.java:122)
at jdk.jpackage.test.Main.lambda$main$5(Main.java:118)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.withExtraLogStream(TKit.java:123)
at jdk.jpackage.test.TKit.withExtraLogStream(TKit.java:117)
at jdk.jpackage.test.Main.main(Main.java:118)
at jdk.jpackage.test.Main.main(Main.java:46)
at AsyncTest.lambda$test$1(AsyncTest.java:88)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.withMainLogStream(TKit.java:129)
at AsyncTest$Workload.lambda$call$0(AsyncTest.java:208)
at jdk.jpackage/jdk.jpackage.internal.util.function.ThrowingRunnable.lambda$toRunnable$0(ThrowingRunnable.java:35)
at jdk.jpackage.test.TKit.withNewState(TKit.java:158)
at jdk.jpackage.test.TKit.withStackTraceStream(TKit.java:135)
at AsyncTest$Workload.call(AsyncTest.java:207)
at AsyncTest$Workload.call(AsyncTest.java:156)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:330)
at java.base/java.util.concurrent.ThreadPerTaskExecutor$ThreadBoundFuture.run(ThreadPerTaskExecutor.java:323)
at java.base/java.lang.VirtualThread.run(VirtualThread.java:471)
Caused by: java.nio.file.FileSystemException: jtreg_open_test_jdk_tools_jpackage\tmp\jdk.jpackage4236893185129326440\msi\Foo-1.0.msi: The process cannot access the file because it is being used by another process
at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:104)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:109)
at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:270)
at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:105)
at java.base/java.nio.file.Files.delete(Files.java:1056)
at jdk.jpackage/jdk.jpackage.internal.util.FileUtils$RecursiveDeleter.runActionOnPath(FileUtils.java:174)
at jdk.jpackage/jdk.jpackage.internal.util.FileUtils$RecursiveDeleter.visitFile(FileUtils.java:148)
at jdk.jpackage/jdk.jpackage.internal.util.FileUtils$RecursiveDeleter.visitFile(FileUtils.java:142)
at java.base/java.nio.file.Files.walkFileTree(Files.java:2547)
at java.base/java.nio.file.Files.walkFileTree(Files.java:2613)
at jdk.jpackage/jdk.jpackage.internal.util.FileUtils.deleteRecursive(FileUtils.java:51)
at jdk.jpackage/jdk.jpackage.internal.TempDirectory.close(TempDirectory.java:65)
at jdk.jpackage/jdk.jpackage.internal.DefaultBundlingEnvironment.createBundle(DefaultBundlingEnvironment.java:221)
... 71 more
---
The error occurs when jpackage attempts to delete the contents of the temporary directory at [1]. It appears in the "exe" packaging when it creates an msi file in the temporary directory and embeds it in the resources of the exe installer. Then, at exit, jpackage tries to delete the temporary msi file. Sometimes the file appears locked (by antivirus?), and the clean-up fails.
The clean-up failure should not cause the jpackage to exit with an error. It should issue a warning and exit with "0" exit code as long as it has successfully created the output package. It should retry the cleanup a few times.
[1] https://github.com/openjdk/jdk/blob/ecb42341a94326b1ee85ddd7b9ebadce8c952b99/src/jdk.jpackage/share/classes/jdk/jpackage/internal/TempDirectory.java#L65