diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-08-06 04:17:47 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-08-06 04:17:47 +0000 |
commit | 925418d2fa9c8548de23df44d97d2db214839ba4 (patch) | |
tree | 26e181b5d57d4bae8d93f8d492459de6c86d3e2a /src/backend/utils/cache | |
parent | 465a3b0a2494091450da12975fece1613fdcc68a (diff) |
Ensure that catcache 'busy' flags are reset at transaction abort.
Without this, an elog during cache-entry load leaves that catcache
unusable. elog in that segment of code is pretty unusual but it can
happen.
Diffstat (limited to 'src/backend/utils/cache')
-rw-r--r-- | src/backend/utils/cache/catcache.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index 037fe69e81d..1c0b39c84b5 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.69 2000/07/02 05:38:40 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.70 2000/08/06 04:17:16 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -506,6 +506,7 @@ CatalogCacheIdInvalidate(int cacheId, /* XXX */ * public functions * * ResetSystemCache + * SystemCacheAbort * InitIndexedSysCache * InitSysCache * SearchSysCache @@ -517,7 +518,7 @@ CatalogCacheIdInvalidate(int cacheId, /* XXX */ * -------------------------------- */ void -ResetSystemCache() +ResetSystemCache(void) { CatCache *cache; @@ -545,19 +546,44 @@ ResetSystemCache() { nextelt = DLGetSucc(elt); CatCacheRemoveCTup(cache, elt); - if (cache->cc_ntup < 0) - elog(NOTICE, - "ResetSystemCache: cc_ntup<0 (software error)"); } } - cache->cc_ntup = 0; /* in case of WARN error above */ - cache->busy = false; /* to recover from recursive-use error */ + + /* double-check that ntup is now zero */ + if (cache->cc_ntup != 0) + { + elog(NOTICE, + "ResetSystemCache: cache %d has cc_ntup = %d, should be 0", + cache->id, cache->cc_ntup); + cache->cc_ntup = 0; + } } CACHE1_elog(DEBUG, "end of ResetSystemCache call"); } /* -------------------------------- + * SystemCacheAbort + * + * This routine is called to clean up catcache state as needed during + * transaction abort. + * -------------------------------- + */ +void +SystemCacheAbort(void) +{ + CatCache *cache; + + /* ---------------- + * clear the "cache busy" flags, which may have been left set if we + * elog'd out during a cache lookup attempt. + * ---------------- + */ + for (cache = Caches; PointerIsValid(cache); cache = cache->cc_next) + cache->busy = false; +} + +/* -------------------------------- * SystemCacheRelationFlushed * * This is called by RelationFlushRelation() to clear out cached information |