From: Alexander Korotkov Date: Tue, 19 Nov 2019 21:12:33 +0000 (+0300) Subject: Fix page modification outside of critical section in GIN X-Git-Tag: REL_13_BETA1~1155 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b107140804817cc30a4069b1bb5545aa3ea0ce6c;p=thirdparty%2Fpostgresql.git 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 --- 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