mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Partially deduplicate interrupt handling for background processes.
Where possible, share signal handler code and main loop interrupt checking. This saves quite a bit of code and should simplify maintenance, too. This commit intends not to change the way anything works, even though that might allow more code to be unified. It does unify a bunch of individual variables into a ShutdownRequestPending flag that has is now used by a bunch of different process types, though. Patch by me, reviewed by Andres Freund and Daniel Gustafsson. Discussion: http://postgr.es/m/CA+TgmoZwDk=BguVDVa+qdA6SBKef=PKbaKDQALTC_9qoz1mJqg@mail.gmail.com
This commit is contained in:
@@ -30,6 +30,7 @@
|
||||
#include "pgstat.h"
|
||||
#include "postmaster/bgworker.h"
|
||||
#include "postmaster/fork_process.h"
|
||||
#include "postmaster/interrupt.h"
|
||||
#include "postmaster/postmaster.h"
|
||||
#include "replication/logicallauncher.h"
|
||||
#include "replication/logicalworker.h"
|
||||
@@ -955,7 +956,7 @@ ApplyLauncherMain(Datum main_arg)
|
||||
LogicalRepCtx->launcher_pid = MyProcPid;
|
||||
|
||||
/* Establish signal handlers. */
|
||||
pqsignal(SIGTERM, PostgresSigHupHandler);
|
||||
pqsignal(SIGTERM, SignalHandlerForConfigReload);
|
||||
pqsignal(SIGTERM, die);
|
||||
BackgroundWorkerUnblockSignals();
|
||||
|
||||
|
@@ -45,6 +45,7 @@
|
||||
#include "parser/parse_relation.h"
|
||||
#include "pgstat.h"
|
||||
#include "postmaster/bgworker.h"
|
||||
#include "postmaster/interrupt.h"
|
||||
#include "postmaster/postmaster.h"
|
||||
#include "postmaster/walwriter.h"
|
||||
#include "replication/decode.h"
|
||||
@@ -1575,7 +1576,7 @@ ApplyWorkerMain(Datum main_arg)
|
||||
logicalrep_worker_attach(worker_slot);
|
||||
|
||||
/* Setup signal handling */
|
||||
pqsignal(SIGHUP, PostgresSigHupHandler);
|
||||
pqsignal(SIGHUP, SignalHandlerForConfigReload);
|
||||
pqsignal(SIGTERM, die);
|
||||
BackgroundWorkerUnblockSignals();
|
||||
|
||||
|
@@ -43,7 +43,6 @@
|
||||
*/
|
||||
#include "postgres.h"
|
||||
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "access/htup_details.h"
|
||||
@@ -58,6 +57,7 @@
|
||||
#include "libpq/pqsignal.h"
|
||||
#include "miscadmin.h"
|
||||
#include "pgstat.h"
|
||||
#include "postmaster/interrupt.h"
|
||||
#include "replication/walreceiver.h"
|
||||
#include "replication/walsender.h"
|
||||
#include "storage/ipc.h"
|
||||
@@ -127,7 +127,6 @@ static void ProcessWalSndrMessage(XLogRecPtr walEnd, TimestampTz sendTime);
|
||||
/* Signal handlers */
|
||||
static void WalRcvSigHupHandler(SIGNAL_ARGS);
|
||||
static void WalRcvShutdownHandler(SIGNAL_ARGS);
|
||||
static void WalRcvQuickDieHandler(SIGNAL_ARGS);
|
||||
|
||||
|
||||
/*
|
||||
@@ -249,7 +248,7 @@ WalReceiverMain(void)
|
||||
pqsignal(SIGHUP, WalRcvSigHupHandler); /* set flag to read config file */
|
||||
pqsignal(SIGINT, SIG_IGN);
|
||||
pqsignal(SIGTERM, WalRcvShutdownHandler); /* request shutdown */
|
||||
pqsignal(SIGQUIT, WalRcvQuickDieHandler); /* hard crash time */
|
||||
pqsignal(SIGQUIT, SignalHandlerForCrashExit);
|
||||
pqsignal(SIGALRM, SIG_IGN);
|
||||
pqsignal(SIGPIPE, SIG_IGN);
|
||||
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
|
||||
@@ -780,32 +779,6 @@ WalRcvShutdownHandler(SIGNAL_ARGS)
|
||||
errno = save_errno;
|
||||
}
|
||||
|
||||
/*
|
||||
* WalRcvQuickDieHandler() occurs when signalled SIGQUIT by the postmaster.
|
||||
*
|
||||
* Some backend has bought the farm, so we need to stop what we're doing and
|
||||
* exit.
|
||||
*/
|
||||
static void
|
||||
WalRcvQuickDieHandler(SIGNAL_ARGS)
|
||||
{
|
||||
/*
|
||||
* We DO NOT want to run proc_exit() or atexit() callbacks -- we're here
|
||||
* because shared memory may be corrupted, so we don't want to try to
|
||||
* clean up our transaction. Just nail the windows shut and get out of
|
||||
* town. The callbacks wouldn't be safe to run from a signal handler,
|
||||
* anyway.
|
||||
*
|
||||
* Note we use _exit(2) not _exit(0). This is to force the postmaster
|
||||
* into a system reset cycle if someone sends a manual SIGQUIT to a random
|
||||
* backend. This is necessary precisely because we don't clean up our
|
||||
* shared memory state. (The "dead man switch" mechanism in pmsignal.c
|
||||
* should ensure the postmaster sees this as a crash, too, but no harm in
|
||||
* being doubly sure.)
|
||||
*/
|
||||
_exit(2);
|
||||
}
|
||||
|
||||
/*
|
||||
* Accept the message from XLOG stream, and process it.
|
||||
*/
|
||||
|
@@ -66,6 +66,7 @@
|
||||
#include "miscadmin.h"
|
||||
#include "nodes/replnodes.h"
|
||||
#include "pgstat.h"
|
||||
#include "postmaster/interrupt.h"
|
||||
#include "replication/basebackup.h"
|
||||
#include "replication/decode.h"
|
||||
#include "replication/logical.h"
|
||||
@@ -2969,8 +2970,7 @@ void
|
||||
WalSndSignals(void)
|
||||
{
|
||||
/* Set up signal handlers */
|
||||
pqsignal(SIGHUP, PostgresSigHupHandler); /* set flag to read config
|
||||
* file */
|
||||
pqsignal(SIGHUP, SignalHandlerForConfigReload);
|
||||
pqsignal(SIGINT, StatementCancelHandler); /* query cancel */
|
||||
pqsignal(SIGTERM, die); /* request shutdown */
|
||||
pqsignal(SIGQUIT, quickdie); /* hard crash time */
|
||||
|
Reference in New Issue
Block a user