Improve the message logged when recovery is paused.
authorFujii Masao <[email protected]>
Tue, 31 Mar 2020 18:35:13 +0000 (03:35 +0900)
committerFujii Masao <[email protected]>
Tue, 31 Mar 2020 18:35:13 +0000 (03:35 +0900)
When recovery target is reached and recovery is paused because of
recovery_target_action=pause, executing pg_wal_replay_resume() causes
the standby to promote, i.e., the recovery to end. So, in this case,
the previous message "Execute pg_wal_replay_resume() to continue"
logged was confusing because pg_wal_replay_resume() doesn't cause
the recovery to continue.

This commit improves the message logged when recovery is paused,
and the proper message is output based on what (pg_wal_replay_pause
or recovery_target_action) causes recovery to be paused.

Author: Sergei Kornilov, revised by Fujii Masao
Reviewed-by: Robert Haas
Discussion: https://postgr.es/m/19168211580382043@myt5-b646bde4b8f3.qloud-c.yandex.net

src/backend/access/transam/xlog.c

index 54ef90a029c86b9a1365f9d43ba8142fba545ac3..977d448f502359c676f76e974cb846819046d873 100644 (file)
@@ -885,7 +885,7 @@ static void validateRecoveryParameters(void);
 static void exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog);
 static bool recoveryStopsBefore(XLogReaderState *record);
 static bool recoveryStopsAfter(XLogReaderState *record);
-static void recoveryPausesHere(void);
+static void recoveryPausesHere(bool endOfRecovery);
 static bool recoveryApplyDelay(XLogReaderState *record);
 static void SetLatestXTime(TimestampTz xtime);
 static void SetCurrentChunkStartTime(TimestampTz xtime);
@@ -5951,12 +5951,16 @@ recoveryStopsAfter(XLogReaderState *record)
 /*
  * Wait until shared recoveryPause flag is cleared.
  *
+ * endOfRecovery is true if the recovery target is reached and
+ * the paused state starts at the end of recovery because of
+ * recovery_target_action=pause, and false otherwise.
+ *
  * XXX Could also be done with shared latch, avoiding the pg_usleep loop.
  * Probably not worth the trouble though.  This state shouldn't be one that
  * anyone cares about server power consumption in.
  */
 static void
-recoveryPausesHere(void)
+recoveryPausesHere(bool endOfRecovery)
 {
    /* Don't pause unless users can connect! */
    if (!LocalHotStandbyActive)
@@ -5966,9 +5970,14 @@ recoveryPausesHere(void)
    if (LocalPromoteIsTriggered)
        return;
 
-   ereport(LOG,
-           (errmsg("recovery has paused"),
-            errhint("Execute pg_wal_replay_resume() to continue.")));
+   if (endOfRecovery)
+       ereport(LOG,
+               (errmsg("pausing at the end of recovery"),
+                errhint("Execute pg_wal_replay_resume() to promote.")));
+   else
+       ereport(LOG,
+               (errmsg("recovery has paused"),
+                errhint("Execute pg_wal_replay_resume() to continue.")));
 
    while (RecoveryIsPaused())
    {
@@ -7201,7 +7210,7 @@ StartupXLOG(void)
                 * adding another spinlock cycle to prevent that.
                 */
                if (((volatile XLogCtlData *) XLogCtl)->recoveryPause)
-                   recoveryPausesHere();
+                   recoveryPausesHere(false);
 
                /*
                 * Have we reached our recovery target?
@@ -7226,7 +7235,7 @@ StartupXLOG(void)
                     * work.
                     */
                    if (((volatile XLogCtlData *) XLogCtl)->recoveryPause)
-                       recoveryPausesHere();
+                       recoveryPausesHere(false);
                }
 
                /* Setup error traceback support for ereport() */
@@ -7400,7 +7409,7 @@ StartupXLOG(void)
 
                    case RECOVERY_TARGET_ACTION_PAUSE:
                        SetRecoveryPause(true);
-                       recoveryPausesHere();
+                       recoveryPausesHere(true);
 
                        /* drop into promote */