From 880e69e79342d94b4c78f5ffc8d192e130d352b3 Mon Sep 17 00:00:00 2001 From: Petr Jelinek Date: Tue, 25 Apr 2017 05:44:49 +0200 Subject: [PATCH 2/3] Unify SIGHUP hadnling across all types of processes --- src/backend/postmaster/autovacuum.c | 30 ++++++++------------------- src/backend/postmaster/bgwriter.c | 20 +++--------------- src/backend/postmaster/checkpointer.c | 25 +++++----------------- src/backend/postmaster/pgarch.c | 25 +++++----------------- src/backend/postmaster/pgstat.c | 28 +++++++------------------ src/backend/postmaster/startup.c | 7 +++---- src/backend/postmaster/syslogger.c | 20 +++--------------- src/backend/postmaster/walwriter.c | 20 +++--------------- src/backend/replication/logical/launcher.c | 21 +++---------------- src/backend/replication/logical/worker.c | 6 +++--- src/backend/replication/walreceiver.c | 7 +++---- src/backend/replication/walsender.c | 33 ++++++++---------------------- src/backend/tcop/postgres.c | 24 +++++++++++----------- src/backend/utils/misc/guc.c | 9 ++++---- src/include/miscadmin.h | 6 ++++++ src/include/replication/worker_internal.h | 2 -- 16 files changed, 78 insertions(+), 205 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 89dd3b3..4fba44c 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -137,7 +137,6 @@ static bool am_autovacuum_launcher = false; static bool am_autovacuum_worker = false; /* Flags set by signal handlers */ -static volatile sig_atomic_t got_SIGHUP = false; static volatile sig_atomic_t got_SIGUSR2 = false; static volatile sig_atomic_t got_SIGTERM = false; @@ -351,7 +350,6 @@ static void perform_work_item(AutoVacuumWorkItem *workitem); static void autovac_report_activity(autovac_table *tab); static void autovac_report_workitem(AutoVacuumWorkItem *workitem, const char *nspname, const char *relname); -static void av_sighup_handler(SIGNAL_ARGS); static void avl_sigusr2_handler(SIGNAL_ARGS); static void avl_sigterm_handler(SIGNAL_ARGS); static void autovac_refresh_stats(void); @@ -461,7 +459,7 @@ AutoVacLauncherMain(int argc, char *argv[]) * backend, so we use the same signal handling. See equivalent code in * tcop/postgres.c. */ - pqsignal(SIGHUP, av_sighup_handler); + pqsignal(SIGHUP, PostgresSigHupHandler); pqsignal(SIGINT, StatementCancelHandler); pqsignal(SIGTERM, avl_sigterm_handler); @@ -675,9 +673,9 @@ AutoVacLauncherMain(int argc, char *argv[]) if (got_SIGTERM) break; - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); /* shutdown requested in config file? */ @@ -1406,18 +1404,6 @@ AutoVacWorkerFailed(void) AutoVacuumShmem->av_signal[AutoVacForkFailed] = true; } -/* SIGHUP: set flag to re-read config file at next convenient time */ -static void -av_sighup_handler(SIGNAL_ARGS) -{ - int save_errno = errno; - - got_SIGHUP = true; - SetLatch(MyLatch); - - errno = save_errno; -} - /* SIGUSR2: a worker is up and running, or just finished, or failed to fork */ static void avl_sigusr2_handler(SIGNAL_ARGS) @@ -1540,7 +1526,7 @@ AutoVacWorkerMain(int argc, char *argv[]) * backend, so we use the same signal handling. See equivalent code in * tcop/postgres.c. */ - pqsignal(SIGHUP, av_sighup_handler); + pqsignal(SIGHUP, PostgresSigHupHandler); /* * SIGINT is used to signal canceling the current table's vacuum; SIGTERM @@ -2333,9 +2319,9 @@ do_autovacuum(void) /* * Check for config changes before processing each collected table. */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); /* @@ -2573,9 +2559,9 @@ deleted: * jobs. */ CHECK_FOR_INTERRUPTS(); - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c index dcb4cf2..97299c3 100644 --- a/src/backend/postmaster/bgwriter.c +++ b/src/backend/postmaster/bgwriter.c @@ -89,13 +89,11 @@ static XLogRecPtr last_snapshot_lsn = InvalidXLogRecPtr; /* * Flags set by interrupt handlers for later service in the main loop. */ -static volatile sig_atomic_t got_SIGHUP = false; static volatile sig_atomic_t shutdown_requested = false; /* Signal handlers */ static void bg_quickdie(SIGNAL_ARGS); -static void BgSigHupHandler(SIGNAL_ARGS); static void ReqShutdownHandler(SIGNAL_ARGS); static void bgwriter_sigusr1_handler(SIGNAL_ARGS); @@ -120,7 +118,7 @@ BackgroundWriterMain(void) * bgwriter doesn't participate in ProcSignal signalling, but a SIGUSR1 * handler is still needed for latch wakeups. */ - pqsignal(SIGHUP, BgSigHupHandler); /* set flag to read config file */ + pqsignal(SIGHUP, PostgresSigHupHandler); /* set flag to read config file */ pqsignal(SIGINT, SIG_IGN); pqsignal(SIGTERM, ReqShutdownHandler); /* shutdown */ pqsignal(SIGQUIT, bg_quickdie); /* hard crash time */ @@ -259,9 +257,9 @@ BackgroundWriterMain(void) /* Clear any already-pending wakeups */ ResetLatch(MyLatch); - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } if (shutdown_requested) @@ -429,18 +427,6 @@ bg_quickdie(SIGNAL_ARGS) exit(2); } -/* SIGHUP: set flag to re-read config file at next convenient time */ -static void -BgSigHupHandler(SIGNAL_ARGS) -{ - int save_errno = errno; - - got_SIGHUP = true; - SetLatch(MyLatch); - - errno = save_errno; -} - /* SIGTERM: set flag to shutdown and exit */ static void ReqShutdownHandler(SIGNAL_ARGS) diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index fe9041f..aa669c4 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -149,7 +149,6 @@ double CheckPointCompletionTarget = 0.5; /* * Flags set by interrupt handlers for later service in the main loop. */ -static volatile sig_atomic_t got_SIGHUP = false; static volatile sig_atomic_t checkpoint_requested = false; static volatile sig_atomic_t shutdown_requested = false; @@ -177,7 +176,6 @@ static void UpdateSharedMemoryConfig(void); /* Signal handlers */ static void chkpt_quickdie(SIGNAL_ARGS); -static void ChkptSigHupHandler(SIGNAL_ARGS); static void ReqCheckpointHandler(SIGNAL_ARGS); static void chkpt_sigusr1_handler(SIGNAL_ARGS); static void ReqShutdownHandler(SIGNAL_ARGS); @@ -205,8 +203,7 @@ CheckpointerMain(void) * want to wait for the backends to exit, whereupon the postmaster will * tell us it's okay to shut down (via SIGUSR2). */ - pqsignal(SIGHUP, ChkptSigHupHandler); /* set flag to read config - * file */ + pqsignal(SIGHUP, PostgresSigHupHandler); /* set flag to read config file */ pqsignal(SIGINT, ReqCheckpointHandler); /* request checkpoint */ pqsignal(SIGTERM, SIG_IGN); /* ignore SIGTERM */ pqsignal(SIGQUIT, chkpt_quickdie); /* hard crash time */ @@ -365,9 +362,9 @@ CheckpointerMain(void) */ AbsorbFsyncRequests(); - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); /* @@ -691,9 +688,9 @@ CheckpointWriteDelay(int flags, double progress) !ImmediateCheckpointRequested() && IsCheckpointOnSchedule(progress)) { - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); /* update shmem copies of config variables */ UpdateSharedMemoryConfig(); @@ -846,18 +843,6 @@ chkpt_quickdie(SIGNAL_ARGS) exit(2); } -/* SIGHUP: set flag to re-read config file at next convenient time */ -static void -ChkptSigHupHandler(SIGNAL_ARGS) -{ - int save_errno = errno; - - got_SIGHUP = true; - SetLatch(MyLatch); - - errno = save_errno; -} - /* SIGINT: set flag to run a normal checkpoint right away */ static void ReqCheckpointHandler(SIGNAL_ARGS) diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index f3f58bd..02ddd71 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -73,7 +73,6 @@ static time_t last_sigterm_time = 0; /* * Flags set by interrupt handlers for later service in the main loop. */ -static volatile sig_atomic_t got_SIGHUP = false; static volatile sig_atomic_t got_SIGTERM = false; static volatile sig_atomic_t wakened = false; static volatile sig_atomic_t ready_to_stop = false; @@ -88,7 +87,6 @@ static pid_t pgarch_forkexec(void); NON_EXEC_STATIC void PgArchiverMain(int argc, char *argv[]) pg_attribute_noreturn(); static void pgarch_exit(SIGNAL_ARGS); -static void ArchSigHupHandler(SIGNAL_ARGS); static void ArchSigTermHandler(SIGNAL_ARGS); static void pgarch_waken(SIGNAL_ARGS); static void pgarch_waken_stop(SIGNAL_ARGS); @@ -219,7 +217,7 @@ PgArchiverMain(int argc, char *argv[]) * Ignore all signals usually bound to some action in the postmaster, * except for SIGHUP, SIGTERM, SIGUSR1, SIGUSR2, and SIGQUIT. */ - pqsignal(SIGHUP, ArchSigHupHandler); + pqsignal(SIGHUP, PostgresSigHupHandler); pqsignal(SIGINT, SIG_IGN); pqsignal(SIGTERM, ArchSigTermHandler); pqsignal(SIGQUIT, pgarch_exit); @@ -252,19 +250,6 @@ pgarch_exit(SIGNAL_ARGS) exit(1); } -/* SIGHUP signal handler for archiver process */ -static void -ArchSigHupHandler(SIGNAL_ARGS) -{ - int save_errno = errno; - - /* set flag to re-read config file at next convenient time */ - got_SIGHUP = true; - SetLatch(MyLatch); - - errno = save_errno; -} - /* SIGTERM signal handler for archiver process */ static void ArchSigTermHandler(SIGNAL_ARGS) @@ -341,9 +326,9 @@ pgarch_MainLoop(void) time_to_stop = ready_to_stop; /* Check for config update */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } @@ -444,9 +429,9 @@ pgarch_ArchiverCopyLoop(void) * setting for archive_command as soon as possible, even if there * is a backlog of files to be archived. */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 15d0689..5a207ea 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -263,7 +263,6 @@ static List *pending_write_requests = NIL; /* Signal handler flags */ static volatile bool need_exit = false; -static volatile bool got_SIGHUP = false; /* * Total time charged to functions so far in the current backend. @@ -284,7 +283,6 @@ static pid_t pgstat_forkexec(void); NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn(); static void pgstat_exit(SIGNAL_ARGS); static void pgstat_beshutdown_hook(int code, Datum arg); -static void pgstat_sighup_handler(SIGNAL_ARGS); static PgStat_StatDBEntry *pgstat_get_db_entry(Oid databaseid, bool create); static PgStat_StatTabEntry *pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, @@ -4149,7 +4147,7 @@ PgstatCollectorMain(int argc, char *argv[]) * except SIGHUP and SIGQUIT. Note we don't need a SIGUSR1 handler to * support latch operations, because we only use a local latch. */ - pqsignal(SIGHUP, pgstat_sighup_handler); + pqsignal(SIGHUP, PostgresSigHupHandler); pqsignal(SIGINT, SIG_IGN); pqsignal(SIGTERM, SIG_IGN); pqsignal(SIGQUIT, pgstat_exit); @@ -4184,10 +4182,10 @@ PgstatCollectorMain(int argc, char *argv[]) * message. (This effectively means that if backends are sending us stuff * like mad, we won't notice postmaster death until things slack off a * bit; which seems fine.) To do that, we have an inner loop that - * iterates as long as recv() succeeds. We do recognize got_SIGHUP inside - * the inner loop, which means that such interrupts will get serviced but - * the latch won't get cleared until next time there is a break in the - * action. + * iterates as long as recv() succeeds. We do recognize + * config_reread_signaled inside the inner loop, which means that such + * interrupts will get serviced but the latch won't get cleared until next + * time there is a break in the action. */ for (;;) { @@ -4209,9 +4207,9 @@ PgstatCollectorMain(int argc, char *argv[]) /* * Reload configuration if we got SIGHUP from the postmaster. */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } @@ -4402,18 +4400,6 @@ pgstat_exit(SIGNAL_ARGS) errno = save_errno; } -/* SIGHUP handler for collector process */ -static void -pgstat_sighup_handler(SIGNAL_ARGS) -{ - int save_errno = errno; - - got_SIGHUP = true; - SetLatch(MyLatch); - - errno = save_errno; -} - /* * Subroutine to clear stats in a database entry * diff --git a/src/backend/postmaster/startup.c b/src/backend/postmaster/startup.c index b623252..34c618d 100644 --- a/src/backend/postmaster/startup.c +++ b/src/backend/postmaster/startup.c @@ -38,7 +38,6 @@ /* * Flags set by interrupt handlers for later service in the redo loop. */ -static volatile sig_atomic_t got_SIGHUP = false; static volatile sig_atomic_t shutdown_requested = false; static volatile sig_atomic_t promote_triggered = false; @@ -122,7 +121,7 @@ StartupProcSigHupHandler(SIGNAL_ARGS) { int save_errno = errno; - got_SIGHUP = true; + config_reread_signaled = true; WakeupRecovery(); errno = save_errno; @@ -150,9 +149,9 @@ HandleStartupProcInterrupts(void) /* * Check if we were requested to re-read config file. */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index aaefdae..f08b8fa 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -122,7 +122,6 @@ static CRITICAL_SECTION sysloggerSection; /* * Flags set by interrupt handlers for later service in the main loop. */ -static volatile sig_atomic_t got_SIGHUP = false; static volatile sig_atomic_t rotation_requested = false; @@ -144,7 +143,6 @@ static unsigned int __stdcall pipeThread(void *arg); static void logfile_rotate(bool time_based_rotation, int size_rotation_for); static char *logfile_getname(pg_time_t timestamp, const char *suffix); static void set_next_rotation_time(void); -static void sigHupHandler(SIGNAL_ARGS); static void sigUsr1Handler(SIGNAL_ARGS); static void update_metainfo_datafile(void); @@ -240,7 +238,7 @@ SysLoggerMain(int argc, char *argv[]) * broken backends... */ - pqsignal(SIGHUP, sigHupHandler); /* set flag to read config file */ + pqsignal(SIGHUP, PostgresSigHupHandler); /* set flag to read config file */ pqsignal(SIGINT, SIG_IGN); pqsignal(SIGTERM, SIG_IGN); pqsignal(SIGQUIT, SIG_IGN); @@ -303,9 +301,9 @@ SysLoggerMain(int argc, char *argv[]) /* * Process any requests or signals received recently. */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); /* @@ -1421,18 +1419,6 @@ update_metainfo_datafile(void) * -------------------------------- */ -/* SIGHUP: set flag to reload config file */ -static void -sigHupHandler(SIGNAL_ARGS) -{ - int save_errno = errno; - - got_SIGHUP = true; - SetLatch(MyLatch); - - errno = save_errno; -} - /* SIGUSR1: set flag to rotate logfile */ static void sigUsr1Handler(SIGNAL_ARGS) diff --git a/src/backend/postmaster/walwriter.c b/src/backend/postmaster/walwriter.c index a575d8f..ce4a690 100644 --- a/src/backend/postmaster/walwriter.c +++ b/src/backend/postmaster/walwriter.c @@ -79,12 +79,10 @@ int WalWriterFlushAfter = 128; /* * Flags set by interrupt handlers for later service in the main loop. */ -static volatile sig_atomic_t got_SIGHUP = false; static volatile sig_atomic_t shutdown_requested = false; /* Signal handlers */ static void wal_quickdie(SIGNAL_ARGS); -static void WalSigHupHandler(SIGNAL_ARGS); static void WalShutdownHandler(SIGNAL_ARGS); static void walwriter_sigusr1_handler(SIGNAL_ARGS); @@ -108,7 +106,7 @@ WalWriterMain(void) * We have no particular use for SIGINT at the moment, but seems * reasonable to treat like SIGTERM. */ - pqsignal(SIGHUP, WalSigHupHandler); /* set flag to read config file */ + pqsignal(SIGHUP, PostgresSigHupHandler); /* set flag to read config file */ pqsignal(SIGINT, WalShutdownHandler); /* request shutdown */ pqsignal(SIGTERM, WalShutdownHandler); /* request shutdown */ pqsignal(SIGQUIT, wal_quickdie); /* hard crash time */ @@ -260,9 +258,9 @@ WalWriterMain(void) /* * Process any requests or signals received recently. */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } if (shutdown_requested) @@ -342,18 +340,6 @@ wal_quickdie(SIGNAL_ARGS) exit(2); } -/* SIGHUP: set flag to re-read config file at next convenient time */ -static void -WalSigHupHandler(SIGNAL_ARGS) -{ - int save_errno = errno; - - got_SIGHUP = true; - SetLatch(MyLatch); - - errno = save_errno; -} - /* SIGTERM: set flag to exit normally */ static void WalShutdownHandler(SIGNAL_ARGS) diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index b55ac2a..615987d 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -80,7 +80,6 @@ static void logicalrep_worker_detach(void); static void logicalrep_worker_cleanup(LogicalRepWorker *worker); /* Flags set by signal handlers */ -volatile sig_atomic_t got_SIGHUP = false; volatile sig_atomic_t got_SIGTERM = false; static bool on_commit_launcher_wakeup = false; @@ -615,20 +614,6 @@ logicalrep_worker_sigterm(SIGNAL_ARGS) errno = save_errno; } -/* SIGHUP: set flag to reload configuration at next convenient time */ -void -logicalrep_worker_sighup(SIGNAL_ARGS) -{ - int save_errno = errno; - - got_SIGHUP = true; - - /* Waken anything waiting on the process latch */ - SetLatch(MyLatch); - - errno = save_errno; -} - /* * Count the number of registered (not necessarily running) sync workers * for a subscription. @@ -772,7 +757,7 @@ ApplyLauncherMain(Datum main_arg) before_shmem_exit(logicalrep_launcher_onexit, (Datum) 0); /* Establish signal handlers. */ - pqsignal(SIGHUP, logicalrep_worker_sighup); + pqsignal(SIGHUP, PostgresSigHupHandler); pqsignal(SIGTERM, logicalrep_worker_sigterm); BackgroundWorkerUnblockSignals(); @@ -863,9 +848,9 @@ ApplyLauncherMain(Datum main_arg) if (rc & WL_POSTMASTER_DEATH) proc_exit(1); - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index bcb9ae8..7bb7900 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -1137,9 +1137,9 @@ LogicalRepApplyLoop(XLogRecPtr last_received) if (rc & WL_POSTMASTER_DEATH) proc_exit(1); - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } @@ -1450,7 +1450,7 @@ ApplyWorkerMain(Datum main_arg) logicalrep_worker_attach(worker_slot); /* Setup signal handling */ - pqsignal(SIGHUP, logicalrep_worker_sighup); + pqsignal(SIGHUP, PostgresSigHupHandler); pqsignal(SIGTERM, logicalrep_worker_sigterm); BackgroundWorkerUnblockSignals(); diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index df93265..9e0ac2e 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -95,7 +95,6 @@ static uint32 recvOff = 0; * Flags set by interrupt handlers of walreceiver for later service in the * main loop. */ -static volatile sig_atomic_t got_SIGHUP = false; static volatile sig_atomic_t got_SIGTERM = false; /* @@ -424,9 +423,9 @@ WalReceiverMain(void) /* Process any requests or signals received recently */ ProcessWalRcvInterrupts(); - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); XLogWalRcvSendHSFeedback(true); } @@ -799,7 +798,7 @@ WalRcvDie(int code, Datum arg) static void WalRcvSigHupHandler(SIGNAL_ARGS) { - got_SIGHUP = true; + config_reread_signaled = true; } diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 5349268..7f107b5 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -175,8 +175,7 @@ static bool streamingDoneReceiving; /* Are we there yet? */ static bool WalSndCaughtUp = false; -/* Flags set by signal handlers for later service in main loop */ -static volatile sig_atomic_t got_SIGHUP = false; +/* Flags indicating that walsender is done working and should exit. */ static volatile sig_atomic_t walsender_ready_to_stop = false; /* @@ -211,7 +210,6 @@ static struct } LagTracker; /* Signal handlers */ -static void WalSndSigHupHandler(SIGNAL_ARGS); static void WalSndXLogSendHandler(SIGNAL_ARGS); static void WalSndLastCycleHandler(SIGNAL_ARGS); @@ -1194,9 +1192,9 @@ WalSndWriteData(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, CHECK_FOR_INTERRUPTS(); /* Process any requests or signals received recently */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); SyncRepInitConfig(); } @@ -1289,9 +1287,9 @@ WalSndWaitForWal(XLogRecPtr loc) CHECK_FOR_INTERRUPTS(); /* Process any requests or signals received recently */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); SyncRepInitConfig(); } @@ -2057,9 +2055,9 @@ WalSndLoop(WalSndSendDataCallback send_data) CHECK_FOR_INTERRUPTS(); /* Process any requests or signals received recently */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); SyncRepInitConfig(); } @@ -2832,19 +2830,6 @@ WalSndRqstFileReload(void) } } -/* SIGHUP: set flag to re-read config file at next convenient time */ -static void -WalSndSigHupHandler(SIGNAL_ARGS) -{ - int save_errno = errno; - - got_SIGHUP = true; - - SetLatch(MyLatch); - - errno = save_errno; -} - /* SIGUSR1: set flag to send WAL records */ static void WalSndXLogSendHandler(SIGNAL_ARGS) @@ -2882,8 +2867,8 @@ void WalSndSignals(void) { /* Set up signal handlers */ - pqsignal(SIGHUP, WalSndSigHupHandler); /* set flag to read config - * file */ + pqsignal(SIGHUP, PostgresSigHupHandler); /* set flag to read config + * file */ pqsignal(SIGINT, SIG_IGN); /* not used */ pqsignal(SIGTERM, die); /* request shutdown */ pqsignal(SIGQUIT, quickdie); /* hard crash time */ diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 75c2d9a..46fc567 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -122,11 +122,12 @@ char *register_stack_base_ptr = NULL; #endif /* - * Flag to mark SIGHUP. Whenever the main loop comes around it - * will reread the configuration file. (Better than doing the - * reading in the signal handler, ey?) + * Flag set by SIGHUP handler indicating whether we should reread the + * configuration file. The process will reread the configuration file at the + * earliest convenience. (Better than doing the reading in the signal + * handler, ey?) */ -static volatile sig_atomic_t got_SIGHUP = false; +volatile sig_atomic_t config_reread_signaled = false; /* * Flag to keep track of whether we have started a transaction. @@ -186,7 +187,6 @@ static bool IsTransactionExitStmt(Node *parsetree); static bool IsTransactionExitStmtList(List *pstmts); static bool IsTransactionStmtList(List *pstmts); static void drop_unnamed_stmt(void); -static void SigHupHandler(SIGNAL_ARGS); static void log_disconnections(int code, Datum arg); @@ -2684,12 +2684,12 @@ FloatExceptionHandler(SIGNAL_ARGS) } /* SIGHUP: set flag to re-read config file at next convenient time */ -static void -SigHupHandler(SIGNAL_ARGS) +void +PostgresSigHupHandler(SIGNAL_ARGS) { int save_errno = errno; - got_SIGHUP = true; + config_reread_signaled = true; SetLatch(MyLatch); errno = save_errno; @@ -3627,8 +3627,8 @@ PostgresMain(int argc, char *argv[], WalSndSignals(); else { - pqsignal(SIGHUP, SigHupHandler); /* set flag to read config - * file */ + pqsignal(SIGHUP, PostgresSigHupHandler); /* set flag to read config + * file */ pqsignal(SIGINT, StatementCancelHandler); /* cancel current query */ pqsignal(SIGTERM, die); /* cancel current query and exit */ @@ -4041,9 +4041,9 @@ PostgresMain(int argc, char *argv[], * (6) check for any other interesting events that happened while we * slept. */ - if (got_SIGHUP) + if (config_reread_signaled) { - got_SIGHUP = false; + config_reread_signaled = false; ProcessConfigFile(PGC_SIGHUP); } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index a414fb2..4f545c9 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -8969,10 +8969,11 @@ read_nondefault_variables(void) * value before processing serialized values. * * A PGC_S_DEFAULT setting on the serialize side will typically match new - * postmaster children, but that can be false when got_SIGHUP == true and the - * pending configuration change modifies this setting. Nonetheless, we omit - * PGC_S_DEFAULT settings from serialization and make up for that by restoring - * defaults before applying serialized values. + * postmaster children, but that can be false when + * config_reread_signaled == true and the pending configuration change + * modifies this setting. Nonetheless, we omit PGC_S_DEFAULT settings from + * serialization and make up for that by restoring defaults before applying + * serialized values. * * PGC_POSTMASTER variables always have the same value in every child of a * particular postmaster. Most PGC_INTERNAL variables are compile-time diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 4c607b2..aea8a3f 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -23,6 +23,8 @@ #ifndef MISCADMIN_H #define MISCADMIN_H +#include + #include "pgtime.h" /* for pg_time_t */ @@ -268,11 +270,15 @@ typedef struct typedef char *pg_stack_base_t; #endif +extern volatile sig_atomic_t config_reread_signaled; + extern pg_stack_base_t set_stack_base(void); extern void restore_stack_base(pg_stack_base_t base); extern void check_stack_depth(void); extern bool stack_is_too_deep(void); +extern void PostgresSigHupHandler(SIGNAL_ARGS); + /* in tcop/utility.c */ extern void PreventCommandIfReadOnly(const char *cmdname); extern void PreventCommandIfParallelMode(const char *cmdname); diff --git a/src/include/replication/worker_internal.h b/src/include/replication/worker_internal.h index 0535794..5970957 100644 --- a/src/include/replication/worker_internal.h +++ b/src/include/replication/worker_internal.h @@ -67,7 +67,6 @@ extern Subscription *MySubscription; extern LogicalRepWorker *MyLogicalRepWorker; extern bool in_remote_transaction; -extern volatile sig_atomic_t got_SIGHUP; extern volatile sig_atomic_t got_SIGTERM; extern void logicalrep_worker_attach(int slot); @@ -81,7 +80,6 @@ extern void logicalrep_worker_wakeup_ptr(LogicalRepWorker *worker); extern int logicalrep_sync_worker_count(Oid subid); -extern void logicalrep_worker_sighup(SIGNAL_ARGS); extern void logicalrep_worker_sigterm(SIGNAL_ARGS); extern char *LogicalRepSyncTableStart(XLogRecPtr *origin_startpos); void process_syncing_tables(XLogRecPtr current_lsn); -- 2.7.4