pgsql: Fix deadlock between ginDeletePage() and ginStepRight() - Mailing list pgsql-committers

From Alexander Korotkov
Subject pgsql: Fix deadlock between ginDeletePage() and ginStepRight()
Date
Msg-id E1iXAjt-0001cB-Gs@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Fix deadlock between ginDeletePage() and ginStepRight()

When ginDeletePage() is about to delete page it locks its left sibling to revise
the rightlink.  So, it locks pages in right to left manner.  Int he same time
ginStepRight() locks pages in left to right manner, and that could cause a
deadlock.

This commit makes ginScanToDelete() keep exclusive lock on left siblings of
currently investigated path.  That elimites need to relock left sibling in
ginDeletePage().  Thus, deadlock with ginStepRight() can't happen anymore.

Reported-by: Chen Huajun
Discussion: https://postgr.es/m/5c332bd1.87b6.16d7c17aa98.Coremail.chjischj%40163.com
Author: Alexander Korotkov
Reviewed-by: Peter Geoghegan
Backpatch-through: 10

Branch
------
master

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

Modified Files
--------------
src/backend/access/gin/README      | 79 ++++++++++++++++++++++----------------
src/backend/access/gin/ginvacuum.c | 54 +++++++++++++++++---------
2 files changed, 81 insertions(+), 52 deletions(-)


pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: Doc: clarify use of RECURSIVE in WITH.
Next
From: Alexander Korotkov
Date:
Subject: pgsql: Fix traversing to the deleted GIN page via downlink