> This PR provides a regression test for 
> [JDK-8325179](https://bugs.openjdk.org/browse/JDK-8325179): _Race in 
> BasicDirectoryModel.validateFileCache_ reviewed in #18111.
> 
> The test is inspired and based on `ConcurrentModification` that I wrote for 
> [JDK-8327137](https://bugs.openjdk.org/browse/JDK-8327137) / 
> [JDK-8323670](https://bugs.openjdk.org/browse/JDK-8323670).
> 
> **How the test works**
> 
> The test creates a temporary directory in the current directory and creates a 
> number of files in it. (The number of files is controlled by 
> `NUMBER_OF_THREADS` constant). Then the test creates `JFileChooser` in the 
> temporary directory.
> 
> The test starts several scanner threads, the number is controlled by 
> `NUMBER_OF_THREADS`, which repeatedly call 
> `fileChooser.rescanCurrentDirectory()`. This results in calling 
> `BasicDirectoryModel.validateFileCache` which starts a background thread — 
> "Basic L&F File Loading Thread" — to enumerate the files.
> 
> The test runner thread and scanner threads are synchronised with 
> `CyclicBarrier`, this ensures all the scanner threads start at the same time. 
> After a short delay, the runner thread takes a snapshot of live threads. 
> After a longer delay, the operation is repeated. See the `getThreadSnapshot` 
> method. (The number of snapshots is controlled by `SNAPSHOTS` constant.)
> 
> The number of File Loading Threads in each snapshot is counted. There should 
> be no more than two threads. It is possible that thread two such threads 
> after JDK-8325179 is fixed: the existing thread is interrupted but hasn't 
> exited yet, and a new thread is already created.
> 
> The test fails consistently without the fix for JDK-8325179. On Windows, the 
> output looks like this:
> 
> 
> Number of snapshots: 20
> Number of snapshots where number of loader threads:
>   = 1: 0
>   = 2: 0
>   > 2: 20
> java.lang.RuntimeException: Detected 20 snapshots with several loading threads
>         at LoaderThreadCount.runTest(LoaderThreadCount.java:132)
>         at LoaderThreadCount.wrapper(LoaderThreadCount.java:72)
>         at java.base/java.lang.Thread.run(Thread.java:1583)
> 
> 
> On Linux and macOS, there's more variation, for example I got the following 
> output on one of Linux systems:
> 
> 
> Number of snapshots: 15
> Number of snapshots where number of loader threads:
>   = 1: 7
>   = 2: 2
>   > 2: 6
> 
> 
> The test passes on the builds where JDK-8325179 is present.

Alexey Ivanov has updated the pull request incrementally with one additional 
commit since the last revision:

  Suppress throwing exceptions while deleting files

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/18957/files
  - new: https://git.openjdk.org/jdk/pull/18957/files/49723a37..16136976

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=18957&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=18957&range=00-01

  Stats: 15 lines in 1 file changed: 13 ins; 0 del; 2 mod
  Patch: https://git.openjdk.org/jdk/pull/18957.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/18957/head:pull/18957

PR: https://git.openjdk.org/jdk/pull/18957

Reply via email to