From 0b56be83441c01419fcf82ebe666e968e6f7b246 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sun, 31 Dec 2006 20:32:04 +0000
Subject: [PATCH] Found the problem with my operator-family changes: by
 fetching from pg_opclass during LookupOpclassInfo(), I'd turned
 pg_opclass_oid_index into a critical system index.  However the problem could
 only manifest during a backend's first attempt to load opclass data, and then
 only if it had successfully loaded pg_internal.init and subsequently received
 a relcache flush; which made it impossible to reproduce in sequential tests
 and darn hard even in parallel tests.  Memo to self: when exercising cache
 flush scenarios, must disable LookupOpclassInfo's internal cache too.

---
 src/backend/utils/cache/relcache.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index be5fb60dc8e..327bba7b682 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.251 2006/12/23 00:43:11 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.252 2006/12/31 20:32:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2402,8 +2402,8 @@ RelationCacheInitializePhase2(void)
 
 	/*
 	 * If we didn't get the critical system indexes loaded into relcache, do
-	 * so now.	These are critical because the catcache depends on them for
-	 * catcache fetches that are done during relcache load.  Thus, we have an
+	 * so now.	These are critical because the catcache and/or opclass cache
+	 * depend on them for fetches done during relcache load.  Thus, we have an
 	 * infinite-recursion problem.	We can break the recursion by doing
 	 * heapscans instead of indexscans at certain key spots. To avoid hobbling
 	 * performance, we only want to do that until we have the critical indexes
@@ -2439,13 +2439,14 @@ RelationCacheInitializePhase2(void)
 		LOAD_CRIT_INDEX(ClassOidIndexId);
 		LOAD_CRIT_INDEX(AttributeRelidNumIndexId);
 		LOAD_CRIT_INDEX(IndexRelidIndexId);
+		LOAD_CRIT_INDEX(OpclassOidIndexId);
 		LOAD_CRIT_INDEX(AccessMethodStrategyIndexId);
 		LOAD_CRIT_INDEX(AccessMethodProcedureIndexId);
 		LOAD_CRIT_INDEX(OperatorOidIndexId);
 		LOAD_CRIT_INDEX(RewriteRelRulenameIndexId);
 		LOAD_CRIT_INDEX(TriggerRelidNameIndexId);
 
-#define NUM_CRITICAL_INDEXES	8		/* fix if you change list above */
+#define NUM_CRITICAL_INDEXES	9		/* fix if you change list above */
 
 		criticalRelcachesBuilt = true;
 	}
-- 
GitLab