postgres.git / summary / log / commit / refs

commit    f46b971145c66fe608ca3410a2807a8ab2e5e2f5
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Thu Dec 24 17:52:11 2009 +0000
First released in: 9.0.0, 8.2.16, 8.3.10, 8.4.3

    Fix wrong WAL info value generated when gistContinueInsert() performs an
    index page split.  This would result in index corruption, or even more likely
    an error during WAL replay, if we were unlucky enough to crash during
    end-of-recovery cleanup after having completed an incomplete GIST insertion.
    
    Yoichi Hirai


src/backend/access/gist/gistxlog.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c index 672d714e014..cbbb5f06647 100644 --- a/src/backend/access/gist/gistxlog.c +++ b/src/backend/access/gist/gistxlog.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.32 2009/01/20 18:59:36 heikki Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.32.2.1 2009/12/24 17:52:11 tgl Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" @@ -644,6 +644,7 @@ gistContinueInsert(gistIncompleteInsert *insert) int j, k, pituplen = 0; + uint8 xlinfo; XLogRecData *rdata; XLogRecPtr recptr; Buffer tempbuffer = InvalidBuffer; @@ -732,6 +733,7 @@ gistContinueInsert(gistIncompleteInsert *insert) for (j = 0; j < ntodelete; j++) PageIndexTupleDelete(pages[0], todelete[j]); + xlinfo = XLOG_GIST_PAGE_SPLIT; rdata = formSplitRdata(index->rd_node, insert->path[i], false, &(insert->key), gistMakePageLayout(buffers, numbuffer)); @@ -745,6 +747,7 @@ gistContinueInsert(gistIncompleteInsert *insert) PageIndexTupleDelete(pages[0], todelete[j]); gistfillbuffer(pages[0], itup, lenitup, InvalidOffsetNumber); + xlinfo = XLOG_GIST_PAGE_UPDATE; rdata = formUpdateRdata(index->rd_node, buffers[0], todelete, ntodelete, itup, lenitup, &(insert->key)); @@ -761,7 +764,7 @@ gistContinueInsert(gistIncompleteInsert *insert) GistPageGetOpaque(pages[j])->rightlink = InvalidBlockNumber; MarkBufferDirty(buffers[j]); } - recptr = XLogInsert(RM_GIST_ID, XLOG_GIST_PAGE_UPDATE, rdata); + recptr = XLogInsert(RM_GIST_ID, xlinfo, rdata); for (j = 0; j < numbuffer; j++) { PageSetLSN(pages[j], recptr); [parent: a1ffb012174d]