RFR: 8344671: Few JFR streaming tests fail with application not alive error on MacOS 15
David Holmes
dholmes at openjdk.org
Wed Mar 26 22:18:09 UTC 2025
On Mon, 17 Mar 2025 18:26:57 GMT, Larry Cable <duke at openjdk.org> wrote:
> on both Linux and MacOS libattach utilizes UNIX signal (QUIT) to cause a target JVM (attachee) to create the socket file used as transport for subsequent jcmds (and other attach based interactions) and to listen upon that for such.
>
> it should be noted that the default behavior for QUIT (if not blocked or caught) is to terminate the signalled process.
>
> during the early lifetime of a JVM, its signal handlers are not yet installed, and thus any signal such as QUIT will cause the
> default behavior to occur, in this case the JVM will be terminated.
>
> this is why some tests are failing with "not alive"
>
> the "fix" is similar in nature to that already implemented for linux (however using a different OS dependent mechanism to obtain the attachee JVM's signal masks: sysctl(2)).
>
> the method "checkCatchesAndSendQuitTo" will now obtain the "attachee" JVM signal masks and only kill(QUIT) if the
> current masks indicate that the JVM's signals are now being handled.
>
> the behavior in the success case is now identical to the previous implementation, however should the target JVM not
> become "ready" (signal handlers installed) prior to the attach "timeout" occurring the attach operation will throw an
> "AttachNotSupportedException" with a suitable error message.
>
> see also: https://bugs.openjdk.org/browse/JDK-8350766
Thanks very much for fixing this @larry-cable ! Changes look good. Just a few minor nits.
Also you need to remove the ProblemList entries in test/jdk/ProblemList.txt.
src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c line 126:
> 124:
> 125: /*
> 126: * early in the lifetime of a JVM it has not yet initialized its signal handlers, in particular the QUIT
Suggestion:
* Early in the lifetime of a JVM it has not yet initialized its signal handlers, in particular the QUIT
src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c line 129:
> 127: * handler, note that the default behavior of QUIT is to terminate the receiving process, if unhandled.
> 128: *
> 129: * since we use QUIT to initiate an attach operation, if we signal a JVM during this period early in its
Suggestion:
* Since we use QUIT to initiate an attach operation, if we signal a JVM during this period early in its
src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c line 133:
> 131: * are attempting to attach to!
> 132: *
> 133: * the following code guards the QUIT delivery by testing the current signal masks
Suggestion:
* The following code guards the QUIT delivery by testing the current signal masks. It is okay to send QUIT
* if the signal is caught but not ignored, as that implies a handler has been installed.
src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c line 138:
> 136: if (sysctl(mib, sizeof(mib) / sizeof(int), &kiproc, &kipsz, NULL, 0) == 0) {
> 137: const int ignored = (kiproc.kp_proc.p_sigignore & sigmask(SIGQUIT)) != 0;
> 138: const int caught = (kiproc.kp_proc.p_sigcatch & sigmask(SIGQUIT)) != 0;
Suggestion:
const bool ignored = (kiproc.kp_proc.p_sigignore & sigmask(SIGQUIT)) != 0;
const bool caught = (kiproc.kp_proc.p_sigcatch & sigmask(SIGQUIT)) != 0;
src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c line 140:
> 138: const int caught = (kiproc.kp_proc.p_sigcatch & sigmask(SIGQUIT)) != 0;
> 139:
> 140: // *only* send QUIT if the target is ready to catch and handle the signal to avoid default "death" if not
Delete this comment.
src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c line 143:
> 141:
> 142: // note: obviously the masks could change between testing and signalling however this is not the
> 143: // observed behavior of the current JVM implementation.
The mask should only change in one direction - from default behaviour to being handled - so this "race" is not a concern.
src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c line 146:
> 144:
> 145: if (caught && !ignored) {
> 146: if (kill((pid_t)pid, SIGQUIT)) {
```suggestion (no implicit booleans)
if (kill((pid_t)pid, SIGQUIT) != 0) {
src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c line 154:
> 152: char msg[100];
> 153:
> 154: snprintf(msg, sizeof(msg), "%d: state is not ready to participate in attach handshake!", (int)pid);
Suggestion:
snprintf(msg, sizeof(msg), "%d: process state is not ready to participate in attach handshake!", (int)pid);
Without the `cmd` the original message didn't quite read right.
-------------
Changes requested by dholmes (Reviewer).
PR Review: https://git.openjdk.org/jdk/pull/24085#pullrequestreview-2692365572
PR Comment: https://git.openjdk.org/jdk/pull/24085#issuecomment-2731246857
PR Review Comment: https://git.openjdk.org/jdk/pull/24085#discussion_r1999848252
PR Review Comment: https://git.openjdk.org/jdk/pull/24085#discussion_r1999849256
PR Review Comment: https://git.openjdk.org/jdk/pull/24085#discussion_r1999849992
PR Review Comment: https://git.openjdk.org/jdk/pull/24085#discussion_r1999874844
PR Review Comment: https://git.openjdk.org/jdk/pull/24085#discussion_r1999865604
PR Review Comment: https://git.openjdk.org/jdk/pull/24085#discussion_r1999864741
PR Review Comment: https://git.openjdk.org/jdk/pull/24085#discussion_r1999868536
PR Review Comment: https://git.openjdk.org/jdk/pull/24085#discussion_r1999869609
More information about the serviceability-dev
mailing list