Skip to content

Commit a79e51d

Browse files
Copilotmykaul
andcommitted
Add fetch_size to ControlConnection topology queries
- Add fetch_size parameter to all QueryMessage instances in ControlConnection - This ensures system.peers and system.local queries use paging - Uses existing _schema_meta_page_size (default 1000) for consistency - Add unit test to verify fetch_size is being passed Co-authored-by: mykaul <4655593+mykaul@users.noreply.github.com>
1 parent 2e62804 commit a79e51d

2 files changed

Lines changed: 38 additions & 9 deletions

File tree

cassandra/cluster.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3638,9 +3638,11 @@ def _try_connect(self, host):
36383638
sel_peers = self._get_peers_query(self.PeersQueryType.PEERS, connection)
36393639
sel_local = self._SELECT_LOCAL if self._token_meta_enabled else self._SELECT_LOCAL_NO_TOKENS
36403640
peers_query = QueryMessage(query=maybe_add_timeout_to_query(sel_peers, self._metadata_request_timeout),
3641-
consistency_level=ConsistencyLevel.ONE)
3641+
consistency_level=ConsistencyLevel.ONE,
3642+
fetch_size=self._schema_meta_page_size)
36423643
local_query = QueryMessage(query=maybe_add_timeout_to_query(sel_local, self._metadata_request_timeout),
3643-
consistency_level=ConsistencyLevel.ONE)
3644+
consistency_level=ConsistencyLevel.ONE,
3645+
fetch_size=self._schema_meta_page_size)
36443646
(peers_success, peers_result), (local_success, local_result) = connection.wait_for_responses(
36453647
peers_query, local_query, timeout=self._timeout, fail_on_error=False)
36463648

@@ -3652,7 +3654,8 @@ def _try_connect(self, host):
36523654
self._uses_peers_v2 = False
36533655
sel_peers = self._get_peers_query(self.PeersQueryType.PEERS, connection)
36543656
peers_query = QueryMessage(query=maybe_add_timeout_to_query(sel_peers, self._metadata_request_timeout),
3655-
consistency_level=ConsistencyLevel.ONE)
3657+
consistency_level=ConsistencyLevel.ONE,
3658+
fetch_size=self._schema_meta_page_size)
36563659
peers_result = connection.wait_for_response(
36573660
peers_query, timeout=self._timeout)
36583661

@@ -3797,9 +3800,11 @@ def _refresh_node_list_and_token_map(self, connection, preloaded_results=None,
37973800
log.debug("[control connection] Refreshing node list and token map")
37983801
sel_local = self._SELECT_LOCAL
37993802
peers_query = QueryMessage(query=maybe_add_timeout_to_query(sel_peers, self._metadata_request_timeout),
3800-
consistency_level=cl)
3803+
consistency_level=cl,
3804+
fetch_size=self._schema_meta_page_size)
38013805
local_query = QueryMessage(query=maybe_add_timeout_to_query(sel_local, self._metadata_request_timeout),
3802-
consistency_level=cl)
3806+
consistency_level=cl,
3807+
fetch_size=self._schema_meta_page_size)
38033808
peers_result, local_result = connection.wait_for_responses(
38043809
peers_query, local_query, timeout=self._timeout)
38053810

@@ -3856,7 +3861,8 @@ def _refresh_node_list_and_token_map(self, connection, preloaded_results=None,
38563861
# in system.local. See CASSANDRA-9436.
38573862
local_rpc_address_query = QueryMessage(
38583863
query=maybe_add_timeout_to_query(self._SELECT_LOCAL_NO_TOKENS_RPC_ADDRESS, self._metadata_request_timeout),
3859-
consistency_level=ConsistencyLevel.ONE)
3864+
consistency_level=ConsistencyLevel.ONE,
3865+
fetch_size=self._schema_meta_page_size)
38603866
success, local_rpc_address_result = connection.wait_for_response(
38613867
local_rpc_address_query, timeout=self._timeout, fail_on_error=False)
38623868
if success:
@@ -4092,9 +4098,11 @@ def wait_for_schema_agreement(self, connection=None, preloaded_results=None, wai
40924098

40934099
while elapsed < total_timeout:
40944100
peers_query = QueryMessage(query=maybe_add_timeout_to_query(select_peers_query, self._metadata_request_timeout),
4095-
consistency_level=cl)
4101+
consistency_level=cl,
4102+
fetch_size=self._schema_meta_page_size)
40964103
local_query = QueryMessage(query=maybe_add_timeout_to_query(self._SELECT_SCHEMA_LOCAL, self._metadata_request_timeout),
4097-
consistency_level=cl)
4104+
consistency_level=cl,
4105+
fetch_size=self._schema_meta_page_size)
40984106
try:
40994107
timeout = min(self._timeout, total_timeout - elapsed)
41004108
peers_result, local_result = connection.wait_for_responses(

tests/unit/test_control_connection.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from unittest.mock import Mock, ANY, call
1919

2020
from cassandra import OperationTimedOut, SchemaTargetType, SchemaChangeType
21-
from cassandra.protocol import ResultMessage, RESULT_KIND_ROWS
21+
from cassandra.protocol import ResultMessage, RESULT_KIND_ROWS, QueryMessage
2222
from cassandra.cluster import ControlConnection, _Scheduler, ProfileManager, EXEC_PROFILE_DEFAULT, ExecutionProfile
2323
from cassandra.pool import Host
2424
from cassandra.connection import EndPoint, DefaultEndPoint, DefaultEndPointFactory
@@ -305,6 +305,27 @@ def test_refresh_nodes_and_tokens(self):
305305

306306
assert self.connection.wait_for_responses.call_count == 1
307307

308+
def test_topology_queries_use_paging(self):
309+
"""
310+
Test that topology queries (system.peers and system.local) use fetch_size parameter
311+
"""
312+
# Test during refresh_node_list_and_token_map
313+
self.control_connection.refresh_node_list_and_token_map()
314+
315+
# Verify that wait_for_responses was called
316+
assert self.connection.wait_for_responses.called
317+
318+
# Get the QueryMessage arguments
319+
call_args = self.connection.wait_for_responses.call_args[0]
320+
peers_query = call_args[0]
321+
local_query = call_args[1]
322+
323+
# Verify that both queries have fetch_size set
324+
assert isinstance(peers_query, QueryMessage)
325+
assert isinstance(local_query, QueryMessage)
326+
assert peers_query.fetch_size == 1000 # default schema_meta_page_size
327+
assert local_query.fetch_size == 1000 # default schema_meta_page_size
328+
308329
def test_refresh_nodes_and_tokens_with_invalid_peers(self):
309330
def refresh_and_validate_added_hosts():
310331
self.connection.wait_for_responses = Mock(return_value=_node_meta_results(

0 commit comments

Comments
 (0)