postgres.git / summary / log / commit / refs
commit b107140804817cc30a4069b1bb5545aa3ea0ce6c
Author: Alexander Korotkov <akorotkov@postgresql.org>
Date: Tue Nov 19 21:12:33 2019 +0000
First released in: 13.0, 11.7, 12.2
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
src/backend/access/gin/ginvacuum.c | 6 +++---
1 file 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
[parent: 32ca32d0bed4]