summaryrefslogtreecommitdiff
path: root/src/backend/access/transam
diff options
context:
space:
mode:
authorSimon Riggs <simon@2ndQuadrant.com>2011-11-02 08:52:59 +0000
committerSimon Riggs <simon@2ndQuadrant.com>2011-11-02 08:52:59 +0000
commit656bba95af3950b26e9e97d86d29787d89e2b423 (patch)
treee24596755701b1765ac8f7089109cfa0392b8e46 /src/backend/access/transam
parentff8451aa14c8513e429cbef09ddc72e79da366a5 (diff)
Derive oldestActiveXid at correct time for Hot Standby.
There was a timing window between when oldestActiveXid was derived and when it should have been derived that only shows itself under heavy load. Move code around to ensure correct timing of derivation. No change to StartupSUBTRANS() code, which is where this failed. Bug report by Chris Redekop
Diffstat (limited to 'src/backend/access/transam')
-rw-r--r--src/backend/access/transam/xlog.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 906292690d6..1612acd1409 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7182,6 +7182,16 @@ CreateCheckPoint(int flags)
checkPoint.time = (pg_time_t) time(NULL);
/*
+ * For Hot Standby, derive the oldestActiveXid before we fix the redo pointer.
+ * This allows us to begin accumulating changes to assemble our starting
+ * snapshot of locks and transactions.
+ */
+ if (!shutdown && XLogStandbyInfoActive())
+ checkPoint.oldestActiveXid = GetOldestActiveTransactionId();
+ else
+ checkPoint.oldestActiveXid = InvalidTransactionId;
+
+ /*
* We must hold WALInsertLock while examining insert state to determine
* the checkpoint REDO pointer.
*/
@@ -7367,9 +7377,7 @@ CreateCheckPoint(int flags)
* Update checkPoint.nextXid since we have a later value
*/
if (!shutdown && XLogStandbyInfoActive())
- LogStandbySnapshot(&checkPoint.oldestActiveXid, &checkPoint.nextXid);
- else
- checkPoint.oldestActiveXid = InvalidTransactionId;
+ LogStandbySnapshot(&checkPoint.nextXid);
START_CRIT_SECTION();