Re: BUG #17949: Adding an index introduces serialisation anomalies.
Peter Geoghegan <pg@bowt.ie>
From: Peter Geoghegan <pg@bowt.ie>
To: Thomas Munro <thomas.munro@gmail.com>
Cc: Dmitry Dolgov <9erthalion6@gmail.com>, artem.anisimov.255@gmail.com, pgsql-bugs@lists.postgresql.org, Teodor Sigaev <teodor@sigaev.ru>, Heikki Linnakangas <hlinnaka@iki.fi>
Date: 2023-06-26T02:52:46Z
Lists: pgsql-bugs
On Sun, Jun 25, 2023 at 5:26 PM Thomas Munro <thomas.munro@gmail.com> wrote: > CheckForSerializableConflictIn() was written with the assumption that > you're inserting a tuple (ie you have the page containing the tuple > locked), so you'll either conflict with a reader who already has a > predicate lock at that point OR you'll insert first and then the > reader will see your (invisible-to-snapshot) tuples, but here we're > doing some fancy footwork with a meta page, and we screwed up the > ordering and left a window where neither of those things happens. FWIW, there is no fundamental reason why nbtree couldn't always preallocate a single empty leaf page during CREATE INDEX -- this leaf page is where values whose keyspace is between negative and positive infinity (i.e. all items) are located. That would fix this bug. Since, of course, it would make the theory of operation that you describe work reliably, even with an empty index. This isn't a serious proposal, of course -- lazily allocating the first real page has value, and we're hardly going to throw that away just to fix this bug. My point is that not allocating a leaf page in CREATE INDEX is the special case here, if anything. I'm not surprised that GIN has deeper problems than nbtree due to things like posting trees. Many GIN features rely on the fact that GIN only supports lossy index scans. For example, it doesn't matter if the pending list has TIDs that appear elsewhere within the same index for a while. It doesn't matter if you have a hard crash when merging the pending list -- VACUUM will eventually clean everything up. Having the same TID in two different places at the same time is tolerable. I imagine that that kind of foundation is harder to build SSI predicate locks on top of. -- Peter Geoghegan
Commits
-
Fix race in SSI interaction with bitmap heap scan.
- 814f3c8e4868 11.21 landed
- 17b8887c29e5 12.16 landed
- 8976ac5c5c00 13.12 landed
- 3f7d3a77e18d 14.9 landed
- ab265e98500b 15.4 landed
- bcc93a389ce3 17.0 landed
- d03d9a2614fd 16.0 landed
-
Fix race in SSI interaction with gin fast path.
- 13f127800fed 11.21 landed
- 255a925d333b 12.16 landed
- fc15473840bc 13.12 landed
- fb663f38790e 14.9 landed
- d34aa0a2f4f3 15.4 landed
- 126552c85c1c 17.0 landed
- 12529028a4e5 16.0 landed
-
Fix race in SSI interaction with empty btrees.
- 0048c3b51549 11.21 landed
- fe88497b4d0b 12.16 landed
- 8f705d7b9d01 13.12 landed
- ae6d536ed0dc 14.9 landed
- 0f275b0ee8e4 15.4 landed
- f9b7fc651a99 17.0 landed
- 0cb1fb2c9bf8 16.0 landed
-
Re-think predicate locking on GIN indexes.
- 0bef1c0678d9 11.0 cited