diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2019-11-20 00:12:33 +0300 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2019-11-20 00:17:58 +0300 |
commit | a64e7e05a418ec26a76ecbf04c80e9ba7fe8aa90 (patch) | |
tree | 817466c77d3de54c6a91d1d3d43354d814a04440 | |
parent | ca05fa5375eb3124660e24346f1bdc3990c118f2 (diff) | |
download | postgresql-a64e7e05a418ec26a76ecbf04c80e9ba7fe8aa90.tar.gz postgresql-a64e7e05a418ec26a76ecbf04c80e9ba7fe8aa90.zip |
Fix page modification outside of critical section in GIN
By oversight 52ac6cd2d0 makes ginDeletePage() sets pd_prune_xid of page to be
deleted before entering the critical section. It appears that only versions 11
and later were affected by this oversight.
Backpatch-through: 11
-rw-r--r-- | src/backend/access/gin/ginvacuum.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c index 3a695a05552..0c8f4b13372 100644 --- a/src/backend/access/gin/ginvacuum.c +++ b/src/backend/access/gin/ginvacuum.c @@ -153,9 +153,6 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn page = BufferGetPage(dBuffer); rightlink = GinPageGetOpaque(page)->rightlink; - /* For deleted page remember last xid which could knew its address */ - GinPageSetDeleteXid(page, ReadNewTransactionId()); - /* * Any insert which would have gone on the leaf block will now go to its * right sibling. @@ -168,6 +165,9 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn page = BufferGetPage(lBuffer); GinPageGetOpaque(page)->rightlink = rightlink; + /* For deleted page remember last xid which could knew its address */ + GinPageSetDeleteXid(page, ReadNewTransactionId()); + /* Delete downlink from parent */ parentPage = BufferGetPage(pBuffer); #ifdef USE_ASSERT_CHECKING |