From 08890b407e976e4871f2024ed5a3071d0fa510a6 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 25 Mar 2005 18:30:28 +0000 Subject: Fix resource owner code to generate catcache and relcache leak warnings when open references remain during normal cleanup of a resource owner. This restores the system's ability to warn about leaks to what it was before 8.0. Not really a user-level bug, but helpful for development. --- src/backend/utils/cache/catcache.c | 39 +++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) (limited to 'src/backend/utils/cache/catcache.c') diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index 68995f9838..44ef1de6ee 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.118 2004/12/31 22:01:25 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.119 2005/03/25 18:30:27 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -556,8 +556,7 @@ AtEOXact_CatCache(bool isCommit) if (cl->refcount != 0) { if (isCommit) - elog(WARNING, "cache reference leak: cache %s (%d), list %p has count %d", - ccp->cc_relname, ccp->id, cl, cl->refcount); + PrintCatCacheListLeakWarning(cl); cl->refcount = 0; } @@ -579,10 +578,7 @@ AtEOXact_CatCache(bool isCommit) if (ct->refcount != 0) { if (isCommit) - elog(WARNING, "cache reference leak: cache %s (%d), tuple %u has count %d", - ct->my_cache->cc_relname, ct->my_cache->id, - HeapTupleGetOid(&ct->tuple), - ct->refcount); + PrintCatCacheLeakWarning(&ct->tuple); ct->refcount = 0; } @@ -1807,3 +1803,32 @@ PrepareToInvalidateCacheTuple(Relation relation, ccp->cc_relisshared ? (Oid) 0 : MyDatabaseId); } } + + +/* + * Subroutines for warning about reference leaks. These are exported so + * that resowner.c can call them. + */ +void +PrintCatCacheLeakWarning(HeapTuple tuple) +{ + CatCTup *ct = (CatCTup *) (((char *) tuple) - + offsetof(CatCTup, tuple)); + + /* Safety check to ensure we were handed a cache entry */ + Assert(ct->ct_magic == CT_MAGIC); + + elog(WARNING, "cache reference leak: cache %s (%d), tuple %u/%u has count %d", + ct->my_cache->cc_relname, ct->my_cache->id, + ItemPointerGetBlockNumber(&(tuple->t_self)), + ItemPointerGetOffsetNumber(&(tuple->t_self)), + ct->refcount); +} + +void +PrintCatCacheListLeakWarning(CatCList *list) +{ + elog(WARNING, "cache reference leak: cache %s (%d), list %p has count %d", + list->my_cache->cc_relname, list->my_cache->id, + list, list->refcount); +} -- cgit v1.2.1