RFR: 8352533: Report useful IOExceptions when jspawnhelper fails [v4]

Thomas Stuefe stuefe at openjdk.org
Tue May 13 12:56:56 UTC 2025


On Tue, 13 May 2025 10:26:51 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

>> src/java.base/unix/native/libjava/ProcessImpl_md.c line 346:
>> 
>>> 344:         if (ret != EINVAL)
>>> 345:             detail = tmpbuf;
>>> 346:     }
>> 
>> Pre-existing, possibly as follow-up: 
>> 
>> I wonder whether we can do more. I don't like how we either only print out the errno string, or only print out the "Default" detail (I don't like the "default" prefix since it's really useful context information about this errno). 
>> 
>> For a problem on this side, we mostly pass in errno, then swallow the "defaultdetail". E.g. for posix_spawn failure, we'd print e.g. "12:Out of memory\nPossible reasons: ... " (or whatever localized string strerror returns).
>> 
>> For errors that happen inside the jspawnhelper (see line 790ff where we pass 0 for the errno), we print out "0:Bad code from spawn helper\nPossible reasons: ... ", so we swallow the errno we got from the jspawnhelper.
>> 
>> Could we print out instead the default, then the errno string, then the Possible reasons text? E.g.
>> "posix_spawn failed (12:Out of memory)\nPossible reasons: ..."
>> or
>> "Bad code from spawn helper (12:Out of memory)\nPossible reasons: ..." 
>> 
>> There is an issue of errnum values from the far side possibly intersecting with valid errno. Could be solved simply by assigning negative values to ERR_MALLOC, ERR_PIPE and ERR_ARGS. I am not aware of any errno values being negative. The errno printing would need to recognise these three values in addition to errno values. We also could remove the +3 workaround in the test.
>> 
>> The only argument I see against is some vague form of backward compatibility, in case people get confused about the new information, or that existing tools parse this output.
>
> Yeah, I dislike `defaultDetail` naming and the fact we swallow it. I see good reason to print it unconditionally. I think we can do this with just a little code massaging. See new commit. It prints the message like:
> 
> 
> Recursively executing 'JspawnhelperProtocol simulateCrashInChild4'
> posix_spawn:0
> java.io.IOException: Cannot run program "pwd": Failed to exec spawn helper: pid: 1405770, exit code: 4, error: 0 (none) 
> Possible reasons:
>   - Spawn helper ran into JDK version mismatch
>   - Spawn helper ran into unexpected internal error
>   - Spawn helper was terminated by another process
> Possible solutions:
>   - Restart JVM, especially after in-place JDK updates
>   - Check system logs for JDK-related errors
>   - Re-install JDK to fix permission/versioning problems
>   - Switch to legacy launch mechanism with -Djdk.lang.Process.launchMechanism=VFORK
> 
> 	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110)
> 	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1044)
> 	at java.base/java.lang.Runtime.exec(Runtime.java:605)
> 	at java.base/java.lang.Runtime.exec(Runtime.java:470)
> 	at JspawnhelperProtocol.parentCode(JspawnhelperProtocol.java:58)
> 	at JspawnhelperProtocol.main(JspawnhelperProtocol.java:232)

I like this.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/24149#discussion_r2086751118


More information about the core-libs-dev mailing list