Re: Connections hang indefinitely while taking a gin index's LWLock buffer_content lock

x4mmm@yandex-team.ru

From: Andrey Borodin <x4mmm@yandex-team.ru>
To: Peter Geoghegan <pg@bowt.ie>
Cc: chjischj@163.com, Teodor Sigaev <teodor@sigaev.ru>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2018-11-14T18:11:12Z
Lists: pgsql-hackers

Attachments

<html><head></head><body dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div class="ApplePlainTextBody">Hi everyone!<br><br>I didn't noticed this thread for too long somehow, sorry.<br><br><blockquote type="cite">8 нояб. 2018 г., в 6:46, Peter Geoghegan &lt;pg@bowt.ie&gt; написал(а):<br><br>I don't think<br>the general "there can't be any inserters at this subtree" thing works<br>given that we have to couple buffer locks when moving right for other<br>reasons. We call ginStepRight() within ginFinishSplit(), for reasons<br>that date back to bug fix commit ac4ab97e from 2013 -- that detail is<br>probably important, because it seems to be what breaks the subtree<br>design (we don't delete in two phases or anything in GIN).<br></blockquote><br>ginVacuumPostingTreeLeaves() holds LockBufferForCleanup() on subtree root b.<br>Thus there may be no GinBtreeStack's holding pin on b at the moment.<br>When you ginStepRight(b) to the parent in ginFinishSplit(), you always get to the buffer from your stack.<br>Hence you can never have ginFinishSplit() deadlock with cleanup of subtree whose root is LockBufferForCleanup()'d.<br><br>Is this correct or did I miss something?<br><br>But we have a deadlock at hand, I'll think more about it. Something with locking protocol is clearly wrong.<br><br><blockquote type="cite">11 нояб. 2018 г., в 22:33, chenhj &lt;chjischj@163.com&gt; написал(а):<br><br>The order of get lwlock in ginRedoDeletePage() may should be change from "dbuffer-&gt;pbuffer-&gt;lbuffer" to "lbuffer-&gt;dbuffer-&gt;pbuffer" . Is this right?<br></blockquote><br>This looks correct to me.<br><br>Best regards, Andrey Borodin.</div></body></html>

Commits

  1. Fix WAL format incompatibility introduced by backpatching of 52ac6cd2d0

  2. Fix wrong backpatching of ginRedoDeletePage() deadlock fix

  3. Fix deadlock in GIN vacuum introduced by 218f51584d5

  4. Prevent GIN deleted pages from being reclaimed too early

  5. Prevent deadlock in ginRedoDeletePage()

  6. Reduce page locking in GIN vacuum

  7. Fix race condition in GIN posting tree page deletion.