From cfb95f6bd8df07dd5095efd4e8f8b751cc7b68b5 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Tue, 27 Aug 2019 14:55:59 +1200 Subject: [PATCH] Don't perform catalog lookups in TestForOldSnapshot(). TestForOldSnapshot() runs while the buffer content lock is held and performs catalog lookups to test if tables have unlogged indexes. Based on field reports, this can cause serious performance problems. We may need to put something like this back, presumably with caching and hopefully not under the buffer content lock, if unlogged indexes on permanent tables are allowed in the future. For now just remove the test. TODO: discuss how far to back-patch Author: Thomas Munro Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CA%2BhUKGKT8oTkp5jw_U4p0S-7UG9zsvtw_M47Y285bER6a2gD%2Bg%40mail.gmail.com --- src/backend/utils/cache/relcache.c | 42 ------------------------------ src/include/utils/rel.h | 1 - src/include/utils/snapmgr.h | 1 - 3 files changed, 44 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 248860758c..585dcee5db 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -5913,48 +5913,6 @@ RelationIdIsInInitFile(Oid relationId) return RelationSupportsSysCache(relationId); } -/* - * Tells whether any index for the relation is unlogged. - * - * Note: There doesn't seem to be any way to have an unlogged index attached - * to a permanent table, but it seems best to keep this general so that it - * returns sensible results even when they seem obvious (like for an unlogged - * table) and to handle possible future unlogged indexes on permanent tables. - */ -bool -RelationHasUnloggedIndex(Relation rel) -{ - List *indexoidlist; - ListCell *indexoidscan; - bool result = false; - - indexoidlist = RelationGetIndexList(rel); - - foreach(indexoidscan, indexoidlist) - { - Oid indexoid = lfirst_oid(indexoidscan); - HeapTuple tp; - Form_pg_class reltup; - - tp = SearchSysCache1(RELOID, ObjectIdGetDatum(indexoid)); - if (!HeapTupleIsValid(tp)) - elog(ERROR, "cache lookup failed for relation %u", indexoid); - reltup = (Form_pg_class) GETSTRUCT(tp); - - if (reltup->relpersistence == RELPERSISTENCE_UNLOGGED) - result = true; - - ReleaseSysCache(tp); - - if (result == true) - break; - } - - list_free(indexoidlist); - - return result; -} - /* * Invalidate (remove) the init file during commit of a transaction that * changed one or more of the relation cache entries that are kept in the diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index c5d36680a2..91b3b1b902 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -605,6 +605,5 @@ typedef struct ViewOptions /* routines in utils/cache/relcache.c */ extern void RelationIncrementReferenceCount(Relation rel); extern void RelationDecrementReferenceCount(Relation rel); -extern bool RelationHasUnloggedIndex(Relation rel); #endif /* REL_H */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 8c070d7f41..67b07df48c 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -40,7 +40,6 @@ RelationNeedsWAL(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ - && !RelationHasUnloggedIndex(rel) \ ) #define EarlyPruningEnabled(rel) (old_snapshot_threshold >= 0 && RelationAllowsEarlyPruning(rel)) -- 2.22.0