diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/transam/xlogutils.c | 3 | ||||
-rw-r--r-- | src/backend/storage/smgr/smgr.c | 18 | ||||
-rw-r--r-- | src/include/storage/smgr.h | 1 |
3 files changed, 22 insertions, 0 deletions
diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index 1811c91d581..8f0bbc21dbb 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -413,6 +413,9 @@ CreateFakeRelcacheEntry(RelFileNode rnode) void FreeFakeRelcacheEntry(Relation fakerel) { + /* make sure the fakerel is not referenced by the SmgrRelation anymore */ + if (fakerel->rd_smgr != NULL) + smgrclearowner(&fakerel->rd_smgr, fakerel->rd_smgr); pfree(fakerel); } diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index 7d1cd5af168..9379e337930 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -194,6 +194,24 @@ smgrsetowner(SMgrRelation *owner, SMgrRelation reln) } /* + * smgrclearowner() -- Remove long-lived reference to an SMgrRelation object + * if one exists + */ +void +smgrclearowner(SMgrRelation *owner, SMgrRelation reln) +{ + /* Do nothing if the SMgrRelation object is not owned by the owner */ + if (reln->smgr_owner != owner) + return; + + /* unset the owner's reference */ + *owner = NULL; + + /* unset our reference to the owner */ + reln->smgr_owner = NULL; +} + +/* * smgrexists() -- Does the underlying file for a fork exist? */ bool diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h index 1761f1c8089..957f2108d54 100644 --- a/src/include/storage/smgr.h +++ b/src/include/storage/smgr.h @@ -62,6 +62,7 @@ extern void smgrinit(void); extern SMgrRelation smgropen(RelFileNode rnode); extern bool smgrexists(SMgrRelation reln, ForkNumber forknum); extern void smgrsetowner(SMgrRelation *owner, SMgrRelation reln); +extern void smgrclearowner(SMgrRelation *owner, SMgrRelation reln); extern void smgrclose(SMgrRelation reln); extern void smgrcloseall(void); extern void smgrclosenode(RelFileNode rnode); |