diff options
author | Sergey Vojtovich <svoj@mariadb.org> | 2020-04-28 14:25:42 +0400 |
---|---|---|
committer | Daniel Black <daniel@mariadb.org> | 2020-10-25 10:27:26 +1100 |
commit | acc7121f66ec9ccc9cd77f934f2e8ba990e98e3a (patch) | |
tree | 7687a62b9be8f1a76ab2257cfbf761f646aff2c4 | |
parent | 5e43c6f3b3e158da8765c5463928f12460c4e5bf (diff) | |
download | mariadb-git-bb-10.5-danielblack-MDEV-20178-pr1515.tar.gz |
MDEV-19508 - Issue with: #define SI_KERNELbb-10.5-danielblack-MDEV-20178-pr1515
Reverted 07e9b1389, use setsid() instead.
Conventional use of SIGHUP to dump daemon information or flush caches
assumes preceeding setsid() call.
Ideally we should not setup SIGHUP handler in bootstrap and (probably)
debug_gdb modes.
Additional information on SysV style and systemd style daemons:
https://www.freedesktop.org/software/systemd/man/daemon.html
closes #1392
-rw-r--r-- | cmake/os/WindowsCache.cmake | 1 | ||||
-rw-r--r-- | config.h.cmake | 1 | ||||
-rw-r--r-- | configure.cmake | 1 | ||||
-rw-r--r-- | include/my_pthread.h | 14 | ||||
-rw-r--r-- | mysys/thr_alarm.c | 3 | ||||
-rw-r--r-- | sql/mysqld.cc | 10 |
6 files changed, 9 insertions, 21 deletions
diff --git a/cmake/os/WindowsCache.cmake b/cmake/os/WindowsCache.cmake index 4d3b2af575e..ab40f752902 100644 --- a/cmake/os/WindowsCache.cmake +++ b/cmake/os/WindowsCache.cmake @@ -151,7 +151,6 @@ SET(HAVE_SIGSET CACHE INTERNAL "") SET(HAVE_SIGTERM 1 CACHE INTERNAL "") SET(HAVE_SIGTHREADMASK CACHE INTERNAL "") SET(HAVE_SIGWAIT CACHE INTERNAL "") -SET(HAVE_SIGWAITINFO CACHE INTERNAL "") SET(HAVE_SIZEOF_CHARP TRUE CACHE INTERNAL "") SET(SIZEOF_CHARP ${CMAKE_SIZEOF_VOID_P} CACHE INTERNAL "") SET(HAVE_SIZEOF_IN6_ADDR TRUE CACHE INTERNAL "") diff --git a/config.h.cmake b/config.h.cmake index 5a48df0a135..e47974af4ae 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -210,7 +210,6 @@ #cmakedefine HAVE_SIGACTION 1 #cmakedefine HAVE_SIGTHREADMASK 1 #cmakedefine HAVE_SIGWAIT 1 -#cmakedefine HAVE_SIGWAITINFO 1 #cmakedefine HAVE_SLEEP 1 #cmakedefine HAVE_SNPRINTF 1 #cmakedefine HAVE_STPCPY 1 diff --git a/configure.cmake b/configure.cmake index 8533b8ee0b2..dbc04eb1561 100644 --- a/configure.cmake +++ b/configure.cmake @@ -397,7 +397,6 @@ CHECK_FUNCTION_EXISTS (setlocale HAVE_SETLOCALE) CHECK_FUNCTION_EXISTS (sigaction HAVE_SIGACTION) CHECK_FUNCTION_EXISTS (sigthreadmask HAVE_SIGTHREADMASK) CHECK_FUNCTION_EXISTS (sigwait HAVE_SIGWAIT) -CHECK_FUNCTION_EXISTS (sigwaitinfo HAVE_SIGWAITINFO) CHECK_FUNCTION_EXISTS (sigset HAVE_SIGSET) CHECK_FUNCTION_EXISTS (sleep HAVE_SLEEP) CHECK_FUNCTION_EXISTS (snprintf HAVE_SNPRINTF) diff --git a/include/my_pthread.h b/include/my_pthread.h index 66876032178..3ecc851ca80 100644 --- a/include/my_pthread.h +++ b/include/my_pthread.h @@ -189,19 +189,7 @@ extern int my_pthread_create_detached; int sigwait(sigset_t *set, int *sig); #endif -static inline int my_sigwait(sigset_t *set, int *sig, int *code) -{ -#ifdef HAVE_SIGWAITINFO - siginfo_t siginfo; - *sig= sigwaitinfo(set, &siginfo); - *code= siginfo.si_code; - return *sig < 0 ? errno : 0; -#else -#define SI_KERNEL 128 - *code= 0; - return sigwait(set, sig); -#endif -} +#define my_sigwait(A,B) sigwait((A),(B)) #if defined(HAVE_SIGTHREADMASK) && !defined(HAVE_PTHREAD_SIGMASK) #define pthread_sigmask(A,B,C) sigthreadmask((A),(B),(C)) diff --git a/mysys/thr_alarm.c b/mysys/thr_alarm.c index 92a471075c6..2cdcd5a28b1 100644 --- a/mysys/thr_alarm.c +++ b/mysys/thr_alarm.c @@ -707,8 +707,7 @@ static void *signal_hand(void *arg __attribute__((unused))) DBUG_PRINT("info",("Starting signal and alarm handling thread")); for(;;) { - int code; - while ((error=my_sigwait(&set,&sig,&code)) == EINTR) + while ((error= my_sigwait(&set, &sig)) == EINTR) printf("sigwait restarted\n"); if (error) { diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 9834d331474..32f6db243d7 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2819,6 +2819,11 @@ void init_signals(void) struct sigaction sa; DBUG_ENTER("init_signals"); + /* + No need to check return value, it is expected to fail only if we're session + leader already (e.g. under systemd). + */ + setsid(); my_sigset(THR_SERVER_ALARM,print_signal_warning); // Should never be called! if (opt_stack_trace || (test_flags & TEST_CORE_ON_SIGNAL)) @@ -2983,9 +2988,8 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused))) for (;;) { int error; - int origin; - while ((error= my_sigwait(&set, &sig, &origin)) == EINTR) /* no-op */; + while ((error= my_sigwait(&set, &sig)) == EINTR) /* no-op */; if (cleanup_done) { DBUG_PRINT("quit",("signal_handler: calling my_thread_end()")); @@ -3025,7 +3029,7 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused))) } break; case SIGHUP: - if (!abort_loop && origin != SI_KERNEL) + if (!abort_loop) { int not_used; mysql_print_status(); // Print some debug info |