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.
This commit is contained in:
Tom Lane 2000-08-06 04:17:47 +00:00
parent 465a3b0a24
commit 925418d2fa
3 changed files with 38 additions and 9 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.69 2000/07/02 02:28:38 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.70 2000/08/06 04:17:47 tgl Exp $
* *
* NOTES * NOTES
* Transaction aborts can now occur two ways: * Transaction aborts can now occur two ways:
@ -167,6 +167,7 @@
#include "utils/inval.h" #include "utils/inval.h"
#include "utils/memutils.h" #include "utils/memutils.h"
#include "utils/portal.h" #include "utils/portal.h"
#include "utils/catcache.h"
#include "utils/relcache.h" #include "utils/relcache.h"
#include "utils/temprel.h" #include "utils/temprel.h"
@ -797,6 +798,7 @@ static void
AtAbort_Cache() AtAbort_Cache()
{ {
RelationCacheAbort(); RelationCacheAbort();
SystemCacheAbort();
RegisterInvalid(false); RegisterInvalid(false);
} }

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * public functions
* *
* ResetSystemCache * ResetSystemCache
* SystemCacheAbort
* InitIndexedSysCache * InitIndexedSysCache
* InitSysCache * InitSysCache
* SearchSysCache * SearchSysCache
@ -517,7 +518,7 @@ CatalogCacheIdInvalidate(int cacheId, /* XXX */
* -------------------------------- * --------------------------------
*/ */
void void
ResetSystemCache() ResetSystemCache(void)
{ {
CatCache *cache; CatCache *cache;
@ -545,18 +546,43 @@ ResetSystemCache()
{ {
nextelt = DLGetSucc(elt); nextelt = DLGetSucc(elt);
CatCacheRemoveCTup(cache, elt); CatCacheRemoveCTup(cache, elt);
if (cache->cc_ntup < 0) }
}
/* double-check that ntup is now zero */
if (cache->cc_ntup != 0)
{
elog(NOTICE, elog(NOTICE,
"ResetSystemCache: cc_ntup<0 (software error)"); "ResetSystemCache: cache %d has cc_ntup = %d, should be 0",
cache->id, cache->cc_ntup);
cache->cc_ntup = 0;
} }
} }
cache->cc_ntup = 0; /* in case of WARN error above */
cache->busy = false; /* to recover from recursive-use error */
}
CACHE1_elog(DEBUG, "end of ResetSystemCache call"); 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 * SystemCacheRelationFlushed
* *

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: catcache.h,v 1.25 2000/06/28 03:33:33 tgl Exp $ * $Id: catcache.h,v 1.26 2000/08/06 04:16:40 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -83,6 +83,7 @@ extern void CatalogCacheIdInvalidate(int cacheId, Index hashIndex,
ItemPointer pointer); ItemPointer pointer);
extern void ResetSystemCache(void); extern void ResetSystemCache(void);
extern void SystemCacheRelationFlushed(Oid relId); extern void SystemCacheRelationFlushed(Oid relId);
extern void SystemCacheAbort(void);
extern CatCache *InitSysCache(char *relname, char *indname, int id, extern CatCache *InitSysCache(char *relname, char *indname, int id,
int nkeys, int *key, int nkeys, int *key,
ScanFunc iScanfuncP); ScanFunc iScanfuncP);