Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 9945ad6

Browse files
Justify nbtree page split locking in code comment.
Delaying unlocking the right child page until after the point that the left child's parent page has been refound is no longer truly necessary. Commit 40dae7e made nbtree tolerant of interrupted page splits. VACUUM was taught to avoid deleting a page that happens to be the right half of an incomplete split. As long as page splits don't unlock the left child page until the end of the second/final phase, it should be safe to unlock the right child page earlier (at the end of the first phase). It probably isn't actually useful to release the right child's lock earlier like this (it probably won't improve performance). Even still, pointing out that it ought to be safe to do so should make it easier to understand the overall design.
1 parent 1e61480 commit 9945ad6

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

src/backend/access/nbtree/nbtinsert.c

+11-2
Original file line numberDiff line numberDiff line change
@@ -2128,8 +2128,17 @@ _bt_insert_parent(Relation rel,
21282128
pbuf = _bt_getstackbuf(rel, stack, bknum);
21292129

21302130
/*
2131-
* Now we can unlock the right child. The left child will be unlocked
2132-
* by _bt_insertonpg().
2131+
* Unlock the right child. The left child will be unlocked in
2132+
* _bt_insertonpg().
2133+
*
2134+
* Unlocking the right child must be delayed until here to ensure that
2135+
* no concurrent VACUUM operation can become confused. Page deletion
2136+
* cannot be allowed to fail to re-find a downlink for the rbuf page.
2137+
* (Actually, this is just a vestige of how things used to work. The
2138+
* page deletion code is expected to check for the INCOMPLETE_SPLIT
2139+
* flag on the left child. It won't attempt deletion of the right
2140+
* child until the split is complete. Despite all this, we opt to
2141+
* conservatively delay unlocking the right child until here.)
21332142
*/
21342143
_bt_relbuf(rel, rbuf);
21352144

0 commit comments

Comments
 (0)