Fix deadlock between ginDeletePage() and ginStepRight()
authorAlexander Korotkov <akorotkov@postgresql.org>
Tue, 19 Nov 2019 20:07:36 +0000 (23:07 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Tue, 19 Nov 2019 21:05:35 +0000 (00:05 +0300)
commit21ad61ab31786128ae780feca8fcf766bbb6a579
tree3af32d02df2ea8edd0ce19c5b6d99f5e9a38ee1a
parentf1155901fa598f3476a489152fbfe37a5833613c
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
src/backend/access/gin/README
src/backend/access/gin/ginvacuum.c