From 0c24ebf6bb1e915b7228be167c561dbce28026ac Mon Sep 17 00:00:00 2001 From: Muhammad Usama Date: Wed, 26 Feb 2025 12:25:39 +0500 Subject: [PATCH] Avoid cache lookups for internal PostgreSQL tables when checking for Citus tables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PostgreSQL starts assigning user OIDs from FirstNormalObjectId onward, so any relation with an OID below that is a system object and cannot be a Citus table. This change introduces an early bailout for such relationIds, eliminating unnecessary calls to BuildCitusTableCache. This optimization is particularly beneficial in performance-critical workflows—such as rapid connect -> query-catalog_table -> disconnect cycles—by avoiding the expensive cache build and lookup. Since BuildCitusTableCache operates under a lock, which can lead to contention among concurrent processes (and, in some cases, distributed deadlocks), bypassing it for internal tables improves both performance and stability. --- src/backend/distributed/metadata/metadata_cache.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/backend/distributed/metadata/metadata_cache.c b/src/backend/distributed/metadata/metadata_cache.c index 3451415d1..eb5a0c22d 100644 --- a/src/backend/distributed/metadata/metadata_cache.c +++ b/src/backend/distributed/metadata/metadata_cache.c @@ -660,6 +660,18 @@ GetTableTypeName(Oid tableId) bool IsCitusTable(Oid relationId) { + /* + * PostgreSQL's OID generator assigns user operation OIDs starting + * from FirstNormalObjectId. This means no user object can have + * an OID lower than FirstNormalObjectId. Therefore, if the + * relationId is less than FirstNormalObjectId + * (i.e. in PostgreSQL's reserved range), we can immediately + * return false, since such objects cannot be Citus tables. + */ + if (relationId < FirstNormalObjectId) + { + return false; + } return LookupCitusTableCacheEntry(relationId) != NULL; }