diff options
Diffstat (limited to 'src/backend/storage/smgr')
-rw-r--r-- | src/backend/storage/smgr/md.c | 9 | ||||
-rw-r--r-- | src/backend/storage/smgr/smgr.c | 17 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 5034a1dc4d0..7f44606c1a9 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -288,6 +288,9 @@ mdcreate(SMgrRelation reln, ForkNumber forkNum, bool isRedo) pfree(path); + if (reln->smgr_transient) + FileSetTransient(fd); + reln->md_fd[forkNum] = _fdvec_alloc(); reln->md_fd[forkNum]->mdfd_vfd = fd; @@ -542,6 +545,9 @@ mdopen(SMgrRelation reln, ForkNumber forknum, ExtensionBehavior behavior) pfree(path); + if (reln->smgr_transient) + FileSetTransient(fd); + reln->md_fd[forknum] = mdfd = _fdvec_alloc(); mdfd->mdfd_vfd = fd; @@ -1556,6 +1562,9 @@ _mdfd_openseg(SMgrRelation reln, ForkNumber forknum, BlockNumber segno, if (fd < 0) return NULL; + if (reln->smgr_transient) + FileSetTransient(fd); + /* allocate an mdfdvec entry for it */ v = _fdvec_alloc(); diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index a6610bf4f82..be89ee6d919 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -165,17 +165,34 @@ smgropen(RelFileNode rnode, BackendId backend) reln->smgr_targblock = InvalidBlockNumber; reln->smgr_fsm_nblocks = InvalidBlockNumber; reln->smgr_vm_nblocks = InvalidBlockNumber; + reln->smgr_transient = false; reln->smgr_which = 0; /* we only have md.c at present */ /* mark it not open */ for (forknum = 0; forknum <= MAX_FORKNUM; forknum++) reln->md_fd[forknum] = NULL; } + else + /* if it was transient before, it no longer is */ + reln->smgr_transient = false; return reln; } /* + * smgrsettransient() -- mark an SMgrRelation object as transaction-bound + * + * The main effect of this is that all opened files are marked to be + * kernel-level closed (but not necessarily VFD-closed) when the current + * transaction ends. + */ +void +smgrsettransient(SMgrRelation reln) +{ + reln->smgr_transient = true; +} + +/* * smgrsetowner() -- Establish a long-lived reference to an SMgrRelation object * * There can be only one owner at a time; this is sufficient since currently |