]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Repair longstanding error in btree xlog replay: XLogReadBuffer should be
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Mar 2006 21:17:44 +0000 (21:17 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Mar 2006 21:17:44 +0000 (21:17 +0000)
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

index 0bd2c418f03c228eda7bb1c7fa833506b44a91d7..e352c1de7ff9dab6125fd233ddc654f24ae865d1 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.19 2004/12/31 21:59:22 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.19.4.1 2006/03/28 21:17:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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);