From 596d3804c784b06f2125aa7727b82a265b08ccfb Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Thu, 5 Apr 2018 10:18:01 +0300 Subject: [PATCH 1/1] Call HandleStartupProcInterrupts() less frequently in WAL redo. HandleStartupProcInterrupts() calls PostmasterIsAlive(), which calls read() on the postmaster death watch pipe. That's relatively expensive, when we do it between every WAL record. --- src/backend/access/transam/xlog.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index b4fd8395b7..3406c58c9b 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7072,6 +7072,7 @@ StartupXLOG(void) { ErrorContextCallback errcallback; TimestampTz xtime; + uint32 records_replayed = 0; InRedo = true; @@ -7105,8 +7106,13 @@ StartupXLOG(void) } #endif - /* Handle interrupt signals of startup process */ - HandleStartupProcInterrupts(); + /* + * Handle interrupt signals of startup process. This includes + * a call to PostmasterIsAlive(), which isn't totally free, so + * don't do this on every record, to avoid the overhead. + */ + if (records_replayed % 32 == 0) + HandleStartupProcInterrupts(); /* * Pause WAL replay, if requested by a hot-standby session via @@ -7269,6 +7275,7 @@ StartupXLOG(void) /* Remember this record as the last-applied one */ LastRec = ReadRecPtr; + records_replayed++; /* Allow read-only connections if we're consistent now */ CheckRecoveryConsistency(); -- 2.11.0