]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Un-revert "Disable STARTUP_PROGRESS_TIMEOUT in standby mode."
authorRobert Haas <rhaas@postgresql.org>
Fri, 10 Feb 2023 21:27:05 +0000 (16:27 -0500)
committerRobert Haas <rhaas@postgresql.org>
Fri, 10 Feb 2023 21:27:05 +0000 (16:27 -0500)
This reverts commit 1eadfbdd7eb0679ba8d45787aa8b2f06e76de20a
and thus reinstates commit 98e7234242a652497c99d4d0d6f2bf9a75d4e921.

It's a better time to commit this now that the release is over.

Discussion: http://postgr.es/m/3509384.1675878203@sss.pgh.pa.us

src/backend/access/transam/xlogrecovery.c
src/backend/postmaster/startup.c
src/include/postmaster/startup.h

index 958e85366c1583a57a400ac7d2174721ce7054a8..a0e984aae04d21ea13db09c57ad8613c366d3f9d 100644 (file)
@@ -383,6 +383,7 @@ static bool recoveryStopAfter;
 /* prototypes for local functions */
 static void ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *replayTLI);
 
+static void EnableStandbyMode(void);
 static void readRecoverySignalFile(void);
 static void validateRecoveryParameters(void);
 static bool read_backup_label(XLogRecPtr *checkPointLoc,
@@ -467,6 +468,24 @@ XLogRecoveryShmemInit(void)
        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.
  *
@@ -600,7 +619,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                 */
                InArchiveRecovery = true;
                if (StandbyModeRequested)
-                       StandbyMode = true;
+                       EnableStandbyMode();
 
                /*
                 * 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;
                        if (StandbyModeRequested)
-                               StandbyMode = true;
+                               EnableStandbyMode();
                }
 
                /* 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")));
                                InArchiveRecovery = true;
                                if (StandbyModeRequested)
-                                       StandbyMode = true;
+                                       EnableStandbyMode();
 
                                SwitchIntoArchiveRecovery(xlogreader->EndRecPtr, replayTLI);
                                minRecoveryPoint = xlogreader->EndRecPtr;
index f99186eab7dbe9b7cf1954559930b4a027ee3a5c..5c856c5261bb8aeaf60343e310282356d89d9cf0 100644 (file)
@@ -314,11 +314,22 @@ startup_progress_timeout_handler(void)
        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.
  */
 void
-begin_startup_progress_phase(void)
+enable_startup_progress_timeout(void)
 {
        TimestampTz fin_time;
 
@@ -326,8 +337,6 @@ begin_startup_progress_phase(void)
        if (log_startup_progress_interval == 0)
                return;
 
-       disable_timeout(STARTUP_PROGRESS_TIMEOUT, false);
-       startup_progress_timer_expired = false;
        startup_progress_phase_start_time = GetCurrentTimestamp();
        fin_time = TimestampTzPlusMilliseconds(startup_progress_phase_start_time,
                                                                                   log_startup_progress_interval);
@@ -335,6 +344,21 @@ begin_startup_progress_phase(void)
                                                 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
  * if it did, set the elapsed time to the out parameters and return true,
index d66ec1fcb12fc8ad92f933dbcd971ddaf973f46b..12897531c396c5e5ccfaa6c18c63a93bc54ac673 100644 (file)
@@ -32,6 +32,8 @@ extern void PostRestoreCommand(void);
 extern bool IsPromoteSignaled(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 startup_progress_timeout_handler(void);
 extern bool has_startup_progress_timeout_expired(long *secs, int *usecs);