| 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.
 
