]> granicus.if.org Git - postgresql/commitdiff
Fix recoveryLastXTime logic so that it actually does what one would expect.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 30 Oct 2008 04:06:25 +0000 (04:06 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 30 Oct 2008 04:06:25 +0000 (04:06 +0000)
Per gripe from Kevin Grittner.  Backpatch to 8.3, where the bug was introduced.

src/backend/access/transam/xlog.c

index a3b236ccec2e2dfceb94a1d24a0a4c8c5641ff4b..1c2384e8415a570e376c1b18dcd98096c0c22d3b 100644 (file)
@@ -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.292.2.4 2008/05/13 20:54:02 mha Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.292.2.5 2008/10/30 04:06:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -4661,6 +4661,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.
  */
@@ -4692,12 +4695,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)
        {
@@ -4761,7 +4764,12 @@ recoveryStopsHere(XLogRecord *record, bool *includeThis)
                                                                recoveryStopXid,
                                                                timestamptz_to_str(recoveryStopTime))));
                }
+
+               if (recoveryStopAfter)
+                       recoveryLastXTime = recordXtime;
        }
+       else
+               recoveryLastXTime = recordXtime;
 
        return stopsHere;
 }