From 2314baef38248b31951d3c8e285e6f8e4fd7dd05 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 30 Oct 2008 04:06:16 +0000
Subject: [PATCH] Fix recoveryLastXTime logic so that it actually does what one
 would expect. Per gripe from Kevin Grittner.  Backpatch to 8.3, where the bug
 was introduced.

---
 src/backend/access/transam/xlog.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index e8c230466d3..5621fc0dae0 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.319 2008/09/23 09:20:35 heikki Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.320 2008/10/30 04:06:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -4698,6 +4698,9 @@ exitArchiveRecovery(TimeLineID endTLI, uint32 endLogId, uint32 endLogSeg)
  *
  * Returns TRUE if we are stopping, FALSE otherwise.  On TRUE return,
  * *includeThis is set TRUE if we should apply this record before stopping.
+ *
+ * We also track the timestamp of the latest applied COMMIT/ABORT record
+ * in recoveryLastXTime, for logging purposes.
  * Also, some information is saved in recoveryStopXid et al for use in
  * annotating the new timeline's history file.
  */
@@ -4729,12 +4732,12 @@ recoveryStopsHere(XLogRecord *record, bool *includeThis)
 	else
 		return false;
 
-	/* Remember the most recent COMMIT/ABORT time for logging purposes */
-	recoveryLastXTime = recordXtime;
-
 	/* Do we have a PITR target at all? */
 	if (!recoveryTarget)
+	{
+		recoveryLastXTime = recordXtime;
 		return false;
+	}
 
 	if (recoveryTargetExact)
 	{
@@ -4798,7 +4801,12 @@ recoveryStopsHere(XLogRecord *record, bool *includeThis)
 								recoveryStopXid,
 								timestamptz_to_str(recoveryStopTime))));
 		}
+
+		if (recoveryStopAfter)
+			recoveryLastXTime = recordXtime;
 	}
+	else
+		recoveryLastXTime = recordXtime;
 
 	return stopsHere;
 }
-- 
GitLab