mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-03 01:26:51 +02:00
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
This commit is contained in:
parent
ec16eac8da
commit
98e7234242
@ -383,6 +383,7 @@ static bool recoveryStopAfter;
|
|||||||
/* prototypes for local functions */
|
/* prototypes for local functions */
|
||||||
static void ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *replayTLI);
|
static void ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *replayTLI);
|
||||||
|
|
||||||
|
static void EnableStandbyMode(void);
|
||||||
static void readRecoverySignalFile(void);
|
static void readRecoverySignalFile(void);
|
||||||
static void validateRecoveryParameters(void);
|
static void validateRecoveryParameters(void);
|
||||||
static bool read_backup_label(XLogRecPtr *checkPointLoc,
|
static bool read_backup_label(XLogRecPtr *checkPointLoc,
|
||||||
@ -467,6 +468,24 @@ XLogRecoveryShmemInit(void)
|
|||||||
ConditionVariableInit(&XLogRecoveryCtl->recoveryNotPausedCV);
|
ConditionVariableInit(&XLogRecoveryCtl->recoveryNotPausedCV);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A thin wrapper to enable StandbyMode and do other preparatory work as
|
||||||
|
* needed.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
EnableStandbyMode(void)
|
||||||
|
{
|
||||||
|
StandbyMode = true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To avoid server log bloat, we don't report recovery progress in a
|
||||||
|
* standby as it will always be in recovery unless promoted. We disable
|
||||||
|
* startup progress timeout in standby mode to avoid calling
|
||||||
|
* startup_progress_timeout_handler() unnecessarily.
|
||||||
|
*/
|
||||||
|
disable_startup_progress_timeout();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prepare the system for WAL recovery, if needed.
|
* Prepare the system for WAL recovery, if needed.
|
||||||
*
|
*
|
||||||
@ -600,7 +619,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
|
|||||||
*/
|
*/
|
||||||
InArchiveRecovery = true;
|
InArchiveRecovery = true;
|
||||||
if (StandbyModeRequested)
|
if (StandbyModeRequested)
|
||||||
StandbyMode = true;
|
EnableStandbyMode();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When a backup_label file is present, we want to roll forward from
|
* When a backup_label file is present, we want to roll forward from
|
||||||
@ -737,7 +756,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
|
|||||||
{
|
{
|
||||||
InArchiveRecovery = true;
|
InArchiveRecovery = true;
|
||||||
if (StandbyModeRequested)
|
if (StandbyModeRequested)
|
||||||
StandbyMode = true;
|
EnableStandbyMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the last valid checkpoint record. */
|
/* Get the last valid checkpoint record. */
|
||||||
@ -3115,7 +3134,7 @@ ReadRecord(XLogPrefetcher *xlogprefetcher, int emode,
|
|||||||
(errmsg_internal("reached end of WAL in pg_wal, entering archive recovery")));
|
(errmsg_internal("reached end of WAL in pg_wal, entering archive recovery")));
|
||||||
InArchiveRecovery = true;
|
InArchiveRecovery = true;
|
||||||
if (StandbyModeRequested)
|
if (StandbyModeRequested)
|
||||||
StandbyMode = true;
|
EnableStandbyMode();
|
||||||
|
|
||||||
SwitchIntoArchiveRecovery(xlogreader->EndRecPtr, replayTLI);
|
SwitchIntoArchiveRecovery(xlogreader->EndRecPtr, replayTLI);
|
||||||
minRecoveryPoint = xlogreader->EndRecPtr;
|
minRecoveryPoint = xlogreader->EndRecPtr;
|
||||||
|
@ -314,11 +314,22 @@ startup_progress_timeout_handler(void)
|
|||||||
startup_progress_timer_expired = true;
|
startup_progress_timer_expired = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
disable_startup_progress_timeout(void)
|
||||||
|
{
|
||||||
|
/* Feature is disabled. */
|
||||||
|
if (log_startup_progress_interval == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
disable_timeout(STARTUP_PROGRESS_TIMEOUT, false);
|
||||||
|
startup_progress_timer_expired = false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the start timestamp of the current operation and enable the timeout.
|
* Set the start timestamp of the current operation and enable the timeout.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
begin_startup_progress_phase(void)
|
enable_startup_progress_timeout(void)
|
||||||
{
|
{
|
||||||
TimestampTz fin_time;
|
TimestampTz fin_time;
|
||||||
|
|
||||||
@ -326,8 +337,6 @@ begin_startup_progress_phase(void)
|
|||||||
if (log_startup_progress_interval == 0)
|
if (log_startup_progress_interval == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
disable_timeout(STARTUP_PROGRESS_TIMEOUT, false);
|
|
||||||
startup_progress_timer_expired = false;
|
|
||||||
startup_progress_phase_start_time = GetCurrentTimestamp();
|
startup_progress_phase_start_time = GetCurrentTimestamp();
|
||||||
fin_time = TimestampTzPlusMilliseconds(startup_progress_phase_start_time,
|
fin_time = TimestampTzPlusMilliseconds(startup_progress_phase_start_time,
|
||||||
log_startup_progress_interval);
|
log_startup_progress_interval);
|
||||||
@ -335,6 +344,21 @@ begin_startup_progress_phase(void)
|
|||||||
log_startup_progress_interval);
|
log_startup_progress_interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A thin wrapper to first disable and then enable the startup progress
|
||||||
|
* timeout.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
begin_startup_progress_phase(void)
|
||||||
|
{
|
||||||
|
/* Feature is disabled. */
|
||||||
|
if (log_startup_progress_interval == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
disable_startup_progress_timeout();
|
||||||
|
enable_startup_progress_timeout();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Report whether startup progress timeout has occurred. Reset the timer flag
|
* Report whether startup progress timeout has occurred. Reset the timer flag
|
||||||
* if it did, set the elapsed time to the out parameters and return true,
|
* if it did, set the elapsed time to the out parameters and return true,
|
||||||
|
@ -32,6 +32,8 @@ extern void PostRestoreCommand(void);
|
|||||||
extern bool IsPromoteSignaled(void);
|
extern bool IsPromoteSignaled(void);
|
||||||
extern void ResetPromoteSignaled(void);
|
extern void ResetPromoteSignaled(void);
|
||||||
|
|
||||||
|
extern void enable_startup_progress_timeout(void);
|
||||||
|
extern void disable_startup_progress_timeout(void);
|
||||||
extern void begin_startup_progress_phase(void);
|
extern void begin_startup_progress_phase(void);
|
||||||
extern void startup_progress_timeout_handler(void);
|
extern void startup_progress_timeout_handler(void);
|
||||||
extern bool has_startup_progress_timeout_expired(long *secs, int *usecs);
|
extern bool has_startup_progress_timeout_expired(long *secs, int *usecs);
|
||||||
|
Loading…
Reference in New Issue
Block a user