mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-11-27 07:21:09 +08:00
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:
parent
465a3b0a24
commit
925418d2fa
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
40
src/backend/utils/cache/catcache.c
vendored
40
src/backend/utils/cache/catcache.c
vendored
@ -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)
|
|
||||||
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");
|
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
|
||||||
*
|
*
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user