]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix FATAL message for invalid recovery timeline at beginning of recovery
authorMichael Paquier <michael@paquier.xyz>
Thu, 20 Feb 2025 01:43:35 +0000 (10:43 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 20 Feb 2025 01:43:35 +0000 (10:43 +0900)
If the requested recovery timeline is not reachable, the logged
checkpoint and timeline should to be the values read from the
backup_label when it is defined.  The message generated used the values
from the control file in this case, which is fine when recovering from
the control file without a backup_label, but not if there is a
backup_label.

Issue introduced in ee994272ca50.  v15 has introduced xlogrecovery.c and
more simplifications in this area (4a92a1c3d1c3a27048cbcb58), making
this change a bit simpler to think about, so backpatch only down to this
version.

Author: David Steele <david@pgbackrest.org>
Reviewed-by: Andrey M. Borodin <x4mmm@yandex-team.ru>
Reviewed-by: Benoit Lobréau <benoit.lobreau@dalibo.com>
Discussion: https://postgr.es/m/c3d617d4-1696-4aa7-8a4d-5a7d19cc5618@pgbackrest.org
Backpatch-through: 15

src/backend/access/transam/xlogrecovery.c

index a94d4b4b7801c896b277abc88c0a01b25834787f..1917cd4f4495506b77ab79db05f0e4bf937a61bf 100644 (file)
@@ -844,13 +844,13 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                 * tliSwitchPoint will throw an error if the checkpoint's timeline is
                 * not in expectedTLEs at all.
                 */
-               switchpoint = tliSwitchPoint(ControlFile->checkPointCopy.ThisTimeLineID, expectedTLEs, NULL);
+               switchpoint = tliSwitchPoint(CheckPointTLI, expectedTLEs, NULL);
                ereport(FATAL,
                                (errmsg("requested timeline %u is not a child of this server's history",
                                                recoveryTargetTLI),
                                 errdetail("Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X.",
-                                                  LSN_FORMAT_ARGS(ControlFile->checkPoint),
-                                                  ControlFile->checkPointCopy.ThisTimeLineID,
+                                                  LSN_FORMAT_ARGS(CheckPointLoc),
+                                                  CheckPointTLI,
                                                   LSN_FORMAT_ARGS(switchpoint))));
        }