Skip to content

Commit 83a823f

Browse files
committed
metadata: conditionally skip triggers query for ScyllaDB
ScyllaDB doesn't support triggers, so skip the triggers query when connected to ScyllaDB. This is detected by checking if the connection has shard awareness (using the existing _is_not_scylla() method). Changes to both SchemaParserV3 and SchemaParserV4: - Modified _query_all() to conditionally append triggers query only for non-ScyllaDB - Modified _query_all() response unpacking to use array slicing for cleaner code - Modified get_table() in V3 to conditionally query triggers This eliminates unnecessary failed queries to system_schema.triggers on ScyllaDB. Signed-off-by: Yaniv Kaul <yaniv.kaul@scylladb.com>
1 parent 0b1802b commit 83a823f

1 file changed

Lines changed: 78 additions & 34 deletions

File tree

cassandra/metadata.py

Lines changed: 78 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2577,6 +2577,10 @@ class SchemaParserV3(SchemaParserV22):
25772577
_SELECT_AGGREGATES = "SELECT * FROM system_schema.aggregates"
25782578
_SELECT_VIEWS = "SELECT * FROM system_schema.views"
25792579

2580+
def _is_not_scylla(self):
2581+
"""Check if NOT connected to ScyllaDB by checking for shard awareness."""
2582+
return getattr(getattr(self.connection, 'features', None), 'shard_id', None) is None
2583+
25802584
_table_name_col = 'table_name'
25812585

25822586
_function_agg_arument_type_col = 'argument_types'
@@ -2627,27 +2631,44 @@ def get_table(self, keyspaces, keyspace, table):
26272631
indexes_query = QueryMessage(
26282632
query=maybe_add_timeout_to_query(self._SELECT_INDEXES + where_clause, self.metadata_request_timeout),
26292633
consistency_level=cl, fetch_size=fetch_size)
2630-
triggers_query = QueryMessage(
2631-
query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS + where_clause, self.metadata_request_timeout),
2632-
consistency_level=cl, fetch_size=fetch_size)
2634+
2635+
# ScyllaDB doesn't have triggers, skip the query
2636+
if self._is_not_scylla():
2637+
triggers_query = QueryMessage(
2638+
query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS + where_clause, self.metadata_request_timeout),
2639+
consistency_level=cl, fetch_size=fetch_size)
26332640

26342641
# in protocol v4 we don't know if this event is a view or a table, so we look for both
26352642
where_clause = bind_params(" WHERE keyspace_name = %s AND view_name = %s", (keyspace, table), _encoder)
26362643
view_query = QueryMessage(
26372644
query=maybe_add_timeout_to_query(self._SELECT_VIEWS + where_clause, self.metadata_request_timeout),
26382645
consistency_level=cl, fetch_size=fetch_size)
2639-
((cf_success, cf_result), (col_success, col_result),
2640-
(indexes_sucess, indexes_result), (triggers_success, triggers_result),
2641-
(view_success, view_result)) = (
2642-
self.connection.wait_for_responses(
2643-
cf_query, col_query, indexes_query, triggers_query,
2644-
view_query, timeout=self.timeout, fail_on_error=False)
2645-
)
2646+
2647+
if self._is_not_scylla():
2648+
((cf_success, cf_result), (col_success, col_result),
2649+
(indexes_sucess, indexes_result), (triggers_success, triggers_result),
2650+
(view_success, view_result)) = (
2651+
self.connection.wait_for_responses(
2652+
cf_query, col_query, indexes_query, triggers_query,
2653+
view_query, timeout=self.timeout, fail_on_error=False)
2654+
)
2655+
else:
2656+
((cf_success, cf_result), (col_success, col_result),
2657+
(indexes_sucess, indexes_result),
2658+
(view_success, view_result)) = (
2659+
self.connection.wait_for_responses(
2660+
cf_query, col_query, indexes_query,
2661+
view_query, timeout=self.timeout, fail_on_error=False)
2662+
)
2663+
26462664
table_result = self._handle_results(cf_success, cf_result, query_msg=cf_query)
26472665
col_result = self._handle_results(col_success, col_result, query_msg=col_query)
26482666
if table_result:
26492667
indexes_result = self._handle_results(indexes_sucess, indexes_result, query_msg=indexes_query)
2650-
triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=triggers_query)
2668+
if self._is_not_scylla():
2669+
triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=triggers_query)
2670+
else:
2671+
triggers_result = None
26512672
return self._build_table_metadata(table_result[0], col_result, triggers_result, indexes_result)
26522673

26532674
view_result = self._handle_results(view_success, view_result, query_msg=view_query)
@@ -2696,9 +2717,10 @@ def _build_table_metadata(self, row, col_rows=None, trigger_rows=None, index_row
26962717

26972718
self._build_table_columns(table_meta, col_rows, compact_static, is_dense, virtual)
26982719

2699-
for trigger_row in trigger_rows:
2700-
trigger_meta = self._build_trigger_metadata(table_meta, trigger_row)
2701-
table_meta.triggers[trigger_meta.name] = trigger_meta
2720+
if self._is_not_scylla():
2721+
for trigger_row in trigger_rows:
2722+
trigger_meta = self._build_trigger_metadata(table_meta, trigger_row)
2723+
table_meta.triggers[trigger_meta.name] = trigger_meta
27022724

27032725
for index_row in index_rows:
27042726
index_meta = self._build_index_metadata(table_meta, index_row)
@@ -2793,6 +2815,7 @@ def _build_trigger_metadata(table_metadata, row):
27932815
trigger_meta = TriggerMetadata(table_metadata, name, options)
27942816
return trigger_meta
27952817

2818+
27962819
def _query_all(self):
27972820
cl = ConsistencyLevel.ONE
27982821
fetch_size = self.fetch_size
@@ -2809,35 +2832,45 @@ def _query_all(self):
28092832
fetch_size=fetch_size, consistency_level=cl),
28102833
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_AGGREGATES, self.metadata_request_timeout),
28112834
fetch_size=fetch_size, consistency_level=cl),
2812-
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS, self.metadata_request_timeout),
2813-
fetch_size=fetch_size, consistency_level=cl),
28142835
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_INDEXES, self.metadata_request_timeout),
28152836
fetch_size=fetch_size, consistency_level=cl),
28162837
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_VIEWS, self.metadata_request_timeout),
28172838
fetch_size=fetch_size, consistency_level=cl),
28182839
]
28192840

2841+
# ScyllaDB doesn't have triggers, skip the query
2842+
if self._is_not_scylla():
2843+
queries.append(QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS, self.metadata_request_timeout),
2844+
fetch_size=fetch_size, consistency_level=cl))
2845+
2846+
responses = self.connection.wait_for_responses(*queries, timeout=self.timeout, fail_on_error=False)
2847+
2848+
# Unpack common responses (always present)
28202849
((ks_success, ks_result),
28212850
(table_success, table_result),
28222851
(col_success, col_result),
28232852
(types_success, types_result),
28242853
(functions_success, functions_result),
28252854
(aggregates_success, aggregates_result),
2826-
(triggers_success, triggers_result),
28272855
(indexes_success, indexes_result),
2828-
(views_success, views_result)) = self.connection.wait_for_responses(
2829-
*queries, timeout=self.timeout, fail_on_error=False
2830-
)
2856+
(views_success, views_result)) = responses[:8]
2857+
2858+
# Unpack triggers response if present (Cassandra/DSE only)
2859+
if self._is_not_scylla():
2860+
(triggers_success, triggers_result) = responses[8]
28312861

28322862
self.keyspaces_result = self._handle_results(ks_success, ks_result, query_msg=queries[0])
28332863
self.tables_result = self._handle_results(table_success, table_result, query_msg=queries[1])
28342864
self.columns_result = self._handle_results(col_success, col_result, query_msg=queries[2])
2835-
self.triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=queries[6])
28362865
self.types_result = self._handle_results(types_success, types_result, query_msg=queries[3])
28372866
self.functions_result = self._handle_results(functions_success, functions_result, query_msg=queries[4])
28382867
self.aggregates_result = self._handle_results(aggregates_success, aggregates_result, query_msg=queries[5])
2839-
self.indexes_result = self._handle_results(indexes_success, indexes_result, query_msg=queries[7])
2840-
self.views_result = self._handle_results(views_success, views_result, query_msg=queries[8])
2868+
self.indexes_result = self._handle_results(indexes_success, indexes_result, query_msg=queries[6])
2869+
self.views_result = self._handle_results(views_success, views_result, query_msg=queries[7])
2870+
if self._is_not_scylla():
2871+
self.triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=queries[8])
2872+
else:
2873+
self.triggers_result = []
28412874

28422875
self._aggregate_results()
28432876

@@ -2915,8 +2948,6 @@ def _query_all(self):
29152948
fetch_size=fetch_size, consistency_level=cl),
29162949
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_AGGREGATES, self.metadata_request_timeout),
29172950
fetch_size=fetch_size, consistency_level=cl),
2918-
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS, self.metadata_request_timeout),
2919-
fetch_size=fetch_size, consistency_level=cl),
29202951
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_INDEXES, self.metadata_request_timeout),
29212952
fetch_size=fetch_size, consistency_level=cl),
29222953
QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_VIEWS, self.metadata_request_timeout),
@@ -2930,8 +2961,15 @@ def _query_all(self):
29302961
fetch_size=fetch_size, consistency_level=cl),
29312962
]
29322963

2964+
# ScyllaDB doesn't have triggers, skip the query
2965+
if self._is_not_scylla():
2966+
queries.append(QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_TRIGGERS, self.metadata_request_timeout),
2967+
fetch_size=fetch_size, consistency_level=cl))
2968+
29332969
responses = self.connection.wait_for_responses(
29342970
*queries, timeout=self.timeout, fail_on_error=False)
2971+
2972+
# Unpack common responses (always present)
29352973
(
29362974
# copied from V3
29372975
(ks_success, ks_result),
@@ -2940,39 +2978,45 @@ def _query_all(self):
29402978
(types_success, types_result),
29412979
(functions_success, functions_result),
29422980
(aggregates_success, aggregates_result),
2943-
(triggers_success, triggers_result),
29442981
(indexes_success, indexes_result),
29452982
(views_success, views_result),
29462983
# V4-only responses
29472984
(virtual_ks_success, virtual_ks_result),
29482985
(virtual_table_success, virtual_table_result),
2949-
(virtual_column_success, virtual_column_result)
2950-
) = responses
2986+
(virtual_column_success, virtual_column_result),
2987+
) = responses[:11]
2988+
2989+
# Unpack triggers response if present (Cassandra/DSE only)
2990+
if self._is_not_scylla():
2991+
(triggers_success, triggers_result) = responses[11]
29512992

29522993
# copied from V3
29532994
self.keyspaces_result = self._handle_results(ks_success, ks_result, query_msg=queries[0])
29542995
self.tables_result = self._handle_results(table_success, table_result, query_msg=queries[1])
29552996
self.columns_result = self._handle_results(col_success, col_result, query_msg=queries[2])
2956-
self.triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=queries[6])
29572997
self.types_result = self._handle_results(types_success, types_result, query_msg=queries[3])
29582998
self.functions_result = self._handle_results(functions_success, functions_result, query_msg=queries[4])
29592999
self.aggregates_result = self._handle_results(aggregates_success, aggregates_result, query_msg=queries[5])
2960-
self.indexes_result = self._handle_results(indexes_success, indexes_result, query_msg=queries[7])
2961-
self.views_result = self._handle_results(views_success, views_result, query_msg=queries[8])
3000+
self.indexes_result = self._handle_results(indexes_success, indexes_result, query_msg=queries[6])
3001+
self.views_result = self._handle_results(views_success, views_result, query_msg=queries[7])
3002+
if self._is_not_scylla():
3003+
self.triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=queries[11])
3004+
else:
3005+
self.triggers_result = []
29623006
# V4-only results
29633007
# These tables don't exist in some DSE versions reporting 4.X so we can
29643008
# ignore them if we got an error
29653009
self.virtual_keyspaces_result = self._handle_results(
29663010
virtual_ks_success, virtual_ks_result,
2967-
expected_failures=(InvalidRequest,), query_msg=queries[9]
3011+
expected_failures=(InvalidRequest,), query_msg=queries[8]
29683012
)
29693013
self.virtual_tables_result = self._handle_results(
29703014
virtual_table_success, virtual_table_result,
2971-
expected_failures=(InvalidRequest,), query_msg=queries[10]
3015+
expected_failures=(InvalidRequest,), query_msg=queries[9]
29723016
)
29733017
self.virtual_columns_result = self._handle_results(
29743018
virtual_column_success, virtual_column_result,
2975-
expected_failures=(InvalidRequest,), query_msg=queries[11]
3019+
expected_failures=(InvalidRequest,), query_msg=queries[10]
29763020
)
29773021

29783022
self._aggregate_results()

0 commit comments

Comments
 (0)