Re-think predicate locking on GIN indexes.
Teodor Sigaev <teodor@sigaev.ru>
Re-think predicate locking on GIN indexes. The principle behind the locking was not very well thought-out, and not documented. Add a section in the README to explain how it's supposed to work, and change the code so that it actually works that way. This fixes two bugs: 1. If fast update was turned on concurrently, subsequent inserts to the pending list would not conflict with predicate locks that were acquired earlier, on entry pages. The included 'predicate-gin-fastupdate' test demonstrates that. To fix, make all scans acquire a predicate lock on the metapage. That lock represents a scan of the pending list, whether or not there is a pending list at the moment. Forget about the optimization to skip locking/checking for locks, when fastupdate=off. 2. If a scan finds no match, it still needs to lock the entry page. The point of predicate locks is to lock the gabs between values, whether or not there is a match. The included 'predicate-gin-nomatch' test tests that case. In addition to those two bug fixes, this removes some unnecessary locking, following the principle laid out in the README. Because all items in a posting tree have the same key value, a lock on the posting tree root is enough to cover all the items. (With a very large posting tree, it would possibly be better to lock the posting tree leaf pages instead, so that a "skip scan" with a query like "A & B", you could avoid unnecessary conflict if a new tuple is inserted with A but !B. But let's keep this simple.) Also, some spelling fixes. Author: Heikki Linnakangas with some editorization by me Review: Andrey Borodin, Alexander Korotkov Discussion: https://www.postgresql.org/message-id/0b3ad2c2-2692-62a9-3a04-5724f2af9114@iki.fi
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/access/gin/ginbtree.c | modified | +3 −0 |
| src/backend/access/gin/gindatapage.c | modified | +3 −4 |
| src/backend/access/gin/ginfast.c | modified | +8 −0 |
| src/backend/access/gin/ginget.c | modified | +54 −62 |
| src/backend/access/gin/gininsert.c | modified | +2 −24 |
| src/backend/access/gin/ginutil.c | modified | +0 −7 |
| src/backend/access/gin/ginvacuum.c | modified | +0 −1 |
| src/backend/access/gin/README | modified | +34 −0 |
| src/backend/access/gist/gist.c | modified | +1 −1 |
| src/backend/storage/lmgr/README-SSI | modified | +11 −11 |
| src/include/access/gin_private.h | modified | +0 −3 |
| src/test/isolation/expected/predicate-gin-fastupdate.out | added | +30 −0 |
| src/test/isolation/expected/predicate-gin-nomatch.out | added | +15 −0 |
| src/test/isolation/expected/predicate-gin.out | modified | +2 −2 |
| src/test/isolation/isolation_schedule | modified | +2 −0 |
| src/test/isolation/specs/predicate-gin-fastupdate.spec | added | +49 −0 |
| src/test/isolation/specs/predicate-gin-nomatch.spec | added | +35 −0 |
| src/test/isolation/specs/predicate-gin.spec | modified | +2 −2 |
Discussion
- GSoC 2017: weekly progress reports (week 6) 54 messages · 2017-07-11 → 2018-05-04