diff --git a/locator/simple_snitch.hh b/locator/simple_snitch.hh index 0fabdb7a7c..ac21b26f3a 100644 --- a/locator/simple_snitch.hh +++ b/locator/simple_snitch.hh @@ -37,16 +37,6 @@ struct simple_snitch : public snitch_base { return "datacenter1"; } - virtual void sort_by_proximity( - inet_address address, inet_address_vector_replica_set& addresses) override { - // Optimization to avoid walking the list - } - - virtual int compare_endpoints(inet_address& target, inet_address& a1, - inet_address& a2) override { - return 0; - } - virtual sstring get_name() const override { return "org.apache.cassandra.locator.SimpleSnitch"; } diff --git a/locator/snitch_base.cc b/locator/snitch_base.cc index 770a88971e..2f78abfe7a 100644 --- a/locator/snitch_base.cc +++ b/locator/snitch_base.cc @@ -13,66 +13,6 @@ #include "gms/application_state.hh" namespace locator { -void snitch_base::sort_by_proximity( - inet_address address, inet_address_vector_replica_set& addresses) { - - std::sort(addresses.begin(), addresses.end(), - [this, &address](inet_address& a1, inet_address& a2) - { - return compare_endpoints(address, a1, a2) < 0; - }); -} - -int snitch_base::compare_endpoints( - inet_address& address, inet_address& a1, inet_address& a2) { - - // - // if one of the Nodes IS the Node we are comparing to and the other one - // IS NOT - then return the appropriate result. - // - if (address == a1 && address != a2) { - return -1; - } - - if (address == a2 && address != a1) { - return 1; - } - - // ...otherwise perform the similar check in regard to Data Center - sstring address_datacenter = get_datacenter(address); - sstring a1_datacenter = get_datacenter(a1); - sstring a2_datacenter = get_datacenter(a2); - - if (address_datacenter == a1_datacenter && - address_datacenter != a2_datacenter) { - return -1; - } else if (address_datacenter == a2_datacenter && - address_datacenter != a1_datacenter) { - return 1; - } else if (address_datacenter == a2_datacenter && - address_datacenter == a1_datacenter) { - // - // ...otherwise (in case Nodes belong to the same Data Center) check - // the racks they belong to. - // - sstring address_rack = get_rack(address); - sstring a1_rack = get_rack(a1); - sstring a2_rack = get_rack(a2); - - if (address_rack == a1_rack && address_rack != a2_rack) { - return -1; - } - - if (address_rack == a2_rack && address_rack != a1_rack) { - return 1; - } - } - // - // We don't differentiate between Nodes if all Nodes belong to different - // Data Centers, thus make them equal. - // - return 0; -} std::list> snitch_base::get_app_states() const { return { diff --git a/locator/snitch_base.hh b/locator/snitch_base.hh index 67a391100a..79d228d203 100644 --- a/locator/snitch_base.hh +++ b/locator/snitch_base.hh @@ -67,20 +67,6 @@ public: */ virtual sstring get_datacenter(inet_address endpoint) = 0; - /** - * This method will sort the List by proximity to the given - * address. - */ - virtual void sort_by_proximity( - inet_address address, inet_address_vector_replica_set& addresses) = 0; - - /** - * compares two endpoints in relation to the target endpoint, returning as - * Comparator.compare would - */ - virtual int compare_endpoints( - inet_address& target, inet_address& a1, inet_address& a2) = 0; - /** * returns whatever info snitch wants to gossip */ @@ -313,12 +299,6 @@ public: // virtual sstring get_datacenter(inet_address endpoint) = 0; // - virtual void sort_by_proximity( - inet_address address, inet_address_vector_replica_set& addresses) override; - - virtual int compare_endpoints( - inet_address& address, inet_address& a1, inet_address& a2) override; - virtual std::list> get_app_states() const override; protected: diff --git a/locator/token_metadata.cc b/locator/token_metadata.cc index 9dd2601553..12b00efb6c 100644 --- a/locator/token_metadata.cc +++ b/locator/token_metadata.cc @@ -1320,7 +1320,60 @@ 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); + if (_sort_by_proximity) { + std::sort(addresses.begin(), addresses.end(), [this, &address](inet_address& a1, inet_address& a2) { + return compare_endpoints(address, a1, a2) < 0; + }); + } +} + +int topology::compare_endpoints(inet_address& address, inet_address& a1, inet_address& a2) const { + // + // if one of the Nodes IS the Node we are comparing to and the other one + // IS NOT - then return the appropriate result. + // + if (address == a1 && address != a2) { + return -1; + } + + if (address == a2 && address != a1) { + return 1; + } + + // ...otherwise perform the similar check in regard to Data Center + sstring address_datacenter = get_datacenter(address); + sstring a1_datacenter = get_datacenter(a1); + sstring a2_datacenter = get_datacenter(a2); + + if (address_datacenter == a1_datacenter && + address_datacenter != a2_datacenter) { + return -1; + } else if (address_datacenter == a2_datacenter && + address_datacenter != a1_datacenter) { + return 1; + } else if (address_datacenter == a2_datacenter && + address_datacenter == a1_datacenter) { + // + // ...otherwise (in case Nodes belong to the same Data Center) check + // the racks they belong to. + // + sstring address_rack = get_rack(address); + sstring a1_rack = get_rack(a1); + sstring a2_rack = get_rack(a2); + + if (address_rack == a1_rack && address_rack != a2_rack) { + return -1; + } + + if (address_rack == a2_rack && address_rack != a1_rack) { + return 1; + } + } + // + // We don't differentiate between Nodes if all Nodes belong to different + // Data Centers, thus make them equal. + // + return 0; } /////////////////// class topology end ///////////////////////////////////////// diff --git a/locator/token_metadata.hh b/locator/token_metadata.hh index d9135b91fe..771709ba99 100644 --- a/locator/token_metadata.hh +++ b/locator/token_metadata.hh @@ -105,6 +105,10 @@ public: return std::count_if(endpoints.begin(), endpoints.end(), filter); } + /** + * This method will sort the List by proximity to the given + * address. + */ void sort_by_proximity(inet_address address, inet_address_vector_replica_set& addresses) const; void disable_proximity_sorting() noexcept { @@ -112,6 +116,12 @@ public: } private: + /** + * compares two endpoints in relation to the target endpoint, returning as + * Comparator.compare would + */ + int compare_endpoints(inet_address& address, inet_address& a1, inet_address& a2) const; + /** multi-map: DC -> endpoints in that DC */ std::unordered_map>