Avoid cache lookups for internal PostgreSQL tables when checking for Citus tables

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.
pull/7910/head
Muhammad Usama 2025-02-26 12:25:39 +05:00
parent ca8cb7ac5a
commit 0c24ebf6bb
1 changed files with 12 additions and 0 deletions

View File

@ -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;
}