diff options
Diffstat (limited to 'src/backend/utils/resowner/resowner.c')
| -rw-r--r-- | src/backend/utils/resowner/resowner.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index f3063ed9d9..d533a7697f 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/resowner/resowner.c,v 1.10 2005/03/04 20:21:06 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/resowner/resowner.c,v 1.11 2005/03/25 18:30:27 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -87,6 +87,7 @@ static void ResourceOwnerReleaseInternal(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel); +static void PrintRelCacheLeakWarning(Relation rel); /***************************************************************************** @@ -231,7 +232,11 @@ ResourceOwnerReleaseInternal(ResourceOwner owner, * iterate till there are none. */ while (owner->nrelrefs > 0) + { + if (isCommit) + PrintRelCacheLeakWarning(owner->relrefs[owner->nrelrefs - 1]); RelationClose(owner->relrefs[owner->nrelrefs - 1]); + } } } else if (phase == RESOURCE_RELEASE_LOCKS) @@ -284,9 +289,17 @@ ResourceOwnerReleaseInternal(ResourceOwner owner, * to iterate till there are none. Ditto for catcache lists. */ while (owner->ncatrefs > 0) + { + if (isCommit) + PrintCatCacheLeakWarning(owner->catrefs[owner->ncatrefs - 1]); ReleaseCatCache(owner->catrefs[owner->ncatrefs - 1]); + } while (owner->ncatlistrefs > 0) + { + if (isCommit) + PrintCatCacheListLeakWarning(owner->catlistrefs[owner->ncatlistrefs - 1]); ReleaseCatCacheList(owner->catlistrefs[owner->ncatlistrefs - 1]); + } } /* Clean up index scans too */ ReleaseResources_gist(); @@ -746,3 +759,13 @@ ResourceOwnerForgetRelationRef(ResourceOwner owner, Relation rel) elog(ERROR, "relcache reference %s is not owned by resource owner %s", RelationGetRelationName(rel), owner->name); } + +/* + * Debugging subroutine + */ +static void +PrintRelCacheLeakWarning(Relation rel) +{ + elog(WARNING, "relcache reference leak: relation \"%s\" not closed", + RelationGetRelationName(rel)); +} |
