pgsql: Fix deadlock in GIN vacuum introduced by 218f51584d5

From: Alexander Korotkov <akorotkov(at)postgresql(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix deadlock in GIN vacuum introduced by 218f51584d5
Date: 2018-12-13 03:56:34
Message-ID: E1gXI70-0005UF-Qv@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix deadlock in GIN vacuum introduced by 218f51584d5

Before 218f51584d5 if posting tree page is about to be deleted, then the whole
posting tree is locked by LockBufferForCleanup() on root preventing all the
concurrent inserts. 218f51584d5 reduced locking to the subtree containing
page to be deleted. However, due to concurrent parent split, inserter doesn't
always holds pins on all the pages constituting path from root to the target
leaf page. That could cause a deadlock between GIN vacuum process and GIN
inserter. And we didn't find non-invasive way to fix this.

This commit reverts VACUUM behavior to lock the whole posting tree before
delete any page. However, we keep another useful change by 218f51584d5: the
tree is locked only if there are pages to be deleted.

Reported-by: Chen Huajun
Diagnosed-by: Chen Huajun, Andrey Borodin, Peter Geoghegan
Discussion: https://postgr.es/m/31a702a.14dd.166c1366ac1.Coremail.chjischj%40163.com
Author: Alexander Korotkov, based on ideas from Andrey Borodin and Peter Geoghegan
Reviewed-by: Andrey Borodin
Backpatch-through: 10

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/fd83c83d0943a6717dbe521efa10da9dce94e4cd

Modified Files
--------------
src/backend/access/gin/README | 15 +---
src/backend/access/gin/ginvacuum.c | 148 +++++++++++++++++--------------------
2 files changed, 73 insertions(+), 90 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Tom Lane 2018-12-13 18:24:53 pgsql: Drop no-op CoerceToDomain nodes from expressions at planning tim
Previous Message Alexander Korotkov 2018-12-13 03:56:28 pgsql: Prevent GIN deleted pages from being reclaimed too early