mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
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))
|
if (GistFollowRight(page))
|
||||||
elog(ERROR, "concurrent GiST page split was incomplete");
|
elog(ERROR, "concurrent GiST page split was incomplete");
|
||||||
|
|
||||||
|
/* should never try to insert to a deleted page */
|
||||||
|
Assert(!GistPageIsDeleted(page));
|
||||||
|
|
||||||
*splitinfo = NIL;
|
*splitinfo = NIL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -861,7 +864,7 @@ gistdoinsert(Relation r, IndexTuple itup, Size freespace,
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
else if ((GistFollowRight(stack->page) ||
|
else if ((GistFollowRight(stack->page) ||
|
||||||
stack->parent->lsn < GistPageGetNSN(stack->page)) &&
|
stack->parent->lsn < GistPageGetNSN(stack->page)) ||
|
||||||
GistPageIsDeleted(stack->page))
|
GistPageIsDeleted(stack->page))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user