1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-03 22:24:49 +03:00

In PrepareToInvalidateCacheTuple, don't force initialization of catalog

caches that we don't actually need to touch.  This saves some trivial
number of cycles and avoids certain cases of deadlock when doing concurrent
VACUUM FULL on system catalogs.  Per report from Gavin Roy.

Backpatch to 8.2.  In earlier versions, CatalogCacheInitializeCache didn't
lock the relation so there's no deadlock risk (though that certainly had
plenty of risks of its own).
This commit is contained in:
Tom Lane 2008-03-05 17:01:41 +00:00
parent cbcc5b11a8
commit 06d9ce670b

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.134 2006/10/06 18:23:35 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.134.2.1 2008/03/05 17:01:41 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -1781,13 +1781,13 @@ PrepareToInvalidateCacheTuple(Relation relation,
for (ccp = CacheHdr->ch_caches; ccp; ccp = ccp->cc_next)
{
if (ccp->cc_reloid != reloid)
continue;
/* Just in case cache hasn't finished initialization yet... */
if (ccp->cc_tupdesc == NULL)
CatalogCacheInitializeCache(ccp);
if (ccp->cc_reloid != reloid)
continue;
(*function) (ccp->id,
CatalogCacheComputeTupleHashValue(ccp, tuple),
&tuple->t_self,