diff --git a/src/backend/access/heap/visibilitymap.c b/src/backend/access/heap/visibilitymap.c new file mode 100644 index 76b3a46..472b780 *** a/src/backend/access/heap/visibilitymap.c --- b/src/backend/access/heap/visibilitymap.c *************** *** 88,93 **** --- 88,94 ---- #include "storage/bufmgr.h" #include "storage/lmgr.h" #include "storage/smgr.h" + #include "utils/inval.h" /*#define TRACE_VISIBILITYMAP */ *************** vm_readbuf(Relation rel, BlockNumber blk *** 486,497 **** /* * If we haven't cached the size of the visibility map fork yet, check it ! * first. Also recheck if the requested block seems to be past end, since ! * our cached value might be stale. (We send smgr inval messages on ! * truncation, but not on extension.) */ ! if (rel->rd_smgr->smgr_vm_nblocks == InvalidBlockNumber || ! blkno >= rel->rd_smgr->smgr_vm_nblocks) { if (smgrexists(rel->rd_smgr, VISIBILITYMAP_FORKNUM)) rel->rd_smgr->smgr_vm_nblocks = smgrnblocks(rel->rd_smgr, --- 487,497 ---- /* * If we haven't cached the size of the visibility map fork yet, check it ! * first. This will also catch any changes to the visibility map's size ! * made by other backends, since we send smgr inval messages on create, ! * extend and truncate. */ ! if (rel->rd_smgr->smgr_vm_nblocks == InvalidBlockNumber) { if (smgrexists(rel->rd_smgr, VISIBILITYMAP_FORKNUM)) rel->rd_smgr->smgr_vm_nblocks = smgrnblocks(rel->rd_smgr, *************** vm_extend(Relation rel, BlockNumber vm_n *** 560,565 **** --- 560,575 ---- vm_nblocks_now = smgrnblocks(rel->rd_smgr, VISIBILITYMAP_FORKNUM); + /* + * Send a shared-inval message to force other backends to close any smgr + * references they may have for this rel, which we are about to change. + * This is a useful optimization because it means that backends don't have + * to keep checking for creation or extension of the file, which happens + * infrequently. + */ + CacheInvalidateSmgr(rel->rd_smgr->smgr_rnode); + + /* Now extend the file */ while (vm_nblocks_now < vm_nblocks) { smgrextend(rel->rd_smgr, VISIBILITYMAP_FORKNUM, vm_nblocks_now,