From ca7e04b0b9943d5c33d2e993ff685d45b5bddbbd Mon Sep 17 00:00:00 2001 From: Simon Riggs Date: Mon, 27 Jun 2011 22:15:07 +0100 Subject: [PATCH] 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 --- src/backend/access/nbtree/nbtpage.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 65354e6d28..4b1a2e912b 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 */ -- 2.40.0