Inquiry: Handling Unix sockets created by glibc/NSS during checkpoint

Radim Vansa rvansa at azul.com
Mon Sep 15 15:12:08 UTC 2025


Hi Ma Zhen,

we are aware of similar issue where an application has 
`/var/cache/nscd/passwd` mapped despite not having the priviledge to 
open() this file - the application can receive a file descriptor through 
a socket and then is able to mmap it. Another case are files under 
`/var/lib/sss/mc/` opened by getpwuid_r, getpwname_r, getgrgid_r, 
getgrname_r or similar functions.

You're right that File Descriptor Policies cannot be applied here, these 
work on a Java level (the FD must have an associated Java object).

There is a VM option `-XX:CRaCAllowedOpenFilePrefixes` that lets the 
checkpoint to proceed if a file from this path is opened; in most cases 
CRIU can reopen a regular file without issues (and it should be able to 
handle sockets as well). I have not tested if the path matching works 
with sockets, but shouldn't be too difficult to fix up for Unix sockets.

Besides this there's no Resource-handling on native level (you cannot 
register a native hook), though it might be possible to find an open FD 
and close it from Java - I wouldn't recommend such hacky way.

To be honest on systems where we've encountered this issue we rather 
disabled NSCD service completely. If you can't control the environment, 
you can run the application in a container that won't be configured with 
these services.

Cheers,

Radim

On 9/15/25 11:29, ma zhen wrote:
>
> Hi CRaC developers,
>
> I am currently working on adapting a Java application to support CRaC. 
> I've encountered a specific challenge related to a Unix socket that is 
> preventing successful checkpoint creation.
>
> During the checkpoint process, I consistently receive a 
> CheckpointOpenSocketException for a specific file descriptor, which 
> lsof identifies as a Unix socket.
>
> I have conducted a detailed investigation to trace the origin of this 
> socket and found that it is not created directly by my Java 
> application code. Instead, it is created by the underlying glibc 
> library as part of the Name Service Switch (NSS) framework. The call 
> stack, captured using BCC, clearly shows that the socket() call 
> originates from glibc's __nscd_* functions. This happens when the JVM 
> or application triggers a name service lookup (e.g., resolving a user 
> ID). In my specific environment, this results in a Unix socket 
> connection from the Java process to the lwsmd daemon for authentication.
>
> Because this socket is created and managed within the native C 
> library, the standard approach of implementing a Java-level 
> org.crac.Resource to close and restore it doesn't seem applicable, as 
> my application code has no direct handle or control over its lifecycle.
>
> I have documented the full analysis, including the error, lsof output, 
> and BCC stack traces, in a detailed write-up which you can find here:
> https://github.com/mz1999/blog/blob/master/docs/trace_java_socket_creation-en.md
>
> My question is: What is the recommended approach for handling such 
> file descriptors that are opened by underlying native libraries 
> without direct control from the Java application?
>
> Are there any existing mechanisms, perhaps through advanced file 
> descriptor policies, or any planned features that might address this 
> common scenario? Or is there another workaround that the team would 
> suggest?
>
> Thank you for your time and for developing this fantastic project. Any 
> guidance you can provide would be greatly appreciated.
>
> Best regards,
> mazhen


More information about the crac-dev mailing list