Commit e1cd66f7 authored by Simon Riggs's avatar Simon Riggs

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
parent 9abbed06
...@@ -560,9 +560,19 @@ _bt_getbuf(Relation rel, BlockNumber blkno, int access) ...@@ -560,9 +560,19 @@ _bt_getbuf(Relation rel, BlockNumber blkno, int access)
*/ */
if (XLogStandbyInfoActive()) if (XLogStandbyInfoActive())
{ {
TransactionId latestRemovedXid;
BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); 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 */ /* Okay to use page. Re-initialize and return it */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment