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
This commit is contained in:
parent
9abbed0629
commit
e1cd66f748
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue