From 594bac42728fed67e05458633f35c2b1d7b38f1e Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas <heikki.linnakangas@iki.fi> Date: Mon, 7 Apr 2014 14:34:31 +0300 Subject: [PATCH] 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. --- src/backend/access/gin/ginxlog.c | 13 ++++++++++--- 1 file 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; -- GitLab