mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
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.
This commit is contained in:
@ -461,7 +461,9 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
|
|||||||
rbuffer;
|
rbuffer;
|
||||||
Page lpage,
|
Page lpage,
|
||||||
rpage;
|
rpage;
|
||||||
uint32 flags = 0;
|
uint32 flags;
|
||||||
|
uint32 lflags,
|
||||||
|
rflags;
|
||||||
char *payload;
|
char *payload;
|
||||||
bool isLeaf = (data->flags & GIN_INSERT_ISLEAF) != 0;
|
bool isLeaf = (data->flags & GIN_INSERT_ISLEAF) != 0;
|
||||||
bool isData = (data->flags & GIN_INSERT_ISDATA) != 0;
|
bool isData = (data->flags & GIN_INSERT_ISDATA) != 0;
|
||||||
@ -481,6 +483,7 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
|
|||||||
ginRedoClearIncompleteSplit(lsn, data->node, data->leftChildBlkno);
|
ginRedoClearIncompleteSplit(lsn, data->node, data->leftChildBlkno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flags = 0;
|
||||||
if (isLeaf)
|
if (isLeaf)
|
||||||
flags |= GIN_LEAF;
|
flags |= GIN_LEAF;
|
||||||
if (isData)
|
if (isData)
|
||||||
@ -488,15 +491,19 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record)
|
|||||||
if (isLeaf && isData)
|
if (isLeaf && isData)
|
||||||
flags |= GIN_COMPRESSED;
|
flags |= GIN_COMPRESSED;
|
||||||
|
|
||||||
|
lflags = rflags = flags;
|
||||||
|
if (!isRoot)
|
||||||
|
lflags |= GIN_INCOMPLETE_SPLIT;
|
||||||
|
|
||||||
lbuffer = XLogReadBuffer(data->node, data->lblkno, true);
|
lbuffer = XLogReadBuffer(data->node, data->lblkno, true);
|
||||||
Assert(BufferIsValid(lbuffer));
|
Assert(BufferIsValid(lbuffer));
|
||||||
lpage = (Page) BufferGetPage(lbuffer);
|
lpage = (Page) BufferGetPage(lbuffer);
|
||||||
GinInitBuffer(lbuffer, flags);
|
GinInitBuffer(lbuffer, lflags);
|
||||||
|
|
||||||
rbuffer = XLogReadBuffer(data->node, data->rblkno, true);
|
rbuffer = XLogReadBuffer(data->node, data->rblkno, true);
|
||||||
Assert(BufferIsValid(rbuffer));
|
Assert(BufferIsValid(rbuffer));
|
||||||
rpage = (Page) BufferGetPage(rbuffer);
|
rpage = (Page) BufferGetPage(rbuffer);
|
||||||
GinInitBuffer(rbuffer, flags);
|
GinInitBuffer(rbuffer, rflags);
|
||||||
|
|
||||||
GinPageGetOpaque(lpage)->rightlink = BufferGetBlockNumber(rbuffer);
|
GinPageGetOpaque(lpage)->rightlink = BufferGetBlockNumber(rbuffer);
|
||||||
GinPageGetOpaque(rpage)->rightlink = isRoot ? InvalidBlockNumber : data->rrlink;
|
GinPageGetOpaque(rpage)->rightlink = isRoot ? InvalidBlockNumber : data->rrlink;
|
||||||
|
Reference in New Issue
Block a user