On Sat, 22 Jan 2022 01:17:41 GMT, Xin Liu <x...@openjdk.org> wrote: >> In early stage of initialization, HotSpot doesn't handle SIGQUIT. The >> default signal preposition on Linux is to quit the process and generate >> coredump. >> >> There are 2 applications for this signal. >> 1. There's a handshake protocol between sun.tools.attach and HotSpot. >> VirtualMachineImpl sends SIGQUIT(3) if the AttachListener has not been >> initialized. It expects "Signal Dispatcher" to handle SIGQUIT and create >> AttachListener. >> 2. POSIX systems use SIGQUIT as SIGBREAK. After AttachListener is up, >> HotSpot will reinterpret the signal for thread dump. >> >> It is possible that HotSpot is still initializing in Threads::create_vm() >> when SIGQUIT arrives. We should change JVM_HANDLE_XXX_SIGNAL to catch >> SIGQUIT and ignore it. It is installed os::init_2() and should cover the >> early stage of initialization. Later on, os::initialize_jdk_signal_support() >> still overwrites the signal handler of SIGQUIT if ReduceSignalUsage is >> false(default). >> >> Testing >> >> Before, this patch, once initialization takes long time, jcmd may quit the >> java process. >> >> $java -Xms64g -XX:+AlwaysPreTouch -Xlog:gc+heap=debug:stderr >> -XX:ParallelGCThreads=1 & >> [1] 9589 >> [0.028s][debug][gc,heap] Minimum heap 68719476736 Initial heap 68719476736 >> Maximum heap 68719476736 >> [0.034s][debug][gc,heap] Running G1 PreTouch with 1 workers for 16384 work >> units pre-touching 68719476736B. >> $jcmd 9589 VM.flags >> 9589: >> [1] + 9589 quit java -Xms64g -XX:+AlwaysPreTouch >> -Xlog:gc+heap=debug:stderr >> java.io.IOException: No such process >> at jdk.attach/sun.tools.attach.VirtualMachineImpl.sendQuitTo(Native >> Method) >> at >> jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:100) >> at >> jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58) >> at >> jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207) >> at jdk.jcmd/sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:113) >> at jdk.jcmd/sun.tools.jcmd.JCmd.main(JCmd.java:97) >> >> >> With this patch, neither jcmd nor kill -3 will disrupt java process 45850. >> >> $java -Xms64g -XX:+AlwaysPreTouch -XX:ParallelGCThreads=1 >> -Xlog:os+init=debug:stderr -version & >> [1] 45850 >> $ kill -3 45850 >> [6.902s][info][os,init] ignore BREAK_SIGNAL in the initialization phase. >> >> >> >> $jcmd 45850 VM.flags >> 45850: >> [19.920s][info][os,init] ignore BREAK_SIGNAL in the initialization phase. >> [25.422s][info][os,init] ignore BREAK_SIGNAL in the initialization phase. >> [26.522s][info][os,init] ignore BREAK_SIGNAL in the initialization phase. >> [27.723s][info][os,init] ignore BREAK_SIGNAL in the initialization phase. >> [29.023s][info][os,init] ignore BREAK_SIGNAL in the initialization phase. >> [30.423s][info][os,init] ignore BREAK_SIGNAL in the initialization phase. >> com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file >> /proc/45850/root/tmp/.java_pid45850: target process 45850 doesn't respond >> within 10500ms or HotSpot VM not loaded >> at >> jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:105) >> at >> jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58) >> at >> jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207) >> at jdk.jcmd/sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:113) >> at jdk.jcmd/sun.tools.jcmd.JCmd.main(JCmd.java:97) >> $openjdk version "19-internal" 2022-09-20 >> OpenJDK Runtime Environment (fastdebug build 19-internal+0-adhoc.xxinliu.jdk) >> OpenJDK 64-Bit Server VM (fastdebug build 19-internal+0-adhoc.xxinliu.jdk, >> mixed mode, sharing) >> [1] + 45850 done java -Xms64g -XX:+AlwaysPreTouch >> -XX:ParallelGCThreads=1 -version > > Xin Liu has updated the pull request incrementally with one additional commit > since the last revision: > > Do not do check_signal_handler for SIGQUIT > > It's because SIGQUIT will be overwritten later. This patch fixed the > regresssion > runtime/jni/checked/TestCheckedJniExceptionCheck.java. > The test uses -Xcheck:jni and the warning message from > JniPeriodicCheckerTask > may mess up the expected outputs.
Good catch about Xcheck:jni. This looks good to me. Ship it. ------------- PR: https://git.openjdk.java.net/jdk/pull/7003