• Alexander Korotkov's avatar
    Fix deadlock in GIN vacuum introduced by 218f5158 · fd83c83d
    Alexander Korotkov authored
    Before 218f5158 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.  218f5158 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 218f5158: 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
    fd83c83d
README 19.5 KB