mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-15 08:20:16 +08:00
Fix bug in detecting concurrent page splits in GiST insert
In commit 9eb5607e69
, 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
679744cf1b
commit
6b4d3046f4
@ -248,6 +248,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;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -863,7 +866,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…
Reference in New Issue
Block a user