From acd907bfccafdf4bc1ef9e2beed8d69278de640a Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 22 Jul 2004 21:09:37 +0000
Subject: [PATCH] Add cross-check that current timeline of pg_control is an
 ancestor of recovery_target_timeline --- otherwise there is no path from the
 backup to the requested timeline.  This check was foreseen in the original
 discussion but I forgot to implement it.

---
 src/backend/access/transam/xlog.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 54a71b8f79d..f9a49332ba6 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.151 2004/07/22 20:18:40 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.152 2004/07/22 21:09:37 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -4008,6 +4008,18 @@ StartupXLOG(void)
 	/* Now we can determine the list of expected TLIs */
 	expectedTLIs = readTimeLineHistory(recoveryTargetTLI);
 
+	/*
+	 * If pg_control's timeline is not in expectedTLIs, then we cannot
+	 * proceed: the backup is not part of the history of the requested
+	 * timeline.
+	 */
+	if (!list_member_int(expectedTLIs,
+						 (int) ControlFile->checkPointCopy.ThisTimeLineID))
+		ereport(FATAL,
+				(errmsg("requested timeline %u is not a child of database system timeline %u",
+						recoveryTargetTLI,
+						ControlFile->checkPointCopy.ThisTimeLineID)));
+
 	/*
 	 * Get the last valid checkpoint record.  If the latest one according
 	 * to pg_control is broken, try the next-to-last one.
-- 
GitLab