mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
Fix relcache.c so that local relations (those created during
current transaction) are not flushed by shared-cache-inval reset message. SI reset actually works now, for probably the first time in a long time. I was able to run initdb and regression tests with a 16-element SI message array, with a lot of NOTICE: cache state reset messages but no crashes.
This commit is contained in:
parent
c5092847e7
commit
cc8b67a5c3
31
src/backend/utils/cache/relcache.c
vendored
31
src/backend/utils/cache/relcache.c
vendored
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.71 1999/09/06 18:13:02 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.72 1999/09/06 19:33:16 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1264,9 +1264,12 @@ RelationFlushRelation(Relation *relationPtr,
|
|||||||
*/
|
*/
|
||||||
smgrclose(DEFAULT_SMGR, relation);
|
smgrclose(DEFAULT_SMGR, relation);
|
||||||
|
|
||||||
if (relation->rd_isnailed)
|
if (relation->rd_isnailed || relation->rd_myxactonly)
|
||||||
{
|
{
|
||||||
/* this is a nailed special relation for bootstrapping */
|
/* Do not flush relation cache entry if it is a nailed-in system
|
||||||
|
* relation or it is marked transaction-local.
|
||||||
|
* (To delete a local relation, caller must clear rd_myxactonly!)
|
||||||
|
*/
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1364,6 +1367,8 @@ RelationForgetRelation(Oid rid)
|
|||||||
MemoryContextSwitchTo(oldcxt);
|
MemoryContextSwitchTo(oldcxt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
relation->rd_myxactonly = false; /* so it can be flushed */
|
||||||
|
|
||||||
RelationFlushRelation(&relation, false);
|
RelationFlushRelation(&relation, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1454,6 +1459,9 @@ RelationIdInvalidateRelationCacheByAccessMethodId(Oid accessMethodId)
|
|||||||
* Will blow away either all the cached relation descriptors or
|
* Will blow away either all the cached relation descriptors or
|
||||||
* those that have a zero reference count.
|
* those that have a zero reference count.
|
||||||
*
|
*
|
||||||
|
* This is currently used only to recover from SI message buffer overflow,
|
||||||
|
* so onlyFlushReferenceCountZero is always false. We do not blow away
|
||||||
|
* transaction-local relations, since they cannot be targets of SI updates.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
RelationCacheInvalidate(bool onlyFlushReferenceCountZero)
|
RelationCacheInvalidate(bool onlyFlushReferenceCountZero)
|
||||||
@ -1461,14 +1469,17 @@ RelationCacheInvalidate(bool onlyFlushReferenceCountZero)
|
|||||||
HashTableWalk(RelationNameCache, (HashtFunc) RelationFlushRelation,
|
HashTableWalk(RelationNameCache, (HashtFunc) RelationFlushRelation,
|
||||||
onlyFlushReferenceCountZero);
|
onlyFlushReferenceCountZero);
|
||||||
|
|
||||||
/*
|
|
||||||
* nailed-in reldescs will still be in the cache... 6 hardwired heaps
|
|
||||||
* + 3 hardwired indices == 9 total.
|
|
||||||
*/
|
|
||||||
if (!onlyFlushReferenceCountZero)
|
if (!onlyFlushReferenceCountZero)
|
||||||
{
|
{
|
||||||
Assert(RelationNameCache->hctl->nkeys == 9);
|
/*
|
||||||
Assert(RelationIdCache->hctl->nkeys == 9);
|
* Debugging check: what's left should be transaction-local relations
|
||||||
|
* plus nailed-in reldescs. There should be 6 hardwired heaps
|
||||||
|
* + 3 hardwired indices == 9 total.
|
||||||
|
*/
|
||||||
|
int numRels = length(newlyCreatedRelns) + 9;
|
||||||
|
|
||||||
|
Assert(RelationNameCache->hctl->nkeys == numRels);
|
||||||
|
Assert(RelationIdCache->hctl->nkeys == numRels);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1580,7 +1591,7 @@ RelationPurgeLocalRelation(bool xactCommitted)
|
|||||||
smgrunlink(DEFAULT_SMGR, reln);
|
smgrunlink(DEFAULT_SMGR, reln);
|
||||||
}
|
}
|
||||||
|
|
||||||
reln->rd_myxactonly = FALSE;
|
reln->rd_myxactonly = false; /* so it can be flushed */
|
||||||
|
|
||||||
if (!IsBootstrapProcessingMode())
|
if (!IsBootstrapProcessingMode())
|
||||||
RelationFlushRelation(&reln, false);
|
RelationFlushRelation(&reln, false);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user