Skip to content

Commit 989ee1c

Browse files
committed
Metadata/Schema paginated queries [continuation]
Seems like that in #140, not all the queries coming out of the metadata were covered (i.e. paginated), which was still showing in `scylla_cql_unpaged_select_queries` counter. all schema agreement queries are still unpaged: ``` SELECT peer, host_id, rpc_address, schema_version FROM system.peers SELECT schema_version FROM system.local WHERE key='local' ```
1 parent 66046de commit 989ee1c

File tree

1 file changed

+24
-26
lines changed

1 file changed

+24
-26
lines changed

cassandra/metadata.py

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,9 +1921,10 @@ def export_as_string(self):
19211921

19221922
class _SchemaParser(object):
19231923

1924-
def __init__(self, connection, timeout):
1924+
def __init__(self, connection, timeout, fetch_size):
19251925
self.connection = connection
19261926
self.timeout = timeout
1927+
self.fetch_size = fetch_size
19271928

19281929
def _handle_results(self, success, result, expected_failures=tuple(), query_msg=None, timeout=None):
19291930
"""
@@ -1975,17 +1976,13 @@ def _query_build_row(self, query_string, build_func):
19751976
return result[0] if result else None
19761977

19771978
def _query_build_rows(self, query_string, build_func):
1978-
query = QueryMessage(query=query_string, consistency_level=ConsistencyLevel.ONE)
1979+
query = QueryMessage(query=query_string, consistency_level=ConsistencyLevel.ONE, fetch_size=self.fetch_size)
19791980
responses = self.connection.wait_for_responses((query), timeout=self.timeout, fail_on_error=False)
19801981
(success, response) = responses[0]
1981-
if success:
1982-
result = dict_factory(response.column_names, response.parsed_rows)
1983-
return [build_func(row) for row in result]
1984-
elif isinstance(response, InvalidRequest):
1982+
results = self._handle_results(success, response, expected_failures=(InvalidRequest), query_msg=query)
1983+
if not results:
19851984
log.debug("user types table not found")
1986-
return []
1987-
else:
1988-
raise response
1985+
return [build_func(row) for row in results]
19891986

19901987

19911988
class SchemaParserV22(_SchemaParser):
@@ -2029,8 +2026,8 @@ class SchemaParserV22(_SchemaParser):
20292026
"compression",
20302027
"default_time_to_live")
20312028

2032-
def __init__(self, connection, timeout):
2033-
super(SchemaParserV22, self).__init__(connection, timeout)
2029+
def __init__(self, connection, timeout, fetch_size):
2030+
super(SchemaParserV22, self).__init__(connection, timeout, fetch_size)
20342031
self.keyspaces_result = []
20352032
self.tables_result = []
20362033
self.columns_result = []
@@ -2551,8 +2548,7 @@ class SchemaParserV3(SchemaParserV22):
25512548
'speculative_retry')
25522549

25532550
def __init__(self, connection, timeout, fetch_size):
2554-
super(SchemaParserV3, self).__init__(connection, timeout)
2555-
self.fetch_size = fetch_size
2551+
super(SchemaParserV3, self).__init__(connection, timeout, fetch_size)
25562552
self.indexes_result = []
25572553
self.keyspace_table_index_rows = defaultdict(lambda: defaultdict(list))
25582554
self.keyspace_view_rows = defaultdict(list)
@@ -2566,17 +2562,18 @@ def get_all_keyspaces(self):
25662562

25672563
def get_table(self, keyspaces, keyspace, table):
25682564
cl = ConsistencyLevel.ONE
2565+
fetch_size = self.fetch_size
25692566
where_clause = bind_params(" WHERE keyspace_name = %%s AND %s = %%s" % (self._table_name_col), (keyspace, table), _encoder)
2570-
cf_query = QueryMessage(query=self._SELECT_TABLES + where_clause, consistency_level=cl)
2571-
col_query = QueryMessage(query=self._SELECT_COLUMNS + where_clause, consistency_level=cl)
2572-
indexes_query = QueryMessage(query=self._SELECT_INDEXES + where_clause, consistency_level=cl)
2573-
triggers_query = QueryMessage(query=self._SELECT_TRIGGERS + where_clause, consistency_level=cl)
2574-
scylla_query = QueryMessage(query=self._SELECT_SCYLLA + where_clause, consistency_level=cl)
2567+
cf_query = QueryMessage(query=self._SELECT_TABLES + where_clause, consistency_level=cl, fetch_size=fetch_size)
2568+
col_query = QueryMessage(query=self._SELECT_COLUMNS + where_clause, consistency_level=cl, fetch_size=fetch_size)
2569+
indexes_query = QueryMessage(query=self._SELECT_INDEXES + where_clause, consistency_level=cl, fetch_size=fetch_size)
2570+
triggers_query = QueryMessage(query=self._SELECT_TRIGGERS + where_clause, consistency_level=cl, fetch_size=fetch_size)
2571+
scylla_query = QueryMessage(query=self._SELECT_SCYLLA + where_clause, consistency_level=cl, fetch_size=fetch_size)
25752572

25762573
# in protocol v4 we don't know if this event is a view or a table, so we look for both
25772574
where_clause = bind_params(" WHERE keyspace_name = %s AND view_name = %s", (keyspace, table), _encoder)
25782575
view_query = QueryMessage(query=self._SELECT_VIEWS + where_clause,
2579-
consistency_level=cl)
2576+
consistency_level=cl, fetch_size=fetch_size)
25802577
((cf_success, cf_result), (col_success, col_result),
25812578
(indexes_sucess, indexes_result), (triggers_success, triggers_result),
25822579
(view_success, view_result),
@@ -2585,22 +2582,23 @@ def get_table(self, keyspaces, keyspace, table):
25852582
cf_query, col_query, indexes_query, triggers_query,
25862583
view_query, scylla_query, timeout=self.timeout, fail_on_error=False)
25872584
)
2588-
table_result = self._handle_results(cf_success, cf_result)
2589-
col_result = self._handle_results(col_success, col_result)
2585+
table_result = self._handle_results(cf_success, cf_result, query_msg=cf_query)
2586+
col_result = self._handle_results(col_success, col_result, query_msg=col_query)
25902587
if table_result:
2591-
indexes_result = self._handle_results(indexes_sucess, indexes_result)
2592-
triggers_result = self._handle_results(triggers_success, triggers_result)
2588+
indexes_result = self._handle_results(indexes_sucess, indexes_result, query_msg=indexes_query)
2589+
triggers_result = self._handle_results(triggers_success, triggers_result, query_msg=triggers_query)
25932590
# in_memory property is stored in scylla private table
25942591
# add it to table properties if enabled
2595-
scylla_result = self._handle_results(scylla_success, scylla_result, expected_failures=(InvalidRequest,))
2592+
scylla_result = self._handle_results(scylla_success, scylla_result, expected_failures=(InvalidRequest,),
2593+
query_msg=scylla_query)
25962594
try:
25972595
if scylla_result[0]["in_memory"] == True:
25982596
table_result[0]["in_memory"] = True
25992597
except (IndexError, KeyError):
26002598
pass
26012599
return self._build_table_metadata(table_result[0], col_result, triggers_result, indexes_result)
26022600

2603-
view_result = self._handle_results(view_success, view_result)
2601+
view_result = self._handle_results(view_success, view_result, query_msg=view_query)
26042602
if view_result:
26052603
return self._build_view_metadata(view_result[0], col_result)
26062604

@@ -3353,7 +3351,7 @@ def get_schema_parser(connection, server_version, dse_version, timeout, fetch_si
33533351
else:
33543352
# we could further specialize by version. Right now just refactoring the
33553353
# multi-version parser we have as of C* 2.2.0rc1.
3356-
return SchemaParserV22(connection, timeout)
3354+
return SchemaParserV22(connection, timeout, fetch_size)
33573355

33583356

33593357
def _cql_from_cass_type(cass_type):

0 commit comments

Comments
 (0)