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-07T15:34:44Z
Lists: pgsql-hackers
On Fri, Dec 7, 2018 at 12:14 PM Andrey Borodin <x4mmm@yandex-team.ru> wrote: > > 7 дек. 2018 г., в 2:50, Peter Geoghegan <pg@bowt.ie> написал(а): > > On Thu, Dec 6, 2018 at 12:51 PM Alexander Korotkov <aekorotkov@gmail.com> wrote: > >> However, I'd like to note that 218f51584d5 introduces two changes: > >> 1) Cleanup locking only if there pages to delete > >> 2) Cleanup locking only subtree root > >> The 2nd one is broken. But the 1st one seems still good for me and > >> useful, because in vast majority of cases vacuum doesn't delete any > >> index pages. So, I propose to revert 218f51584d5, but leave there > >> logic, which locks root for cleanup only once there are pages to > >> delete. Any thoughts? > > > > Can you post a patch that just removes the 2nd part, leaving the > > still-correct first part? > > I like the idea of keeping cleanup lock only if there are pages to delete. It will still solve the original problem that caused proposals for GIN VACUUM enhancements. > > But I must note that there is one more problem: ginVacuumPostingTreeLeaves() do not ensure that all splitted pages are visited. It copies downlink block numbers to a temp array and then unlocks parent. It is not correct way to scan posting tree for cleanup. Hmm... In ginVacuumPostingTreeLeaves() we visit pages from parent to children. This is why splitted pages might be unvisited. Should we visit leafpages by rightlinks instead? Then, if we have candidates for delete, ginScanToDelete() can work the same as before 218f51584d5. > PFA diff with following changes: > 1. Always take root cleanup lock before deleting pages > 2. Check for concurrent splits after scanning page > > Please note, that neither applying this diff nor reverting 218f51584d5 will solve bug of page delete redo lock on standby. ginRedoDeletePage() visits pages in following order: right(to be deleted), parent, left. I didn't find any description of why it has been done so. Any guesses don't we visit parent page first here? ------ 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