postgres.git / summary / log / commit / refs

commit    4c73ec604844ad2c0b496e401a339b09edd8ef3e
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Mon Nov 13 16:44:35 2023 +0000
First released in: 17.0, 12.18, 13.14, 14.11, 15.6, 16.2

    Don't release index root page pin in ginFindParents().
    
    It's clearly stated in the comments that ginFindParents() must keep
    the pin on the index's root page that's associated with the topmost
    GinBtreeStack item.  However, the code path for the case that the
    desired downlink has been pushed down to the next index level
    ignored this proviso, and would release the pin anyway if we were
    still examining the root level.  That led to an assertion failure
    or "buffer NNNN is not owned by resource owner" error later, when
    we try to release the pin again at the end of the insertion.
    
    This is quite hard to reproduce, since it can only happen if an
    index root page split occurs concurrently with our own insertion.
    Thanks to Jeff Janes for finding a test case that triggers it
    often enough to allow investigation.
    
    This has been there since the beginning of GIN, so back-patch
    to all supported branches.
    
    Discussion: https://postgr.es/m/CAMkU=1yCAKtv86dMrD__Ja-7KzjE=uMeKX8y__cx5W-OEWy2ow@mail.gmail.com


src/backend/access/gin/ginbtree.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backend/access/gin/ginbtree.c b/src/backend/access/gin/ginbtree.c index cc6d4e63382..3113ec8f57a 100644 --- a/src/backend/access/gin/ginbtree.c +++ b/src/backend/access/gin/ginbtree.c @@ -274,7 +274,11 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack) blkno = GinPageGetOpaque(page)->rightlink; if (blkno == InvalidBlockNumber) { - UnlockReleaseBuffer(buffer); + /* Link not present in this level */ + LockBuffer(buffer, GIN_UNLOCK); + /* Do not release pin on the root buffer */ + if (buffer != root->buffer) + ReleaseBuffer(buffer); break; } buffer = ginStepRight(buffer, btree->index, GIN_EXCLUSIVE); [parent: 06169ffda3b6]