Re: Connections hang indefinitely while taking a gin index's LWLock buffer_content lock
Alexander Korotkov <aekorotkov@gmail.com>
From: Alexander Korotkov <aekorotkov@gmail.com>
To: Andrey Borodin <x4mmm@yandex-team.ru>
Cc: Peter Geoghegan <pg@bowt.ie>, Andres Freund <andres@anarazel.de>,
chenhj <chjischj@163.com>, Teodor Sigaev <teodor@sigaev.ru>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2018-12-09T19:25:43Z
Lists: pgsql-hackers
On Sat, Dec 8, 2018 at 12:48 PM Andrey Borodin <x4mmm@yandex-team.ru> wrote: > > 8 дек. 2018 г., в 6:54, Alexander Korotkov <aekorotkov@gmail.com> написал(а): > > > > Yep, please find attached draft patch. > > Patch seems good to me, I'll check it in more detail. > The patch gets posting item at FirstOffsetNumber instead of btree->getLeftMostChild(). This seem OK, since dataGetLeftMostPage() is doing just the same, but with few Assert()s. I'd like to evade creating GinBtree for just calling getLeftMostChild(). Also, few more places in ginvacuum.c do the same. We have the same amount of Assert()s in ginVacuumPostingTreeLeaves(). So, let's keep it uniform. I would also like Peter Geoghegan to take a look at this patch before committing it. > > BTW, it seems that I've another bug in GIN. README says that > > > > "However, posting trees are only > > fully searched from left to right, starting from the leftmost leaf. (The > > tree-structure is only needed by insertions, to quickly find the correct > > insert location). So as long as we don't delete the leftmost page on each > > level, a search can never follow a downlink to page that's about to be > > deleted." > > > > But that's not really true once we teach GIN to skip parts of posting > > trees in PostgreSQL 9.4. So, there might be a risk to visit page to > > be deleted using downlink. But in order to get real problem, vacuum > > should past cleanup stage and someone else should reuse this page, > > before we traverse downlink. Thus, the risk of real problem is very > > low. But it still should be addressed. > > There's a patch above in this thread 0001-Use-correct-locking-protocol-during-GIN-posting-tree.patch where I propose stamping every deleted page with GinPageSetDeleteXid(page, ReadNewTransactionId()); and avoid reusing the page before TransactionIdPrecedes(GinPageGetDeleteXid(page), RecentGlobalDataXmin). > Should we leave alone this bug for future fixes to keep current fix noninvasive? I think since is separate bug introduced in PostgreSQL 9.4, which should be backpatched with separate commit. Could you please extract patch dealing with GinPageSetDeleteXid() and GinPageGetDeleteXid(). The rest of work made in your patch should be considered for master. BTW, what do you think about locking order in ginRedoDeletePage()? Do you have any explanation of current behavior? I'll try to reach Teodor tomorrow with this question. ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company
Commits
-
Fix WAL format incompatibility introduced by backpatching of 52ac6cd2d0
- d1166af192ed 9.4.22 landed
- cda5f6575306 9.5.17 landed
- f8a69a68a087 9.6.13 landed
- e23d44016d51 10.8 landed
- 89f39736f484 11.3 landed
-
Fix wrong backpatching of ginRedoDeletePage() deadlock fix
- bf0e5a73be20 9.4.21 landed
-
Fix deadlock in GIN vacuum introduced by 218f51584d5
- fd83c83d0943 12.0 landed
- 2e3bd064e530 10.7 landed
- 9aa94d8536f8 11.2 landed
-
Prevent GIN deleted pages from being reclaimed too early
- 52ac6cd2d0cd 12.0 landed
- ad6ebcfcbb88 9.5.16 landed
- 1cf175c74f10 9.4.21 landed
- cd24b4eaece3 9.6.12 landed
- a0696d29551b 10.7 landed
- dd951dc34a2e 11.2 landed
-
Prevent deadlock in ginRedoDeletePage()
- c6ade7a8cd31 12.0 landed
- 19cf52e6cc33 9.4.21 landed
- f6c44e1b55c1 9.5.16 landed
- 865870374aff 10.7 landed
- 80d4d8d71d57 9.6.12 landed
- 225b5c9c480f 11.2 landed
-
Reduce page locking in GIN vacuum
- 218f51584d5a 10.0 cited
-
Fix race condition in GIN posting tree page deletion.
- ac4ab97ec05e 9.4.0 cited