diff --git a/dht/range_streamer.cc b/dht/range_streamer.cc index 7c14800710..769e395daf 100644 --- a/dht/range_streamer.cc +++ b/dht/range_streamer.cc @@ -11,7 +11,6 @@ #include #include "dht/range_streamer.hh" #include "utils/fb_utilities.hh" -#include "locator/snitch_base.hh" #include "replica/database.hh" #include "gms/gossiper.hh" #include "gms/failure_detector.hh" @@ -89,7 +88,6 @@ range_streamer::get_all_ranges_with_sources_for(const sstring& keyspace_name, lo logger.debug("keyspace={}, desired_ranges.size={}, range_addresses.size={}", keyspace_name, desired_ranges.size(), range_addresses.size()); std::unordered_map> range_sources; - auto& snitch = locator::i_endpoint_snitch::get_local_snitch_ptr(); for (auto& desired_range : desired_ranges) { auto found = false; for (auto& x : range_addresses) { @@ -99,7 +97,7 @@ range_streamer::get_all_ranges_with_sources_for(const sstring& keyspace_name, lo const range& src_range = x.first; if (src_range.contains(desired_range, dht::tri_compare)) { inet_address_vector_replica_set preferred(x.second.begin(), x.second.end()); - snitch->sort_by_proximity(_address, preferred); + get_token_metadata().get_topology().sort_by_proximity(_address, preferred); for (inet_address& p : preferred) { range_sources[desired_range].push_back(p); } diff --git a/locator/token_metadata.cc b/locator/token_metadata.cc index 775acce4a7..9dd2601553 100644 --- a/locator/token_metadata.cc +++ b/locator/token_metadata.cc @@ -1319,6 +1319,10 @@ std::function topology::get_local_dc_filter() const noexcept }; } +void topology::sort_by_proximity(inet_address address, inet_address_vector_replica_set& addresses) const { + i_endpoint_snitch::get_local_snitch_ptr()->sort_by_proximity(address, addresses); +} + /////////////////// class topology end ///////////////////////////////////////// void shared_token_metadata::set(mutable_token_metadata_ptr tmptr) noexcept { diff --git a/locator/token_metadata.hh b/locator/token_metadata.hh index 9e454d7994..c7096d2937 100644 --- a/locator/token_metadata.hh +++ b/locator/token_metadata.hh @@ -105,6 +105,8 @@ public: return std::count_if(endpoints.begin(), endpoints.end(), filter); } + void sort_by_proximity(inet_address address, inet_address_vector_replica_set& addresses) const; + private: /** multi-map: DC -> endpoints in that DC */ std::unordered_map& nodes) { auto myip = utils::fb_utilities::get_broadcast_address(); - auto& snitch = locator::i_endpoint_snitch::get_local_snitch_ptr(); inet_address_vector_replica_set sorted_nodes(nodes.begin(), nodes.end()); - snitch->sort_by_proximity(myip, sorted_nodes); + _ri.db.local().get_token_metadata().get_topology().sort_by_proximity(myip, sorted_nodes); return sorted_nodes; } diff --git a/service/storage_proxy.cc b/service/storage_proxy.cc index d3e362ac41..d303cc0e07 100644 --- a/service/storage_proxy.cc +++ b/service/storage_proxy.cc @@ -3003,8 +3003,7 @@ gms::inet_address storage_proxy::find_leader_for_counter_update(const mutation& if (local_endpoints.empty()) { // FIXME: O(n log n) to get maximum - auto& snitch = locator::i_endpoint_snitch::get_local_snitch_ptr(); - snitch->sort_by_proximity(my_address, live_endpoints); + erm->get_topology().sort_by_proximity(my_address, live_endpoints); return live_endpoints[0]; } else { static thread_local std::default_random_engine re{std::random_device{}()}; @@ -5859,8 +5858,8 @@ inet_address_vector_replica_set storage_proxy::get_live_endpoints(const locator: return eps; } -void storage_proxy::sort_endpoints_by_proximity(inet_address_vector_replica_set& eps) { - locator::i_endpoint_snitch::get_local_snitch_ptr()->sort_by_proximity(utils::fb_utilities::get_broadcast_address(), eps); +void storage_proxy::sort_endpoints_by_proximity(inet_address_vector_replica_set& eps) const { + get_token_metadata_ptr()->get_topology().sort_by_proximity(utils::fb_utilities::get_broadcast_address(), eps); // FIXME: before dynamic snitch is implement put local address (if present) at the beginning auto it = boost::range::find(eps, utils::fb_utilities::get_broadcast_address()); if (it != eps.end() && it != eps.begin()) { diff --git a/service/storage_proxy.hh b/service/storage_proxy.hh index 2e5a6cf986..83a283e342 100644 --- a/service/storage_proxy.hh +++ b/service/storage_proxy.hh @@ -332,7 +332,7 @@ private: bool cannot_hint(const Range& targets, db::write_type type) const; bool hints_enabled(db::write_type type) const noexcept; db::hints::manager& hints_manager_for(db::write_type type); - static void sort_endpoints_by_proximity(inet_address_vector_replica_set& eps); + void sort_endpoints_by_proximity(inet_address_vector_replica_set& eps) const; inet_address_vector_replica_set get_live_sorted_endpoints(const locator::effective_replication_map& erm, const dht::token& token) const; bool is_alive(const gms::inet_address&) const; db::read_repair_decision new_read_repair_decision(const schema& s); diff --git a/service/storage_service.cc b/service/storage_service.cc index 101cd3fefb..b11bf612e1 100644 --- a/service/storage_service.cc +++ b/service/storage_service.cc @@ -3082,6 +3082,7 @@ storage_service::get_new_source_ranges(locator::effective_replication_map_ptr er std::unordered_multimap source_ranges; // find alive sources for our new ranges + auto tmptr = erm->get_token_metadata_ptr(); for (auto r : ranges) { inet_address_vector_replica_set sources; auto it = range_addresses.find(r); @@ -3089,8 +3090,7 @@ storage_service::get_new_source_ranges(locator::effective_replication_map_ptr er sources = it->second; } - auto& snitch = locator::i_endpoint_snitch::get_local_snitch_ptr(); - snitch->sort_by_proximity(my_address, sources); + tmptr->get_topology().sort_by_proximity(my_address, sources); if (std::find(sources.begin(), sources.end(), my_address) != sources.end()) { auto err = format("get_new_source_ranges: sources={}, my_address={}", sources, my_address);