From cab243218d4833b6639ec65b158728e633fa86e3 Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Fri, 18 Mar 2022 14:37:39 +0100 Subject: [PATCH] Avoid locks in relation_is_a_known_shard --- src/backend/distributed/worker/worker_shard_visibility.c | 9 ++++++--- src/test/regress/expected/multi_mx_hide_shard_names.out | 5 +++++ src/test/regress/sql/multi_mx_hide_shard_names.sql | 7 +++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/worker/worker_shard_visibility.c b/src/backend/distributed/worker/worker_shard_visibility.c index ca05e8cee..38fd93eca 100644 --- a/src/backend/distributed/worker/worker_shard_visibility.c +++ b/src/backend/distributed/worker/worker_shard_visibility.c @@ -202,12 +202,15 @@ RelationIsAKnownShard(Oid shardRelationId) } } - Relation relation = try_relation_open(shardRelationId, AccessShareLock); - if (relation == NULL) + /* + * We do not take locks here, because that might block a query on pg_class. + */ + + if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(shardRelationId))) { + /* relation does not exist */ return false; } - relation_close(relation, NoLock); /* * If the input relation is an index we simply replace the diff --git a/src/test/regress/expected/multi_mx_hide_shard_names.out b/src/test/regress/expected/multi_mx_hide_shard_names.out index 469677c10..3bfaef545 100644 --- a/src/test/regress/expected/multi_mx_hide_shard_names.out +++ b/src/test/regress/expected/multi_mx_hide_shard_names.out @@ -71,6 +71,10 @@ SELECT * FROM citus_shard_indexes_on_worker WHERE "Schema" = 'mx_hide_shard_name --------------------------------------------------------------------- (0 rows) +-- make sure that pg_class queries do not get blocked on table locks +begin; +lock table test_table in access exclusive mode; +prepare transaction 'take-aggressive-lock'; -- shards are hidden when using psql as application_name SELECT relname FROM pg_catalog.pg_class WHERE relnamespace = 'mx_hide_shard_names'::regnamespace ORDER BY relname; relname @@ -78,6 +82,7 @@ SELECT relname FROM pg_catalog.pg_class WHERE relnamespace = 'mx_hide_shard_name test_table (1 row) +commit prepared 'take-aggressive-lock'; -- now create an index \c - - - :master_port SET search_path TO 'mx_hide_shard_names'; diff --git a/src/test/regress/sql/multi_mx_hide_shard_names.sql b/src/test/regress/sql/multi_mx_hide_shard_names.sql index 57017c90c..3d9a7669f 100644 --- a/src/test/regress/sql/multi_mx_hide_shard_names.sql +++ b/src/test/regress/sql/multi_mx_hide_shard_names.sql @@ -41,9 +41,16 @@ SET search_path TO 'mx_hide_shard_names'; SELECT * FROM citus_shards_on_worker WHERE "Schema" = 'mx_hide_shard_names' ORDER BY 2; SELECT * FROM citus_shard_indexes_on_worker WHERE "Schema" = 'mx_hide_shard_names' ORDER BY 2; +-- make sure that pg_class queries do not get blocked on table locks +begin; +lock table test_table in access exclusive mode; +prepare transaction 'take-aggressive-lock'; + -- shards are hidden when using psql as application_name SELECT relname FROM pg_catalog.pg_class WHERE relnamespace = 'mx_hide_shard_names'::regnamespace ORDER BY relname; +commit prepared 'take-aggressive-lock'; + -- now create an index \c - - - :master_port SET search_path TO 'mx_hide_shard_names';