[crac] RFR: Improved open file descriptors tracking [v4]

Anton Kozlov akozlov at openjdk.org
Wed Mar 15 14:16:15 UTC 2023


On Thu, 16 Feb 2023 11:18:34 GMT, Radim Vansa <duke at openjdk.org> wrote:

>> Tracks `java.io.FileDescriptor` instances as CRaC resource; before checkpoint these are reported and if not allow-listed (e.g. as opened as standard descriptors) an exception is thrown. Further investigation can use system property `jdk.crac.collect-fd-stacktraces=true` to record origin of those file descriptors.
>> File descriptors claimed in Java code are passed to native; native code checks all open file descriptors and reports error if there's an unexpected FD that is not included in the list passed previously.
>
> Radim Vansa has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 16 additional commits since the last revision:
> 
>  - Merge remote-tracking branch 'origin/crac' into newfd
>  - Use descriptor access rather than extending API
>  - 8272472: StackGuardPages test doesn't build with glibc 2.34
>    
>    Backport-of: f77a1a156f3da9068d012d9227c7ee0fee58f571
>  - Empty commit to trigger GHA
>  - Drop native FDs tracking
>  - Avoid claiming invalid FileDescriptor
>  - Whitelist RandomAccessFile opening classpath files
>    
>    This is a workaround for some frameworks opening classpath files in
>    a non-standard way.
>  - Add tracking of FD origin
>  - Track FileDescriptors closed by NIO
>  - Track native FDs from EPoll
>  - ... and 6 more: https://git.openjdk.org/crac/compare/b3868d62...9b5e7edd

src/java.base/share/classes/java/io/FileDescriptor.java line 370:

> 368:             JDKContext ctx = jdk.internal.crac.Core.getJDKContext();
> 369:             if (ctx.claimFdWeak(this, this)) {
> 370:                 throw new CheckpointOpenFileException("FileDescriptor " + this.fd + " left open. " + JDKContext.COLLECT_FD_STACKTRACES_HINT, resource.stackTraceHolder);

The hint is apparently printed even if that is enabled. Maybe let CheckpointOpenResource decide about the hint? Or have a centralized message formatter somewhere else.

src/java.base/share/classes/jdk/crac/Core.java line 138:

> 136:             fdArr[i] = claimedPairs.get(i).getKey();
> 137:             objArr[i] = claimedPairs.get(i).getValue();
> 138:             System.out.printf("%d %s\n", fdArr[i], objArr[i]);

Left-over from a debugging apparently

src/java.base/unix/classes/sun/nio/ch/FileDispatcherImpl.java line 252:

> 250:         throws IOException;
> 251: 
> 252:     static native void close0(FileDescriptor fd) throws IOException;

Maybe make it private? To prevent uses without `markClosed`.

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

PR: https://git.openjdk.org/crac/pull/43


More information about the crac-dev mailing list