diff options
author | Simon Riggs <simon@2ndQuadrant.com> | 2011-06-27 22:12:09 +0100 |
---|---|---|
committer | Simon Riggs <simon@2ndQuadrant.com> | 2011-06-27 22:12:09 +0100 |
commit | e1cd66f74862936d84acf3008118d6094c56ad58 (patch) | |
tree | f92d9eddd7f98002670ec1f818c30bad9bf374f9 /src | |
parent | 9abbed0629c862710bdc0f0dd3565e069ecab9da (diff) | |
download | postgresql-e1cd66f74862936d84acf3008118d6094c56ad58.tar.gz postgresql-e1cd66f74862936d84acf3008118d6094c56ad58.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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/nbtree/nbtpage.c | 12 |
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 */ |