Skip to content

Commit 1414821

Browse files
committed
Fix traversing to the deleted GIN page via downlink
Current GIN code appears to don't handle traversing to the deleted page via downlink. This commit fixes that by stepping right from the delete page like we do in nbtree. This commit also fixes setting 'deleted' flag to the GIN pages. Now other page flags are not erased once page is deleted. That helps to keep our assertions true if we arrive deleted page via downlink. Discussion: https://postgr.es/m/CAPpHfdvMvsw-NcE5bRS7R1BbvA4BxoDnVVjkXC5W0Czvy9LVrg%40mail.gmail.com Author: Alexander Korotkov Reviewed-by: Peter Geoghegan Backpatch-through: 9.4
1 parent 6e8516e commit 1414821

File tree

4 files changed

+5
-9
lines changed

4 files changed

+5
-9
lines changed

src/backend/access/gin/ginbtree.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,6 @@ ginStepRight(Buffer buffer, Relation index, int lockmode)
175175
if (isLeaf != GinPageIsLeaf(page) || isData != GinPageIsData(page))
176176
elog(ERROR, "right sibling of GIN page is of different type");
177177

178-
/*
179-
* Given the proper lock sequence above, we should never land on a deleted
180-
* page.
181-
*/
182-
if (GinPageIsDeleted(page))
183-
elog(ERROR, "right sibling of GIN page was deleted");
184-
185178
return nextbuffer;
186179
}
187180

src/backend/access/gin/gindatapage.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,9 @@ dataIsMoveRight(GinBtree btree, Page page)
236236
if (GinPageRightMost(page))
237237
return FALSE;
238238

239+
if (GinPageIsDeleted(page))
240+
return TRUE;
241+
239242
return (ginCompareItemPointers(&btree->itemptr, iptr) > 0) ? TRUE : FALSE;
240243
}
241244

src/backend/access/gin/ginvacuum.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn
285285
* we shouldn't change rightlink field to save workability of running
286286
* search scan
287287
*/
288-
GinPageGetOpaque(page)->flags = GIN_DELETED;
288+
GinPageSetDeleted(page);
289289

290290
MarkBufferDirty(pBuffer);
291291
MarkBufferDirty(lBuffer);

src/backend/access/gin/ginxlog.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
744744
Assert(GinPageIsData(page));
745745
if (record->xl_len == sizeof(ginxlogDeletePage))
746746
GinPageSetDeleteXid(page, data->deleteXid);
747-
GinPageGetOpaque(page)->flags = GIN_DELETED;
747+
GinPageSetDeleted(page);
748748
PageSetLSN(page, lsn);
749749
MarkBufferDirty(dbuffer);
750750
}

0 commit comments

Comments
 (0)