@@ -400,6 +400,9 @@ void ControlConnection::on_event(EventResponse* response) {
400
400
void ControlConnection::query_meta_hosts () {
401
401
ScopedRefPtr<ControlMultipleRequestHandler<UnusedData> > handler (
402
402
new ControlMultipleRequestHandler<UnusedData>(this , ControlConnection::on_query_hosts, UnusedData ()));
403
+ // This needs to happen before other schema metadata queries so that we have
404
+ // a valid Cassandra version because this version determines which follow up
405
+ // schema metadata queries are executed.
403
406
handler->execute_query (" local" , token_aware_routing_ ? SELECT_LOCAL_TOKENS : SELECT_LOCAL);
404
407
handler->execute_query (" peers" , token_aware_routing_ ? SELECT_PEERS_TOKENS : SELECT_PEERS);
405
408
}
@@ -415,7 +418,8 @@ void ControlConnection::on_query_hosts(ControlConnection* control_connection,
415
418
Session* session = control_connection->session_ ;
416
419
417
420
if (session->token_map_ ) {
418
- session->token_map_ ->clear_hosts ();
421
+ // Clearing token/hosts will not invalidate the replicas
422
+ session->token_map_ ->clear_tokens_and_hosts ();
419
423
}
420
424
421
425
bool is_initial_connection = (control_connection->state_ == CONTROL_STATE_NEW);
@@ -433,7 +437,7 @@ void ControlConnection::on_query_hosts(ControlConnection* control_connection,
433
437
ResultResponse* local_result;
434
438
if (MultipleRequestHandler::get_result_response (responses, " local" , &local_result) &&
435
439
local_result->row_count () > 0 ) {
436
- control_connection->update_node_info (host, &local_result->first_row (), ADD_NODE );
440
+ control_connection->update_node_info (host, &local_result->first_row (), ADD_HOST );
437
441
control_connection->cassandra_version_ = host->cassandra_version ();
438
442
} else {
439
443
LOG_WARN (" No row found in %s's local system table" ,
@@ -472,7 +476,7 @@ void ControlConnection::on_query_hosts(ControlConnection* control_connection,
472
476
473
477
host->set_mark (session->current_host_mark_ );
474
478
475
- control_connection->update_node_info (host, rows.row (), ADD_NODE );
479
+ control_connection->update_node_info (host, rows.row (), ADD_HOST );
476
480
if (is_new && !is_initial_connection) {
477
481
session->on_add (host, false );
478
482
}
@@ -546,12 +550,12 @@ void ControlConnection::on_query_meta_schema(ControlConnection* control_connecti
546
550
bool is_initial_connection = (control_connection->state_ == CONTROL_STATE_NEW);
547
551
548
552
if (session->token_map_ ) {
549
- session->token_map_ ->clear_keyspaces ();
550
-
551
553
ResultResponse* keyspaces_result;
552
554
if (MultipleRequestHandler::get_result_response (responses, " keyspaces" , &keyspaces_result)) {
555
+ session->token_map_ ->clear_replicas_and_strategies (); // Only clear replicas once we have the new keyspaces
553
556
session->token_map_ ->add_keyspaces (cassandra_version, keyspaces_result);
554
557
}
558
+ session->token_map_ ->build ();
555
559
}
556
560
557
561
if (control_connection->use_schema_ ) {
@@ -600,10 +604,6 @@ void ControlConnection::on_query_meta_schema(ControlConnection* control_connecti
600
604
session->metadata ().swap_to_back_and_update_front ();
601
605
}
602
606
603
- if (session->token_map_ ) {
604
- session->token_map_ ->build ();
605
- }
606
-
607
607
if (is_initial_connection) {
608
608
control_connection->state_ = CONTROL_STATE_READY;
609
609
session->on_control_connection_ready ();
@@ -674,7 +674,7 @@ void ControlConnection::on_refresh_node_info(ControlConnection* control_connecti
674
674
host_address_str.c_str ());
675
675
return ;
676
676
}
677
- control_connection->update_node_info (data.host , &result->first_row (), UPDATE_NODE );
677
+ control_connection->update_node_info (data.host , &result->first_row (), UPDATE_HOST_AND_BUILD );
678
678
679
679
if (data.is_new_node ) {
680
680
control_connection->session_ ->on_add (data.host , false );
@@ -712,7 +712,7 @@ void ControlConnection::on_refresh_node_info_all(ControlConnection* control_conn
712
712
row->get_by_name (" rpc_address" ),
713
713
&address);
714
714
if (is_valid_address && data.host ->address ().compare (address) == 0 ) {
715
- control_connection->update_node_info (data.host , row, UPDATE_NODE );
715
+ control_connection->update_node_info (data.host , row, UPDATE_HOST_AND_BUILD );
716
716
if (data.is_new_node ) {
717
717
control_connection->session_ ->on_add (data.host , false );
718
718
}
@@ -721,7 +721,7 @@ void ControlConnection::on_refresh_node_info_all(ControlConnection* control_conn
721
721
}
722
722
}
723
723
724
- void ControlConnection::update_node_info (SharedRefPtr<Host> host, const Row* row, UpdateNodeType type) {
724
+ void ControlConnection::update_node_info (SharedRefPtr<Host> host, const Row* row, UpdateHostType type) {
725
725
const Value* v;
726
726
727
727
std::string rack;
@@ -774,7 +774,7 @@ void ControlConnection::update_node_info(SharedRefPtr<Host> host, const Row* row
774
774
v = row->get_by_name (" tokens" );
775
775
if (v != NULL && v->is_collection ()) {
776
776
if (session_->token_map_ ) {
777
- if (type == UPDATE_NODE ) {
777
+ if (type == UPDATE_HOST_AND_BUILD ) {
778
778
session_->token_map_ ->update_host_and_build (host, v);
779
779
} else {
780
780
session_->token_map_ ->add_host (host, v);
@@ -1082,6 +1082,17 @@ void ControlConnection::on_reconnect(Timer* timer) {
1082
1082
control_connection->reconnect (false );
1083
1083
}
1084
1084
1085
+ template <class T >
1086
+ void ControlConnection::ControlMultipleRequestHandler<T>::execute_query(
1087
+ const std::string& index, const std::string& query) {
1088
+ // We need to update the loop time to prevent new requests from timing out
1089
+ // in cases where a callback took a long time to execute. In the future,
1090
+ // we might improve this by executing the these long running callbacks
1091
+ // on a seperate thread.
1092
+ uv_update_time (control_connection_->session_ ->loop ());
1093
+ MultipleRequestHandler::execute_query (index, query);
1094
+ }
1095
+
1085
1096
template <class T >
1086
1097
void ControlConnection::ControlMultipleRequestHandler<T>::on_set(
1087
1098
const MultipleRequestHandler::ResponseMap& responses) {
0 commit comments