Fix bug in detecting concurrent page splits in GiST insert
In commit 9eb5607e699, I got the condition on checking for split or deleted page wrong: I used && instead of ||. The comment correctly said "concurrent split _or_ deletion". As a result, GiST insertion could miss a concurrent split, and insert to wrong page. Duncan Sands demonstrated this with a test script that did a lot of concurrent inserts. Backpatch to v12, where this was introduced. REINDEX is required to fix indexes that were affected by this bug. Backpatch-through: 12 Reported-by: Duncan Sands Discussion: https://www.postgresql.org/message-id/a9690483-6c6c-3c82-c8ba-dc1a40848f11%40deepbluecap.com
This commit is contained in:
parent
31e0f9d76b
commit
b8403d140f
@ -246,6 +246,9 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate,
|
||||
if (GistFollowRight(page))
|
||||
elog(ERROR, "concurrent GiST page split was incomplete");
|
||||
|
||||
/* should never try to insert to a deleted page */
|
||||
Assert(!GistPageIsDeleted(page));
|
||||
|
||||
*splitinfo = NIL;
|
||||
|
||||
/*
|
||||
@ -861,7 +864,7 @@ gistdoinsert(Relation r, IndexTuple itup, Size freespace,
|
||||
*/
|
||||
}
|
||||
else if ((GistFollowRight(stack->page) ||
|
||||
stack->parent->lsn < GistPageGetNSN(stack->page)) &&
|
||||
stack->parent->lsn < GistPageGetNSN(stack->page)) ||
|
||||
GistPageIsDeleted(stack->page))
|
||||
{
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user