aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
authorSimon Riggs <simon@2ndQuadrant.com>2011-11-02 08:53:40 +0000
committerSimon Riggs <simon@2ndQuadrant.com>2011-11-02 08:53:40 +0000
commitbf70bf4c7177bdd5c6644da65c0ccea47405d5f3 (patch)
tree1767f481881a6c76a880034c98abfd85e73d6b7a /src/backend/access/transam/xlog.c
parent93b915b3d1c1a325a6458f9553a37b89d244262b (diff)
downloadpostgresql-bf70bf4c7177bdd5c6644da65c0ccea47405d5f3.tar.gz
postgresql-bf70bf4c7177bdd5c6644da65c0ccea47405d5f3.zip
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/xlog.c')
-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 60ea3f7f1ed..f3a8dae6312 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7599,6 +7599,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.
*/
@@ -7784,9 +7794,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();