aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Riggs <simon@2ndQuadrant.com>2011-06-27 22:15:07 +0100
committerSimon Riggs <simon@2ndQuadrant.com>2011-06-27 22:15:07 +0100
commitca7e04b0b9943d5c33d2e993ff685d45b5bddbbd (patch)
treefafd73502495c21eb00af2f4b842e18547b48531
parent379352602ce1f247d1bed41b62baad4e1ee6d767 (diff)
downloadpostgresql-ca7e04b0b9943d5c33d2e993ff685d45b5bddbbd.tar.gz
postgresql-ca7e04b0b9943d5c33d2e993ff685d45b5bddbbd.zip
Reduce impact of btree page reuse on Hot Standby by fixing off-by-1 error.
WAL records of type XLOG_BTREE_REUSE_PAGE were generated using a latestRemovedXid one higher than actually needed because xid used was page opaque->btpo.xact rather than an actually removed xid. Noticed on an otherwise quiet system by Noah Misch. Noah Misch and Simon Riggs
-rw-r--r--src/backend/access/nbtree/nbtpage.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c
index 65354e6d28f..4b1a2e912b6 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -560,9 +560,19 @@ _bt_getbuf(Relation rel, BlockNumber blkno, int access)
*/
if (XLogStandbyInfoActive())
{
+ TransactionId latestRemovedXid;
+
BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page);
- _bt_log_reuse_page(rel, blkno, opaque->btpo.xact);
+ /*
+ * opaque->btpo.xact is the threshold value not the
+ * value to measure conflicts against. We must retreat
+ * by one from it to get the correct conflict xid.
+ */
+ latestRemovedXid = opaque->btpo.xact;
+ TransactionIdRetreat(latestRemovedXid);
+
+ _bt_log_reuse_page(rel, blkno, latestRemovedXid);
}
/* Okay to use page. Re-initialize and return it */