QuiltMC / quilt-installer

The Quilt installer for the official Minecraft launcher and servers
Apache License 2.0
40 stars 20 forks source link

Remove duplicate libraries #41

Open zpin opened 1 year ago

zpin commented 1 year ago

The current method of replacing "org.quiltmc:hashed" with "net.fabricmc:intermediary" will result in duplicate entries for "net.fabricmc:intermediary" if the JSON already contains such an entry. These libraries then get downloaded in parallel, resulting in an "AccessDeniedException" (tested on Windows Server 2019) because the two processes will attempt to write to the same file simultaneously:

Downloading library at: https://maven.fabricmc.net/net/fabricmc/intermediary/1.20.1/intermediary-1.20.1.jar
Downloading library at: https://maven.fabricmc.net/net/fabricmc/intermediary/1.20.1/intermediary-1.20.1.jar
java.util.concurrent.CompletionException: java.io.UncheckedIOException: java.nio.file.AccessDeniedException: .\libraries\net\fabricmc\intermediary\1.20.1\intermediary-1.20.1.jar
        at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
        at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
        at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)
        at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Caused by: java.io.UncheckedIOException: java.nio.file.AccessDeniedException: .\libraries\net\fabricmc\intermediary\1.20.1\intermediary-1.20.1.jar
        at org.quiltmc.installer.action.InstallServer.lambda$downloadLibrary$8(InstallServer.java:272)
        ... 7 more
Caused by: java.nio.file.AccessDeniedException: .\libraries\net\fabricmc\intermediary\1.20.1\intermediary-1.20.1.jar
        at java.base/sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
        at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(Unknown Source)
        at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(Unknown Source)
        at java.base/java.nio.file.Files.newOutputStream(Unknown Source)
        at java.base/java.nio.file.Files.copy(Unknown Source)
        at org.quiltmc.installer.action.InstallServer.lambda$downloadLibrary$8(InstallServer.java:267)
        ... 7 more

The suggested change removes duplicate entries from the library list, which solves the issue on my test system.

zpin commented 1 year ago

Thank you for the quick reply! That does sound better, yeah. I'd suggest incorporating this change until the version-specific workaround is in place. This way, it will work for all versions in the meantime.