Fix wrong WAL info value generated when gistContinueInsert() performs an
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 24 Dec 2009 17:52:04 +0000 (17:52 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 24 Dec 2009 17:52:04 +0000 (17:52 +0000)
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

index 7a9f8934cf4e008303de3f38bf73b2757c62511b..d6aeb22f3c54060fa108a9d4038b169c1aa5515d 100644 (file)
@@ -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.33 2009/12/19 01:32:32 sriggs Exp $
+ *                      $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.34 2009/12/24 17:52:04 tgl Exp $
  *-------------------------------------------------------------------------
  */
 #include "postgres.h"
@@ -650,6 +650,7 @@ gistContinueInsert(gistIncompleteInsert *insert)
                        int                     j,
                                                k,
                                                pituplen = 0;
+                       uint8           xlinfo;
                        XLogRecData *rdata;
                        XLogRecPtr      recptr;
                        Buffer          tempbuffer = InvalidBuffer;
@@ -738,6 +739,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));
@@ -751,6 +753,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));
@@ -767,7 +770,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);