Skip to content

Commit 8a2f783

Browse files
committed
Disable STARTUP_PROGRESS_TIMEOUT in standby mode.
In standby mode, we don't actually report progress of recovery, but up until now, startup_progress_timeout_handler() nevertheless got called every log_startup_progress_interval seconds. That's an unnecessary expense, so avoid it. Report by Thomas Munro. Patch by Bharath Rupireddy, reviewed by Simon Riggs, Thomas Munro, and me. Back-patch to v15, where the problem was introduced. Discussion: https://www.postgresql.org/message-id/CA%2BhUKGKCHSffAj8zZJKJvNX7ygnQFxVD6wm1d-2j3fVw%2BMafPQ%40mail.gmail.com
1 parent 0ae4e49 commit 8a2f783

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

src/backend/access/transam/xlogrecovery.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ static bool recoveryStopAfter;
385385
/* prototypes for local functions */
386386
static void ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *replayTLI);
387387

388+
static void EnableStandbyMode(void);
388389
static void readRecoverySignalFile(void);
389390
static void validateRecoveryParameters(void);
390391
static bool read_backup_label(XLogRecPtr *checkPointLoc,
@@ -469,6 +470,24 @@ XLogRecoveryShmemInit(void)
469470
ConditionVariableInit(&XLogRecoveryCtl->recoveryNotPausedCV);
470471
}
471472

473+
/*
474+
* A thin wrapper to enable StandbyMode and do other preparatory work as
475+
* needed.
476+
*/
477+
static void
478+
EnableStandbyMode(void)
479+
{
480+
StandbyMode = true;
481+
482+
/*
483+
* To avoid server log bloat, we don't report recovery progress in a
484+
* standby as it will always be in recovery unless promoted. We disable
485+
* startup progress timeout in standby mode to avoid calling
486+
* startup_progress_timeout_handler() unnecessarily.
487+
*/
488+
disable_startup_progress_timeout();
489+
}
490+
472491
/*
473492
* Prepare the system for WAL recovery, if needed.
474493
*
@@ -602,7 +621,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
602621
*/
603622
InArchiveRecovery = true;
604623
if (StandbyModeRequested)
605-
StandbyMode = true;
624+
EnableStandbyMode();
606625

607626
/*
608627
* When a backup_label file is present, we want to roll forward from
@@ -739,7 +758,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
739758
{
740759
InArchiveRecovery = true;
741760
if (StandbyModeRequested)
742-
StandbyMode = true;
761+
EnableStandbyMode();
743762
}
744763

745764
/* Get the last valid checkpoint record. */
@@ -3117,7 +3136,7 @@ ReadRecord(XLogPrefetcher *xlogprefetcher, int emode,
31173136
(errmsg_internal("reached end of WAL in pg_wal, entering archive recovery")));
31183137
InArchiveRecovery = true;
31193138
if (StandbyModeRequested)
3120-
StandbyMode = true;
3139+
EnableStandbyMode();
31213140

31223141
SwitchIntoArchiveRecovery(xlogreader->EndRecPtr, replayTLI);
31233142
minRecoveryPoint = xlogreader->EndRecPtr;

src/backend/postmaster/startup.c

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,27 +314,51 @@ startup_progress_timeout_handler(void)
314314
startup_progress_timer_expired = true;
315315
}
316316

317+
void
318+
disable_startup_progress_timeout(void)
319+
{
320+
/* Feature is disabled. */
321+
if (log_startup_progress_interval == 0)
322+
return;
323+
324+
disable_timeout(STARTUP_PROGRESS_TIMEOUT, false);
325+
startup_progress_timer_expired = false;
326+
}
327+
317328
/*
318329
* Set the start timestamp of the current operation and enable the timeout.
319330
*/
320331
void
321-
begin_startup_progress_phase(void)
332+
enable_startup_progress_timeout(void)
322333
{
323334
TimestampTz fin_time;
324335

325336
/* Feature is disabled. */
326337
if (log_startup_progress_interval == 0)
327338
return;
328339

329-
disable_timeout(STARTUP_PROGRESS_TIMEOUT, false);
330-
startup_progress_timer_expired = false;
331340
startup_progress_phase_start_time = GetCurrentTimestamp();
332341
fin_time = TimestampTzPlusMilliseconds(startup_progress_phase_start_time,
333342
log_startup_progress_interval);
334343
enable_timeout_every(STARTUP_PROGRESS_TIMEOUT, fin_time,
335344
log_startup_progress_interval);
336345
}
337346

347+
/*
348+
* A thin wrapper to first disable and then enable the startup progress
349+
* timeout.
350+
*/
351+
void
352+
begin_startup_progress_phase(void)
353+
{
354+
/* Feature is disabled. */
355+
if (log_startup_progress_interval == 0)
356+
return;
357+
358+
disable_startup_progress_timeout();
359+
enable_startup_progress_timeout();
360+
}
361+
338362
/*
339363
* Report whether startup progress timeout has occurred. Reset the timer flag
340364
* if it did, set the elapsed time to the out parameters and return true,

src/include/postmaster/startup.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ extern void PostRestoreCommand(void);
3232
extern bool IsPromoteSignaled(void);
3333
extern void ResetPromoteSignaled(void);
3434

35+
extern void enable_startup_progress_timeout(void);
36+
extern void disable_startup_progress_timeout(void);
3537
extern void begin_startup_progress_phase(void);
3638
extern void startup_progress_timeout_handler(void);
3739
extern bool has_startup_progress_timeout_expired(long *secs, int *usecs);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy