static void logicalrep_worker_onexit(int code, Datum arg);
static void logicalrep_worker_detach(void);
-bool got_SIGTERM = false;
+/* 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;
Datum pg_stat_get_subscription(PG_FUNCTION_ARGS);
void
logicalrep_worker_sigterm(SIGNAL_ARGS)
{
+ int save_errno = errno;
+
got_SIGTERM = true;
/* Waken anything waiting on the process latch */
SetLatch(MyLatch);
+
+ 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;
}
/*
(errmsg("logical replication launcher started")));
/* Establish signal handlers. */
+ pqsignal(SIGHUP, logicalrep_worker_sighup);
pqsignal(SIGTERM, logicalrep_worker_sigterm);
BackgroundWorkerUnblockSignals();
if (rc & WL_POSTMASTER_DEATH)
proc_exit(1);
+ if (got_SIGHUP)
+ {
+ got_SIGHUP = false;
+ ProcessConfigFile(PGC_SIGHUP);
+ }
+
ResetLatch(&MyProc->procLatch);
}
if (rc & WL_POSTMASTER_DEATH)
proc_exit(1);
+ if (got_SIGHUP)
+ {
+ got_SIGHUP = false;
+ ProcessConfigFile(PGC_SIGHUP);
+ }
+
if (rc & WL_TIMEOUT)
{
/*
logicalrep_worker_attach(worker_slot);
/* Setup signal handling */
+ pqsignal(SIGHUP, logicalrep_worker_sighup);
pqsignal(SIGTERM, logicalrep_worker_sigterm);
BackgroundWorkerUnblockSignals();
extern LogicalRepWorker *MyLogicalRepWorker;
extern bool in_remote_transaction;
-extern bool got_SIGTERM;
+extern volatile sig_atomic_t got_SIGHUP;
+extern volatile sig_atomic_t got_SIGTERM;
extern void logicalrep_worker_attach(int slot);
extern LogicalRepWorker *logicalrep_worker_find(Oid subid, Oid relid,
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);