summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2015-01-23 17:34:01 -0500
committerRamon Fernandez <ramon.fernandez@mongodb.com>2015-01-27 20:35:01 -0500
commit2bec03aa00484ae15c9729d6611a679f629ae33e (patch)
tree0a13316964d03e833ab04ec6cbcc8aa039ec2bd9
parentb059fb303695a7ef90a1489d5d5a4cff3ead707d (diff)
downloadmongo-2bec03aa00484ae15c9729d6611a679f629ae33e.tar.gz
SERVER-17031 Don't handle SIGQUIT on the signal handling thread
It doesn't work if CTRL-C hung, which is the primary use case. (cherry picked from commit 0126c434740e1d659ec252685e57c90b98b4b54f)
-rw-r--r--src/mongo/util/signal_handlers.cpp4
-rw-r--r--src/mongo/util/signal_handlers_synchronous.cpp3
2 files changed, 3 insertions, 4 deletions
diff --git a/src/mongo/util/signal_handlers.cpp b/src/mongo/util/signal_handlers.cpp
index 6217ae9bc7b..51dbbcc2525 100644
--- a/src/mongo/util/signal_handlers.cpp
+++ b/src/mongo/util/signal_handlers.cpp
@@ -177,9 +177,6 @@ namespace {
fassert(16782, rotateLogs(serverGlobalParams.logRenameOnRotate));
logProcessDetailsForLogRotate();
break;
- case SIGQUIT:
- log() << "Received SIGQUIT; terminating.";
- quickExit(EXIT_ABRUPT);
default:
// interrupt/terminate signal
log() << "got signal " << actualSignal << " (" << strsignal( actualSignal )
@@ -209,7 +206,6 @@ namespace {
sigaddset( &asyncSignals, SIGINT );
}
sigaddset( &asyncSignals, SIGTERM );
- sigaddset( &asyncSignals, SIGQUIT );
sigaddset( &asyncSignals, SIGUSR1 );
sigaddset( &asyncSignals, SIGXCPU );
#endif
diff --git a/src/mongo/util/signal_handlers_synchronous.cpp b/src/mongo/util/signal_handlers_synchronous.cpp
index 3ed71f07fd7..680324ec781 100644
--- a/src/mongo/util/signal_handlers_synchronous.cpp
+++ b/src/mongo/util/signal_handlers_synchronous.cpp
@@ -266,6 +266,9 @@ namespace {
sigemptyset(&addrSignals.sa_mask);
addrSignals.sa_flags = SA_SIGINFO;
+ // ^\ is the stronger ^C. Log and quit hard without waiting for cleanup.
+ invariant(signal(SIGQUIT, abruptQuit) != SIG_ERR);
+
invariant(sigaction(SIGSEGV, &addrSignals, 0) == 0);
invariant(sigaction(SIGBUS, &addrSignals, 0) == 0);
invariant(sigaction(SIGILL, &addrSignals, 0) == 0);