diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c index 130649601c..11fcc038d1 100644 --- a/src/backend/storage/freespace/freespace.c +++ b/src/backend/storage/freespace/freespace.c @@ -1087,9 +1087,30 @@ fsm_allow_writes(Relation rel, BlockNumber heapblk, skip_get_nblocks = false; } + /* Might have to re-open if a cache flush happened */ RelationOpenSmgr(rel); - if (smgrexists(rel->rd_smgr, FSM_FORKNUM)) + + /* If we haven't cached the size of the FSM yet, check it directly. */ + if (rel->rd_smgr->smgr_fsm_nblocks == InvalidBlockNumber) + { + if (smgrexists(rel->rd_smgr, FSM_FORKNUM)) + { + rel->rd_smgr->smgr_fsm_nblocks = smgrnblocks(rel->rd_smgr, + FSM_FORKNUM); + return true; + } + else + { + rel->rd_smgr->smgr_fsm_nblocks = 0; + } + } + /* If smgr_fsm_nblocks is positive then it must exist. */ + else if (rel->rd_smgr->smgr_fsm_nblocks > 0) + { return true; + } + + /* smgr_fsm_nblocks == 0 means it doesn't exist, do nothing. */ if (skip_get_nblocks) return false;