diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 34ba385..3d891a7 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -7816,6 +7816,7 @@ heap_xlog_visible(XLogReaderState *record)
 	RelFileNode rnode;
 	BlockNumber blkno;
 	XLogRedoAction action;
+	Relation reln;
 
 	XLogRecGetBlockTag(record, 1, &rnode, NULL, &blkno);
 
@@ -7870,6 +7871,8 @@ heap_xlog_visible(XLogReaderState *record)
 	if (BufferIsValid(buffer))
 		UnlockReleaseBuffer(buffer);
 
+	reln = CreateFakeRelcacheEntry(rnode);
+
 	/*
 	 * Even if we skipped the heap page update due to the LSN interlock, it's
 	 * still safe to update the visibility map.  Any WAL record that clears
@@ -7880,7 +7883,6 @@ heap_xlog_visible(XLogReaderState *record)
 									  &vmbuffer) == BLK_NEEDS_REDO)
 	{
 		Page		vmpage = BufferGetPage(vmbuffer);
-		Relation	reln;
 
 		/* initialize the page if it was read as zeros */
 		if (PageIsNew(vmpage))
@@ -7892,7 +7894,6 @@ heap_xlog_visible(XLogReaderState *record)
 		 */
 		LockBuffer(vmbuffer, BUFFER_LOCK_UNLOCK);
 
-		reln = CreateFakeRelcacheEntry(rnode);
 		visibilitymap_pin(reln, blkno, &vmbuffer);
 
 		/*
@@ -7911,10 +7912,13 @@ heap_xlog_visible(XLogReaderState *record)
 							  xlrec->cutoff_xid, xlrec->flags);
 
 		ReleaseBuffer(vmbuffer);
-		FreeFakeRelcacheEntry(reln);
 	}
 	else if (BufferIsValid(vmbuffer))
 		UnlockReleaseBuffer(vmbuffer);
+
+	RelationOpenSmgr(reln);
+	CacheInvalidateSmgr(reln->rd_smgr->smgr_rnode);
+	FreeFakeRelcacheEntry(reln);
 }
 
 /*
