Bug #54118 | Two signal handlers for SIGUSR1 and none for SIGALRM, resulting in a deadlock | ||
---|---|---|---|
Submitted: | 31 May 2010 20:04 | Modified: | 18 Jun 2010 16:52 |
Reporter: | Donna Harmon | Email Updates: | |
Status: | Not a Bug | Impact on me: | |
Category: | MySQL Server | Severity: | S1 (Critical) |
Version: | 5.1.47 | OS: | Solaris |
Assigned to: | Alexey Kopytov | CPU Architecture: | Any |
[31 May 2010 20:04]
Donna Harmon
[17 Jun 2010 13:11]
Alexey Kopytov
psig output on a running Solaris binary (mysql-advanced-gpl-5.1.47-solaris10-x86_64): HUP blocked,caught print_signal_warning 0 INT blocked,default QUIT blocked,default ILL caught handle_segfault RESETHAND,NODEFER TRAP default ABRT caught handle_segfault RESETHAND,NODEFER EMT default FPE caught handle_segfault RESETHAND,NODEFER KILL default BUS caught handle_segfault RESETHAND,NODEFER SEGV caught handle_segfault RESETHAND,NODEFER SYS default PIPE blocked,ignored ALRM blocked,caught print_signal_warning 0 TERM blocked,caught print_signal_warning 0 USR1 caught thread_alarm 0 USR2 default CLD default NOCLDSTOP PWR default WINCH default URG default POLL default STOP default TSTP blocked,default CONT default TTIN default TTOU default VTALRM default PROF default XCPU default XFSZ default WAITING default LWP default FREEZE default THAW default CANCEL default LOST default XRES default JVM1 default JVM2 default RTMIN default RTMIN+1 default RTMIN+2 default RTMIN+3 default RTMAX-3 default RTMAX-2 default RTMAX-1 default RTMAX default As seen, we have different signal handlers for SIGALRM and SIGUSR1. For SIGALRM process_alarm() is actually called: (dbx) status (2) trace in _signal (3) trace in _sigset (4) trace in _libc_sigaction (5) stop in init_thr_alarm (6) stop in process_alarm (7) stop at "mysqld.cc":2774 (after "kill -14 `pgrep mysqld`" in another session): dbx: warning: File `mysqld.cc' has been modified more recently than `mysqld' t@2 (l@2) stopped in signal_hand (optimized) at line 2774 in file "mysqld.cc" 2774 if (cleanup_done) (dbx) cont dbx: warning: File `thr_alarm.c' has been modified more recently than `mysqld' t@2 (l@2) stopped in process_alarm (optimized) at line 297 in file "thr_alarm.c" 297 { (dbx) where current thread: t@2 =>[1] process_alarm(sig = -20582464) (optimized), at 0x9e2d18 (line ~297) in "thr_alarm.c" [2] signal_hand(arg = ???) (optimized), at 0x7148f6 (line ~2836) in "mysqld.cc" [3] _thr_setup(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7ffed7504b [4] _lwp_start(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7ffed75280 (dbx) So with regard to SIGALRM/SIGUSR1, the signal handling is managed in exactly the same way as in Linux. I do not see any bugs here.