From 402822246866e1094d35a617775a65b4be93d322 Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Fri, 26 Jun 2015 18:13:05 -0300
Subject: [PATCH] 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
---
 src/backend/access/brin/brin_xlog.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

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