signal-startupproc-on-walreceive-1.patch
text/x-diff
Filename: signal-startupproc-on-walreceive-1.patch
Type: text/x-diff
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/access/transam/xlog.c | 15 | 3 |
| src/backend/postmaster/postmaster.c | 5 | 2 |
| src/backend/replication/walreceiver.c | 4 | 0 |
| src/include/postmaster/postmaster.h | 2 | 0 |
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index abdf4d8..47cd6e9 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -8682,6 +8682,16 @@ StartupProcShutdownHandler(SIGNAL_ARGS)
shutdown_requested = true;
}
+/*
+ * SIGUSR1: do nothing, but receiving the signal will wake us up if we're
+ * sleeping (on platforms where usleep() is interrupted by sleep, on other
+ * platforms this is useless).
+ */
+static void
+DoNothingHandler(SIGNAL_ARGS)
+{
+}
+
/* Handle SIGHUP and SIGTERM signals of startup process */
void
HandleStartupProcInterrupts(void)
@@ -8735,7 +8745,7 @@ StartupProcessMain(void)
else
pqsignal(SIGALRM, SIG_IGN);
pqsignal(SIGPIPE, SIG_IGN);
- pqsignal(SIGUSR1, SIG_IGN);
+ pqsignal(SIGUSR1, DoNothingHandler); /* WAL record has been streamed */
pqsignal(SIGUSR2, SIG_IGN);
/*
@@ -8859,8 +8869,10 @@ retry:
goto triggered;
/*
- * When streaming is active, we want to react quickly when
- * the next WAL record arrives, so sleep only a bit.
+ * Sleep until the next WAL record arrives, or
+ * walreceiver dies. On some platforms, signals don't
+ * interrupt sleep, so poll every 100 ms to ensure we
+ * respond promptly on such platforms.
*/
pg_usleep(100000L); /* 100ms */
}
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 98ab484..39d8fb9 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -205,8 +205,8 @@ bool enable_bonjour = false;
char *bonjour_name;
/* PIDs of special child processes; 0 when not running */
-static pid_t StartupPID = 0,
- BgWriterPID = 0,
+pid_t StartupPID = 0;
+static pid_t BgWriterPID = 0,
WalWriterPID = 0,
WalReceiverPID = 0,
AutoVacPID = 0,
@@ -433,6 +433,7 @@ typedef struct
PMSignalData *PMSignalState;
InheritableSocket pgStatSock;
pid_t PostmasterPid;
+ pid_t StartupPid;
TimestampTz PgStartTime;
TimestampTz PgReloadTime;
bool redirection_done;
@@ -4595,6 +4596,7 @@ save_backend_variables(BackendParameters *param, Port *port,
return false;
param->PostmasterPid = PostmasterPid;
+ param->StartupPid = StartupPid;
param->PgStartTime = PgStartTime;
param->PgReloadTime = PgReloadTime;
@@ -4809,6 +4811,7 @@ restore_backend_variables(BackendParameters *param, Port *port)
read_inheritable_socket(&pgStatSock, ¶m->pgStatSock);
PostmasterPid = param->PostmasterPid;
+ StartupPid = param->StartupPid;
PgStartTime = param->PgStartTime;
PgReloadTime = param->PgReloadTime;
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index c0e7e0b..c4b4614 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -41,6 +41,7 @@
#include "access/xlog_internal.h"
#include "libpq/pqsignal.h"
#include "miscadmin.h"
+#include "postmaster/postmaster.h"
#include "replication/walreceiver.h"
#include "storage/ipc.h"
#include "storage/pmsignal.h"
@@ -532,6 +533,9 @@ XLogWalRcvFlush(void)
walrcv->receivedUpto = LogstreamResult.Flush;
SpinLockRelease(&walrcv->mutex);
+ /* Wake up startup process to process the arrived records */
+ kill(StartupPID, SIGUSR1);
+
/* Report XLOG streaming progress in PS display */
snprintf(activitymsg, sizeof(activitymsg), "streaming %X/%X",
LogstreamResult.Write.xlogid, LogstreamResult.Write.xrecoff);
diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h
index 56d7d8e..fcfca78 100644
--- a/src/include/postmaster/postmaster.h
+++ b/src/include/postmaster/postmaster.h
@@ -36,6 +36,8 @@ extern HANDLE PostmasterHandle;
extern const char *progname;
+extern pid_t StartupPID;
+
extern int PostmasterMain(int argc, char *argv[]);
extern void ClosePostmasterPorts(bool am_syslogger);