Fix BRIN xlog replay

There was a confusion about which block number to use when storing an
item's pointer in the revmap -- the revmap page's blkno was being used,
not the data page's blkno.

Spotted-by: Jeff Janes
This commit is contained in:
Alvaro Herrera 2015-06-26 18:13:05 -03:00
parent 7c02d48e69
commit 4028222468

View File

@ -47,6 +47,7 @@ brin_xlog_insert_update(XLogReaderState *record,
{ {
XLogRecPtr lsn = record->EndRecPtr; XLogRecPtr lsn = record->EndRecPtr;
Buffer buffer; Buffer buffer;
BlockNumber regpgno;
Page page; Page page;
XLogRedoAction action; XLogRedoAction action;
@ -66,6 +67,9 @@ brin_xlog_insert_update(XLogReaderState *record,
action = XLogReadBufferForRedo(record, 0, &buffer); action = XLogReadBufferForRedo(record, 0, &buffer);
} }
/* need this page's blkno to store in revmap */
regpgno = BufferGetBlockNumber(buffer);
/* insert the index item into the page */ /* insert the index item into the page */
if (action == BLK_NEEDS_REDO) if (action == BLK_NEEDS_REDO)
{ {
@ -97,9 +101,8 @@ brin_xlog_insert_update(XLogReaderState *record,
if (action == BLK_NEEDS_REDO) if (action == BLK_NEEDS_REDO)
{ {
ItemPointerData tid; ItemPointerData tid;
BlockNumber blkno = BufferGetBlockNumber(buffer);
ItemPointerSet(&tid, blkno, xlrec->offnum); ItemPointerSet(&tid, regpgno, xlrec->offnum);
page = (Page) BufferGetPage(buffer); page = (Page) BufferGetPage(buffer);
brinSetHeapBlockItemptr(buffer, xlrec->pagesPerRange, xlrec->heapBlk, brinSetHeapBlockItemptr(buffer, xlrec->pagesPerRange, xlrec->heapBlk,