@@ -3441,25 +3441,28 @@ def _clear_watcher(conn, expiring_weakref):
34413441 pass
34423442
34433443
3444- def _fetch_remaining_pages (connection , result , query_msg , timeout ):
3444+ def _fetch_remaining_pages (connection , query_msg , timeout ):
34453445 """
3446- Fetch remaining pages for a paged query result that already has the first page.
3446+ Fetch all pages for a paged query.
3447+ Executes the query and fetches all pages if the result is paged.
34473448
34483449 :param connection: The connection to use for querying
3449- :param result: The initial result from the first page (must have paging_state if there are more pages)
3450- :param query_msg: The QueryMessage used for the initial query (will be reused with paging_state)
3450+ :param query_msg: The QueryMessage to execute (must have fetch_size set for paging)
34513451 :param timeout: Timeout for each query operation
34523452 :return: The result with all parsed_rows combined from all pages
34533453 """
3454- if not result or not result .paging_state :
3455- return result
3456-
3457- all_rows = list (result .parsed_rows ) if result .parsed_rows else []
3458-
34593454 # Save original paging_state to restore later
34603455 original_paging_state = query_msg .paging_state
34613456
34623457 try :
3458+ # Execute the query to get the first page
3459+ result = connection .wait_for_response (query_msg , timeout = timeout )
3460+
3461+ if not result or not result .paging_state :
3462+ return result
3463+
3464+ all_rows = list (result .parsed_rows ) if result .parsed_rows else []
3465+
34633466 # Fetch remaining pages
34643467 while result and result .paging_state :
34653468 query_msg .paging_state = result .paging_state
@@ -3678,27 +3681,21 @@ def _try_connect(self, host):
36783681 local_query = QueryMessage (query = maybe_add_timeout_to_query (sel_local , self ._metadata_request_timeout ),
36793682 consistency_level = ConsistencyLevel .ONE ,
36803683 fetch_size = self ._schema_meta_page_size )
3681- (peers_success , peers_result ), (local_success , local_result ) = connection .wait_for_responses (
3682- peers_query , local_query , timeout = self ._timeout , fail_on_error = False )
3683-
3684- if not local_success :
3685- raise local_result
3686-
3687- if not peers_success :
3684+
3685+ # Try to execute peers query (might be peers_v2)
3686+ try :
3687+ peers_result = _fetch_remaining_pages (connection , peers_query , self ._timeout )
3688+ except Exception as e :
36883689 # error with the peers v2 query, fallback to peers v1
36893690 self ._uses_peers_v2 = False
36903691 sel_peers = self ._get_peers_query (self .PeersQueryType .PEERS , connection )
36913692 peers_query = QueryMessage (query = maybe_add_timeout_to_query (sel_peers , self ._metadata_request_timeout ),
36923693 consistency_level = ConsistencyLevel .ONE ,
36933694 fetch_size = self ._schema_meta_page_size )
3694- peers_result = connection .wait_for_response (
3695- peers_query , timeout = self ._timeout )
3696-
3697- # Fetch all pages if there are more results
3698- # Note: system.local always has exactly 1 row, so it will never have additional pages
3699- # system.peers might have multiple pages for very large clusters (>1000 nodes)
3700- peers_result = _fetch_remaining_pages (connection , peers_result , peers_query , self ._timeout )
3701- local_result = _fetch_remaining_pages (connection , local_result , local_query , self ._timeout )
3695+ peers_result = _fetch_remaining_pages (connection , peers_query , self ._timeout )
3696+
3697+ # Fetch local query (note: system.local always has exactly 1 row, so it will never have additional pages)
3698+ local_result = _fetch_remaining_pages (connection , local_query , self ._timeout )
37023699
37033700 shared_results = (peers_result , local_result )
37043701 self ._refresh_node_list_and_token_map (connection , preloaded_results = shared_results )
@@ -3846,14 +3843,12 @@ def _refresh_node_list_and_token_map(self, connection, preloaded_results=None,
38463843 local_query = QueryMessage (query = maybe_add_timeout_to_query (sel_local , self ._metadata_request_timeout ),
38473844 consistency_level = cl ,
38483845 fetch_size = self ._schema_meta_page_size )
3849- peers_result , local_result = connection .wait_for_responses (
3850- peers_query , local_query , timeout = self ._timeout )
38513846
3852- # Fetch all pages if there are more results
3847+ # Fetch all pages for both queries
38533848 # Note: system.local always has exactly 1 row, so it will never have additional pages
38543849 # system.peers might have multiple pages for very large clusters (>1000 nodes)
3855- peers_result = _fetch_remaining_pages (connection , peers_result , peers_query , self ._timeout )
3856- local_result = _fetch_remaining_pages (connection , local_result , local_query , self ._timeout )
3850+ peers_result = _fetch_remaining_pages (connection , peers_query , self ._timeout )
3851+ local_result = _fetch_remaining_pages (connection , local_query , self ._timeout )
38573852
38583853 peers_result = dict_factory (peers_result .column_names , peers_result .parsed_rows )
38593854
@@ -3910,18 +3905,15 @@ def _refresh_node_list_and_token_map(self, connection, preloaded_results=None,
39103905 query = maybe_add_timeout_to_query (self ._SELECT_LOCAL_NO_TOKENS_RPC_ADDRESS , self ._metadata_request_timeout ),
39113906 consistency_level = ConsistencyLevel .ONE ,
39123907 fetch_size = self ._schema_meta_page_size )
3913- success , local_rpc_address_result = connection .wait_for_response (
3914- local_rpc_address_query , timeout = self ._timeout , fail_on_error = False )
3915- if success :
3916- # Fetch all pages for consistency (system.local table always contains exactly one row, so this is effectively a no-op)
3917- local_rpc_address_result = _fetch_remaining_pages (connection , local_rpc_address_result ,
3918- local_rpc_address_query , self ._timeout )
3908+ try :
3909+ # Fetch all pages (system.local table always contains exactly one row, so this is effectively a no-op)
3910+ local_rpc_address_result = _fetch_remaining_pages (connection , local_rpc_address_query , self ._timeout )
39193911 row = dict_factory (
39203912 local_rpc_address_result .column_names ,
39213913 local_rpc_address_result .parsed_rows )
39223914 host .broadcast_rpc_address = _NodeInfo .get_broadcast_rpc_address (row [0 ])
39233915 host .broadcast_rpc_port = _NodeInfo .get_broadcast_rpc_port (row [0 ])
3924- else :
3916+ except Exception :
39253917 host .broadcast_rpc_address = connection .endpoint .address
39263918 host .broadcast_rpc_port = connection .endpoint .port
39273919
@@ -4155,14 +4147,12 @@ def wait_for_schema_agreement(self, connection=None, preloaded_results=None, wai
41554147 fetch_size = self ._schema_meta_page_size )
41564148 try :
41574149 timeout = min (self ._timeout , total_timeout - elapsed )
4158- peers_result , local_result = connection .wait_for_responses (
4159- peers_query , local_query , timeout = timeout )
41604150
41614151 # Fetch all pages if there are more results
41624152 # Note: system.local always has exactly 1 row, so it will never have additional pages
41634153 # system.peers might have multiple pages for very large clusters (>1000 nodes)
4164- peers_result = _fetch_remaining_pages (connection , peers_result , peers_query , timeout )
4165- local_result = _fetch_remaining_pages (connection , local_result , local_query , timeout )
4154+ peers_result = _fetch_remaining_pages (connection , peers_query , timeout )
4155+ local_result = _fetch_remaining_pages (connection , local_query , timeout )
41664156 except OperationTimedOut as timeout :
41674157 log .debug ("[control connection] Timed out waiting for "
41684158 "response during schema agreement check: %s" , timeout )
0 commit comments