• Tom Lane's avatar
    In B-tree page deletion, clean up properly after page deletion failure. · e89526d4
    Tom Lane authored
    In _bt_unlink_halfdead_page(), we might fail to find an immediate left
    sibling of the target page, perhaps because of corruption of the page
    sibling links.  The code intends to cope with this by just abandoning
    the deletion attempt; but what actually happens is that it fails outright
    due to releasing the same buffer lock twice.  (And error recovery masks
    a second problem, which is possible leakage of a pin on another page.)
    Seems to have been introduced by careless refactoring in commit efada2b8.
    Since there are multiple cases to consider, let's make releasing the buffer
    lock in the failure case the responsibility of _bt_unlink_halfdead_page()
    not its caller.
    
    Also, avoid fetching the leaf page's left-link again after we've dropped
    lock on the page.  This is probably harmless, but it's not exactly good
    coding practice.
    
    Per report from Kyotaro Horiguchi.  Back-patch to 9.4 where the faulty code
    was introduced.
    
    Discussion: <20160803.173116.111915228.horiguchi.kyotaro@lab.ntt.co.jp>
    e89526d4
nbtpage.c 57.2 KB