On Mon, 15 Dec 2025 11:49:19 GMT, Jonas Norlinder <[email protected]> 
wrote:

> # Background
> 
> When Java applications uses APIs like java.io.FileOutputStream it will hook 
> into native implementations in e.g. io_util_md.c for Unix/Linux. Java does 
> not allow reading a directory and the implementation reflect this fact. For 
> Unix there are three access modes O_RDONLY, O_WRONLY, O_RDWR. Moreover, on 
> Unix it is possible to read a directory and an extra check has been added in 
> the code to ensure that the user is trying to read a file (with O_RDONLY) and 
> not a directory. This extra check results in an additional syscall.
> 
> This check is actually redundant in case user are using access mode O_WRONLY 
> or O_RDWR. If one is trying to call open on a directory with these modes the 
> specification in Unix and Linux specifies that EISDIR shall be returned. For 
> the case of Unix standard it has been part of the standard at least since 
> 1997 (https://pubs.opengroup.org/onlinepubs/007908799/xsh/open.html) and 
> Linux since at least 2004 (see v 2.0 
> https://www.kernel.org/pub/linux/docs/man-pages/Archive/ ) to return error if 
> user is trying to write to an directory. In OpenJDK we also include AIX and 
> they are certified to follow the Unix standard 
> (https://www.opengroup.org/openbrand/register/ibm.htm). I believe that it is 
> therefore safe to assume that this is a well implemented aspect of the Unix 
> standard by now and that this technical debt can be eliminated (assuming that 
> this check was indeed needed at some point).
> 
> # Performance Improvements
> 
> A stress-test that opens a huge amount of files to trigger a syscall storm 
> reveals that a removal of this redundant syscall may also improve performance 
> during high load:
> 
> 
> JDK 27 baseline
> Benchmark            Mode   Cnt     Score    Error   Units
> FileWriteStress.test sample 8438452 3722.451 ± 2.402 ns/op
> 
> JDK 27 patched
> Benchmark            Mode   Cnt     Score    Error   Units
> FileWriteStress.test sample 4952304 3191.912 ± 4.011 ns/op
> 
> 
> ~17% performance boost.

Thanks for the review Alan. Pushed fixes.

Here is a quick benchmark run with `RandomAccessFile` included.

# Baseline
Benchmark                                      Mode      Cnt        Score   
Error  Units
OpenFileStress.testFileOutputStream          sample  2471437     3812.476 ± 
3.962  ns/op
OpenFileStress.testRandomAccessFile          sample  2468304     3817.273 ± 
4.616  ns/op


# Patch
Benchmark                                      Mode      Cnt        Score   
Error  Units
OpenFileStress.testFileOutputStream          sample  1446195     3276.342 ± 
7.779  ns/op
OpenFileStress.testRandomAccessFile          sample  1710040     3315.482 ± 
6.024  ns/op


(In case anyone asks: The microbenchmark checks for Windows as per discussions 
with @cl4es where we concluded that if we can make the tests run on any 
platform that is preferable–even if it really has nothing to do with this 
particular improvement.)

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

PR Comment: https://git.openjdk.org/jdk/pull/28823#issuecomment-3711954521

Reply via email to