jpackage will exit with error if it failes to clean the temp directory

XMLWordPrintable

    • Type: Enhancement
    • Resolution: Unresolved
    • Priority: P4
    • 27
    • Affects Version/s: 25, 26, 27
    • Component/s: tools
    • None
    • generic
    • generic

      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

            Assignee:
            Alexey Semenyuk
            Reporter:
            Alexey Semenyuk
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated: