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); } /*