Delay recovery mode LOG after reading backup_label and/or checkpoint record
authorMichael Paquier <[email protected]>
Mon, 30 Oct 2023 06:28:20 +0000 (15:28 +0900)
committerMichael Paquier <[email protected]>
Mon, 30 Oct 2023 06:28:20 +0000 (15:28 +0900)
When beginning recovery, a LOG is displayed by the startup process to
show which recovery mode will be used depending on the .signal file(s)
set in the data folder, like "standby mode", recovery up to a given
target type and value, or archive recovery.

A different patch is under discussion to simplify the startup code by
requiring the presence of recovery.signal and/or standby.signal when a
backup_label file is read.  Delaying a bit this LOG ensures that the
correct recovery mode would be reported, and putting it at this position
does not make it lose its value.

While on it, this commit adds a few comments documenting a bit more the
initial recovery steps and their dependencies, and fixes an incorrect
comment format.  This introduces no behavior changes.

Extracted from a larger patch by me.

Reviewed-by: David Steele, Bowen Shi
Discussion: https://postgr.es/m/[email protected]

src/backend/access/transam/xlogrecovery.c

index 0840fc73d3bbc31cd7a1adbe3b3033033771573b..c61566666aa70aa5aa1639c1b7749263a2c5c1c0 100644 (file)
@@ -133,7 +133,7 @@ static TimeLineID curFileTLI;
  * currently performing crash recovery using only XLOG files in pg_wal, but
  * will switch to using offline XLOG archives as soon as we reach the end of
  * WAL in pg_wal.
-*/
+ */
 bool           ArchiveRecoveryRequested = false;
 bool           InArchiveRecovery = false;
 
@@ -540,42 +540,17 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
        readRecoverySignalFile();
        validateRecoveryParameters();
 
-       if (ArchiveRecoveryRequested)
-       {
-               if (StandbyModeRequested)
-                       ereport(LOG,
-                                       (errmsg("entering standby mode")));
-               else if (recoveryTarget == RECOVERY_TARGET_XID)
-                       ereport(LOG,
-                                       (errmsg("starting point-in-time recovery to XID %u",
-                                                       recoveryTargetXid)));
-               else if (recoveryTarget == RECOVERY_TARGET_TIME)
-                       ereport(LOG,
-                                       (errmsg("starting point-in-time recovery to %s",
-                                                       timestamptz_to_str(recoveryTargetTime))));
-               else if (recoveryTarget == RECOVERY_TARGET_NAME)
-                       ereport(LOG,
-                                       (errmsg("starting point-in-time recovery to \"%s\"",
-                                                       recoveryTargetName)));
-               else if (recoveryTarget == RECOVERY_TARGET_LSN)
-                       ereport(LOG,
-                                       (errmsg("starting point-in-time recovery to WAL location (LSN) \"%X/%X\"",
-                                                       LSN_FORMAT_ARGS(recoveryTargetLSN))));
-               else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE)
-                       ereport(LOG,
-                                       (errmsg("starting point-in-time recovery to earliest consistent point")));
-               else
-                       ereport(LOG,
-                                       (errmsg("starting archive recovery")));
-       }
-
        /*
         * Take ownership of the wakeup latch if we're going to sleep during
-        * recovery.
+        * recovery, if required.
         */
        if (ArchiveRecoveryRequested)
                OwnLatch(&XLogRecoveryCtl->recoveryWakeupLatch);
 
+       /*
+        * Set the WAL reading processor now, as it will be needed when reading
+        * the checkpoint record required (backup_label or not).
+        */
        private = palloc0(sizeof(XLogPageReadPrivate));
        xlogreader =
                XLogReaderAllocate(wal_segment_size, NULL,
@@ -609,6 +584,11 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
        replay_image_masked = (char *) palloc(BLCKSZ);
        primary_image_masked = (char *) palloc(BLCKSZ);
 
+       /*
+        * Read the backup_label file.  We want to run this part of the recovery
+        * process after checking for signal files and after performing validation
+        * of the recovery parameters.
+        */
        if (read_backup_label(&CheckPointLoc, &CheckPointTLI, &backupEndRequired,
                                                  &backupFromStandby))
        {
@@ -705,6 +685,8 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
        }
        else
        {
+               /* No backup_label file has been found if we are here. */
+
                /*
                 * If tablespace_map file is present without backup_label file, there
                 * is no use of such file.  There is no harm in retaining it, but it
@@ -788,6 +770,35 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                wasShutdown = ((record->xl_info & ~XLR_INFO_MASK) == XLOG_CHECKPOINT_SHUTDOWN);
        }
 
+       if (ArchiveRecoveryRequested)
+       {
+               if (StandbyModeRequested)
+                       ereport(LOG,
+                                       (errmsg("entering standby mode")));
+               else if (recoveryTarget == RECOVERY_TARGET_XID)
+                       ereport(LOG,
+                                       (errmsg("starting point-in-time recovery to XID %u",
+                                                       recoveryTargetXid)));
+               else if (recoveryTarget == RECOVERY_TARGET_TIME)
+                       ereport(LOG,
+                                       (errmsg("starting point-in-time recovery to %s",
+                                                       timestamptz_to_str(recoveryTargetTime))));
+               else if (recoveryTarget == RECOVERY_TARGET_NAME)
+                       ereport(LOG,
+                                       (errmsg("starting point-in-time recovery to \"%s\"",
+                                                       recoveryTargetName)));
+               else if (recoveryTarget == RECOVERY_TARGET_LSN)
+                       ereport(LOG,
+                                       (errmsg("starting point-in-time recovery to WAL location (LSN) \"%X/%X\"",
+                                                       LSN_FORMAT_ARGS(recoveryTargetLSN))));
+               else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE)
+                       ereport(LOG,
+                                       (errmsg("starting point-in-time recovery to earliest consistent point")));
+               else
+                       ereport(LOG,
+                                       (errmsg("starting archive recovery")));
+       }
+
        /*
         * If the location of the checkpoint record is not on the expected
         * timeline in the history of the requested timeline, we cannot proceed: