Improve the message logged when recovery is paused.
authorFujii Masao <fujii@postgresql.org>
Tue, 31 Mar 2020 18:35:13 +0000 (03:35 +0900)
committerFujii Masao <fujii@postgresql.org>
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 */