Commit a6b67c50 authored by Michael Widenius's avatar Michael Widenius

Remove not used signal handling for ending a thread

Ensure that if we send 'sigint' to mysqld started with --gdb it's taken down nicely
Clear THR_THD when thread ends to get a valid stack trace if we die late
Bug #37869 mysqld stopped reacting to SIGINT when run with --gdb

parent 4150dfda
...@@ -352,7 +352,7 @@ static bool volatile ready_to_exit; ...@@ -352,7 +352,7 @@ static bool volatile ready_to_exit;
static my_bool opt_debugging= 0, opt_external_locking= 0, opt_console= 0; static my_bool opt_debugging= 0, opt_external_locking= 0, opt_console= 0;
static my_bool opt_short_log_format= 0; static my_bool opt_short_log_format= 0;
static uint kill_cached_threads, wake_thread; static uint kill_cached_threads, wake_thread;
static ulong killed_threads, thread_created; static ulong thread_created;
static ulong max_used_connections; static ulong max_used_connections;
static ulong my_bind_addr; /**< the address we bind to */ static ulong my_bind_addr; /**< the address we bind to */
static volatile ulong cached_thread_count= 0; static volatile ulong cached_thread_count= 0;
...@@ -648,7 +648,6 @@ struct my_rnd_struct sql_rand; ///< used by sql_class.cc:THD::THD() ...@@ -648,7 +648,6 @@ struct my_rnd_struct sql_rand; ///< used by sql_class.cc:THD::THD()
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
struct passwd *user_info; struct passwd *user_info;
static pthread_t select_thread; static pthread_t select_thread;
static uint thr_kill_signal;
#endif #endif
/* OS specific variables */ /* OS specific variables */
...@@ -1766,17 +1765,12 @@ void close_connection(THD *thd, uint errcode, bool lock) ...@@ -1766,17 +1765,12 @@ void close_connection(THD *thd, uint errcode, bool lock)
#endif /* EMBEDDED_LIBRARY */ #endif /* EMBEDDED_LIBRARY */
/** Called when a thread is aborted. */ /** Called when mysqld is aborted with ^C */
/* ARGSUSED */ /* ARGSUSED */
extern "C" sig_handler end_thread_signal(int sig __attribute__((unused))) extern "C" sig_handler end_mysqld_signal(int sig __attribute__((unused)))
{ {
THD *thd=current_thd; DBUG_ENTER("end_mysqld_signal");
DBUG_ENTER("end_thread_signal"); kill(0, SIGTERM); // Take down mysqld nicely
if (thd && ! thd->bootstrap)
{
statistic_increment(killed_threads, &LOCK_status);
thread_scheduler.end_thread(thd,0); /* purecov: inspected */
}
DBUG_VOID_RETURN; /* purecov: deadcode */ DBUG_VOID_RETURN; /* purecov: deadcode */
} }
...@@ -1884,6 +1878,8 @@ bool one_thread_per_connection_end(THD *thd, bool put_in_cache) ...@@ -1884,6 +1878,8 @@ bool one_thread_per_connection_end(THD *thd, bool put_in_cache)
{ {
DBUG_ENTER("one_thread_per_connection_end"); DBUG_ENTER("one_thread_per_connection_end");
unlink_thd(thd); unlink_thd(thd);
/* Mark that current_thd is not valid anymore */
my_pthread_setspecific_ptr(THR_THD, 0);
if (put_in_cache) if (put_in_cache)
put_in_cache= cache_thread(); put_in_cache= cache_thread();
pthread_mutex_unlock(&LOCK_thread_count); pthread_mutex_unlock(&LOCK_thread_count);
...@@ -2594,11 +2590,9 @@ static void init_signals(void) ...@@ -2594,11 +2590,9 @@ static void init_signals(void)
sigaddset(&set,THR_SERVER_ALARM); sigaddset(&set,THR_SERVER_ALARM);
if (test_flags & TEST_SIGINT) if (test_flags & TEST_SIGINT)
{ {
// May be SIGINT /* Allow SIGINT to break mysqld. This is for debugging with --gdb */
sigdelset(&set, thr_kill_signal); my_sigset(SIGINT, end_mysqld_signal);
sigdelset(&set, SIGINT); sigdelset(&set, SIGINT);
my_sigset(thr_kill_signal, end_thread_signal);
my_sigset(SIGINT, end_thread_signal);
} }
else else
sigaddset(&set,SIGINT); sigaddset(&set,SIGINT);
...@@ -2664,10 +2658,11 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused))) ...@@ -2664,10 +2658,11 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused)))
*/ */
init_thr_alarm(thread_scheduler.max_threads + init_thr_alarm(thread_scheduler.max_threads +
global_system_variables.max_insert_delayed_threads + 10); global_system_variables.max_insert_delayed_threads + 10);
if (thd_lib_detected != THD_LIB_LT && (test_flags & TEST_SIGINT)) if (test_flags & TEST_SIGINT)
{ {
(void) sigemptyset(&set); // Setup up SIGINT for debug /* Allow SIGINT to break mysqld. This is for debugging with --gdb */
(void) sigaddset(&set,SIGINT); // For debugging (void) sigemptyset(&set);
(void) sigaddset(&set,SIGINT);
(void) pthread_sigmask(SIG_UNBLOCK,&set,NULL); (void) pthread_sigmask(SIG_UNBLOCK,&set,NULL);
} }
(void) sigemptyset(&set); // Setup up SIGINT for debug (void) sigemptyset(&set); // Setup up SIGINT for debug
...@@ -4182,13 +4177,6 @@ int main(int argc, char **argv) ...@@ -4182,13 +4177,6 @@ int main(int argc, char **argv)
MY_INIT(argv[0]); // init my_sys library & pthreads MY_INIT(argv[0]); // init my_sys library & pthreads
/* nothing should come before this line ^^^ */ /* nothing should come before this line ^^^ */
/* Set signal used to kill MySQL */
#if defined(SIGUSR2)
thr_kill_signal= thd_lib_detected == THD_LIB_LT ? SIGINT : SIGUSR2;
#else
thr_kill_signal= SIGINT;
#endif
/* /*
Perform basic logger initialization logger. Should be called after Perform basic logger initialization logger. Should be called after
MY_INIT, as it initializes mutexes. Log tables are inited later. MY_INIT, as it initializes mutexes. Log tables are inited later.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment