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())
|
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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user