summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2020-04-28 14:25:42 +0400
committerDaniel Black <daniel@mariadb.org>2020-08-01 12:50:48 +1000
commit8a5c3aa0806771eaedbc658c214b5a918b282c46 (patch)
tree9cbf740ccb7b8382b136c33ab83a218dff9fc881
parent92499ae95ced000b064910d1a15705faa64cc88f (diff)
downloadmariadb-git-bb-10.4-MDEV-19508-danielblack.tar.gz
MDEV-19508 - Issue with: #define SI_KERNELbb-10.4-MDEV-19508-danielblack
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.cmake1
-rw-r--r--config.h.cmake1
-rw-r--r--configure.cmake1
-rw-r--r--include/my_pthread.h14
-rw-r--r--mysys/thr_alarm.c3
-rw-r--r--sql/mysqld.cc10
6 files changed, 9 insertions, 21 deletions
diff --git a/cmake/os/WindowsCache.cmake b/cmake/os/WindowsCache.cmake
index a03a7bbf7e2..11bfd3ed8d0 100644
--- a/cmake/os/WindowsCache.cmake
+++ b/cmake/os/WindowsCache.cmake
@@ -152,7 +152,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 8ea8e863e6f..d8da7f8c013 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -215,7 +215,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 5dd45a6b05d..35b6d6331ff 100644
--- a/configure.cmake
+++ b/configure.cmake
@@ -400,7 +400,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 81dd63ee331..5e0c79c2142 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 553dc55bfc3..47b3205f608 100644
--- a/mysys/thr_alarm.c
+++ b/mysys/thr_alarm.c
@@ -731,8 +731,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 106151c4989..7267efe8cf2 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -3084,6 +3084,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))
@@ -3250,9 +3255,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()"));
@@ -3292,7 +3296,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