pgsql: In B-tree page deletion, clean up properly after page deletion f - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: In B-tree page deletion, clean up properly after page deletion f
Date
Msg-id E1bW6L5-0006Am-QJ@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
In B-tree page deletion, clean up properly after page deletion failure.

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 efada2b8e.
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>

Branch
------
REL9_4_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/98d5f366bc28ad3393d4ad9f2ee4cf9b884087f6

Modified Files
--------------
src/backend/access/nbtree/nbtpage.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)


pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: In B-tree page deletion, clean up properly after page deletion f
Next
From: Tom Lane
Date:
Subject: pgsql: First-draft release notes for 9.5.4.