aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-04-07 14:34:31 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-04-07 14:37:30 +0300
commit594bac42728fed67e05458633f35c2b1d7b38f1e (patch)
tree7f90777c4c59a7dcba3df10ca80918011e5097df
parent7d8f1de1bc04bf8ddda6548156ef32f46e13dd50 (diff)
downloadpostgresql-594bac42728fed67e05458633f35c2b1d7b38f1e.tar.gz
postgresql-594bac42728fed67e05458633f35c2b1d7b38f1e.zip
Fix WAL replay bug in the new GIN incomplete-split code.
Forgot to set the incomplete-split flag on the left page half, in redo of a page split. Spotted this by comparing the page contents on master and standby, after inserting/applying each WAL record.
-rw-r--r--src/backend/access/gin/ginxlog.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index f65a98d95ff..a263a1350cf 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -461,7 +461,9 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
rbuffer;
Page lpage,
rpage;
- uint32 flags = 0;
+ uint32 flags;
+ uint32 lflags,
+ rflags;
char *payload;
bool isLeaf = (data->flags & GIN_INSERT_ISLEAF) != 0;
bool isData = (data->flags & GIN_INSERT_ISDATA) != 0;
@@ -481,6 +483,7 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
ginRedoClearIncompleteSplit(lsn, data->node, data->leftChildBlkno);
}
+ flags = 0;
if (isLeaf)
flags |= GIN_LEAF;
if (isData)
@@ -488,15 +491,19 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
if (isLeaf && isData)
flags |= GIN_COMPRESSED;
+ lflags = rflags = flags;
+ if (!isRoot)
+ lflags |= GIN_INCOMPLETE_SPLIT;
+
lbuffer = XLogReadBuffer(data->node, data->lblkno, true);
Assert(BufferIsValid(lbuffer));
lpage = (Page) BufferGetPage(lbuffer);
- GinInitBuffer(lbuffer, flags);
+ GinInitBuffer(lbuffer, lflags);
rbuffer = XLogReadBuffer(data->node, data->rblkno, true);
Assert(BufferIsValid(rbuffer));
rpage = (Page) BufferGetPage(rbuffer);
- GinInitBuffer(rbuffer, flags);
+ GinInitBuffer(rbuffer, rflags);
GinPageGetOpaque(lpage)->rightlink = BufferGetBlockNumber(rbuffer);
GinPageGetOpaque(rpage)->rightlink = isRoot ? InvalidBlockNumber : data->rrlink;