diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c index 130649601c..e0f79e3522 100644 --- a/src/backend/storage/freespace/freespace.c +++ b/src/backend/storage/freespace/freespace.c @@ -30,6 +30,7 @@ #include "storage/fsm_internals.h" #include "storage/lmgr.h" #include "storage/smgr.h" +#include "utils/inval.h" #include "utils/memutils.h" @@ -167,7 +168,6 @@ GetPageWithFreeSpace(Relation rel, Size spaceNeeded, bool check_fsm_only) * during bootstrapping or in a recently-started system. */ target_block = nblocks - 1; - fsm_clear_local_map(rel); return target_block; } else if (nblocks > 0) @@ -776,7 +776,10 @@ fsm_extend(Relation rel, BlockNumber fsm_nblocks) if ((rel->rd_smgr->smgr_fsm_nblocks == 0 || rel->rd_smgr->smgr_fsm_nblocks == InvalidBlockNumber) && !smgrexists(rel->rd_smgr, FSM_FORKNUM)) + { smgrcreate(rel->rd_smgr, FSM_FORKNUM, false); + fsm_clear_local_map(rel); + } fsm_nblocks_now = smgrnblocks(rel->rd_smgr, FSM_FORKNUM); @@ -1175,5 +1178,8 @@ fsm_clear_local_map(Relation rel) rel->fsm_local_map->nblocks = 0; memset(&rel->fsm_local_map->map, FSM_LOCAL_NOT_AVAIL, sizeof(rel->fsm_local_map->map)); + + /* Notify other backends that their local maps out of date. */ + CacheInvalidateRelcache(rel); } }