summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexander Korotkov <akorotkov@postgresql.org>2019-11-20 00:12:33 +0300
committerAlexander Korotkov <akorotkov@postgresql.org>2019-11-20 00:18:02 +0300
commit7d467dee0831728de107ad15c5625bf97698d790 (patch)
tree23d96dfee37aca0abfb98163f8472990c28e54bf /src
parent287192bda245cbb7b7577d4c351822772b7e7373 (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/gin/ginvacuum.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c
index 120e75a71f2..5a2a9038cbd 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