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-13T19:40:59Z
Lists: pgsql-hackers
On Thu, Dec 13, 2018 at 8:06 PM Andrey Borodin <x4mmm@yandex-team.ru> wrote: > > if (BufferIsValid(lbuffer)) > > UnlockReleaseBuffer(lbuffer); > > if (BufferIsValid(pbuffer)) > > UnlockReleaseBuffer(pbuffer); > > if (BufferIsValid(dbuffer)) > > UnlockReleaseBuffer(dbuffer); > > ==> > > if (BufferIsValid(pbuffer)) > > UnlockReleaseBuffer(pbuffer); > > if (BufferIsValid(dbuffer)) > > UnlockReleaseBuffer(dbuffer); > > if (BufferIsValid(lbuffer)) > > UnlockReleaseBuffer(lbuffer); > > I think that unlock order does not matter. But I may be wrong. May be just for uniformity? It doesn't mater, because we release all locks on every buffer at one time. The unlock order can have effect on what waiter will acquire the lock next after ginRedoDeletePage(). However, I don't see why one unlock order is better than another. Thus, I just used the rule of thumb to not change code when it's not necessary for bug fix. > > 13 дек. 2018 г., в 21:48, Tom Lane <tgl@sss.pgh.pa.us> написал(а): > > > > Bruce Momjian <bruce@momjian.us> writes: > >> I am seeing this warning in the 9.4 branch: > >> ginxlog.c:756:5: warning: ‘lbuffer’ may be used uninitialized > >> in this function [-Wmaybe-uninitialized] > > > > I'm also getting that, just in 9.4, but at a different line number: > > > > ginxlog.c: In function 'ginRedoDeletePage': > > ginxlog.c:693: warning: 'lbuffer' may be used uninitialized in this function > > > > That's with gcc version 4.4.7 20120313 (Red Hat 4.4.7-23) > > > That's the same variable, one place is definition while other is potential misuse. > Seems like these 2 lines [0] > > + if (BufferIsValid(lbuffer)) > + UnlockReleaseBuffer(lbuffer); > > are superfluous: lbuffer is UnlockReleased earlier. Thanks to everybody for noticing! Speaking more generally backpatch to 9.4 was completely wrong: there were multiple errors. It's my oversight, I forget how much better our xlog system became since 9.4 :) I've pushed bf0e5a73be fixing that. ------ 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