From 6d23840242385f9f28d11354dc0a30e3a9f36b87 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 28 Mar 2006 21:17:44 +0000 Subject: [PATCH] Repair longstanding error in btree xlog replay: XLogReadBuffer should be passed extend = true whenever we are reading a page we intend to reinitialize completely, even if we think the page "should exist". This is because it might indeed not exist, if the relation got truncated sometime after the current xlog record was made and before the crash we're trying to recover from. These two thinkos appear to explain both of the old bug reports discussed here: http://archives.postgresql.org/pgsql-hackers/2005-05/msg01369.php --- src/backend/access/nbtree/nbtxlog.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index 95df7213ee..4803efa9e6 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -258,7 +258,7 @@ btree_xlog_split(bool redo, bool onleft, bool isroot, rightsib = (onleft) ? xlrec->otherblk : targetblk; /* Left (original) sibling */ - buffer = XLogReadBuffer(false, reln, leftsib); + buffer = XLogReadBuffer(true, reln, leftsib); if (!BufferIsValid(buffer)) elog(PANIC, "btree_split_%s: lost left sibling", op); @@ -551,7 +551,7 @@ btree_xlog_delete_page(bool redo, bool ismeta, } /* Rewrite target page as empty deleted page */ - buffer = XLogReadBuffer(false, reln, target); + buffer = XLogReadBuffer(true, reln, target); if (!BufferIsValid(buffer)) elog(PANIC, "btree_delete_page_%s: lost target page", op); page = (Page) BufferGetPage(buffer); -- 2.39.5