RFR: 8307536: FileAlreadyExistsException from NativeLibLoader when running concurrent applications with empty cache

Johan Vos jvos at openjdk.org
Tue Aug 1 07:02:55 UTC 2023


On Mon, 31 Jul 2023 16:52:00 GMT, Andy Goryachev <angorya at openjdk.org> wrote:

>> This PR adds a file lock to the cache directory, allowing access from multiple processes (that is, from more than one JVM) to that directory. 
>> 
>> This helps solving the issue where the cache is empty or doesn't exist yet, and two JavaFX applications start at the same time, and both try to copy the same native libraries to the same cache.
>> 
>> No tests have been added to the PR though, since this requires a complex scenario: building the SDK and publishing to local Maven repository, creating two simple JavaFX applications that use those artifacts, using a temporary folder for cache (via `javafx.cachedir`, and launching in parallel both applications.
>> 
>> I've tested successfully such scenario on Linux, Mac and Windows.
>
> modules/javafx.graphics/src/main/java/com/sun/glass/utils/NativeLibLoader.java line 311:
> 
>> 309:                  FileLock fileLock = fileChannel.lock()) {
>> 310:                 try {
>> 311:                     if (!Files.exists(path)) {
> 
> This code would fail if the target file exists but has a 0 length, or any length other that the actual resource length, or with the right length but wrong content.  
> Do we want to address these scenarios?

This is a different type of a problem, that imho should be addressed as well, but in a separate issue which also contains a test strategy. This is something that requires a hash-based solution, but it is something that needs to be done with great care, so I personally wouldn't rush this into this PR (as it might cause criticial regression if not done correctly).

-------------

PR Review Comment: https://git.openjdk.org/jfx/pull/1188#discussion_r1280187329


More information about the openjfx-dev mailing list