From 13bd93d5f20ae33b3ba028df32f5a18c90403945 Mon Sep 17 00:00:00 2001
From: Kirk Jamison <k.jamison@jp.fujitsu.com>
Date: Wed, 23 Sep 2020 07:15:30 +0000
Subject: [PATCH v33 1/4] Prevent invalidating blocks in smgrextend() during
 recovery.

DropRelFileNodeBuffers relies on the behavior that cached blocks
returned by smgrnblocks() won't be invalidated by file extension
during recovery.
---
 src/backend/storage/smgr/smgr.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c
index dcc09df..f476b8e 100644
--- a/src/backend/storage/smgr/smgr.c
+++ b/src/backend/storage/smgr/smgr.c
@@ -474,7 +474,14 @@ smgrextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum,
 	if (reln->smgr_cached_nblocks[forknum] == blocknum)
 		reln->smgr_cached_nblocks[forknum] = blocknum + 1;
 	else
+	{
+		/*
+		 * DropRelFileNodeBuffers relies on the behavior that cached nblocks
+		 * won't be invalidated by file extension during recovery.
+		 */
+		Assert(!InRecovery);
 		reln->smgr_cached_nblocks[forknum] = InvalidBlockNumber;
+	}
 }
 
 /*
-- 
1.8.3.1

