postgres.git / summary / log / commit / refs

commit    7ddba19eb7114fd34f54986d83a1ad50b1db9537
Author:   Peter Geoghegan <pg@bowt.ie>
Date:     Thu Jun 22 00:41:48 2023 +0000
First released in: 16.0, 11.21, 12.16, 13.12, 14.9, 15.4

    nbtree VACUUM: cope with topparent inconsistencies.
    
    Avoid "right sibling %u of block %u is not next child" errors when
    vacuuming a corrupt nbtree index.  Just LOG the issue and press on.
    That way VACUUM will have a decent chance of finishing off all required
    processing for the index (and for the table as a whole).
    
    This is similar to recent work from commit 5abff197, as well as work
    from commit 5b861baa (later backpatched as commit 43e409ce), which
    taught nbtree VACUUM to keep going when its "re-find" check fails.  The
    hardening added by this commit takes place directly after the "re-find"
    check, right before the critical section for the first stage of page
    deletion.
    
    Author: Peter Geoghegan <pg@bowt.ie>
    Discussion: https://postgr.es/m/CAH2-Wz=dayg0vjs4+er84TS9ami=csdzjpuiCGbEw=idhwqhzQ@mail.gmail.com
    Backpatch: 11- (all supported versions).


src/backend/access/nbtree/nbtpage.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 6abc8292c9b..a3dd77d5a8d 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -1610,9 +1610,19 @@ _bt_mark_page_halfdead(Relation rel, Buffer leafbuf, BTStack stack) itemid = PageGetItemId(page, nextoffset); itup = (IndexTuple) PageGetItem(page, itemid); if (BTreeInnerTupleGetDownLink(itup) != rightsib) - elog(ERROR, "right sibling %u of block %u is not next child %u of block %u in index \"%s\"", - rightsib, target, BTreeInnerTupleGetDownLink(itup), - BufferGetBlockNumber(topparent), RelationGetRelationName(rel)); + { + ereport(LOG, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg_internal("right sibling %u of block %u is not next child %u of block %u in index \"%s\"", + rightsib, target, + BTreeInnerTupleGetDownLink(itup), + BufferGetBlockNumber(topparent), + RelationGetRelationName(rel)))); + + _bt_relbuf(rel, topparent); + + return false; + } /* * Any insert which would have gone on the leaf block will now go to its [parent: 5f5c38bdba6d]