From 47844689d8f0e903cd30f793e2f29d92e64e95c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Chojnowski?= Date: Wed, 7 Sep 2022 19:46:54 +0200 Subject: [PATCH] token_metadata: make local_dc_filter a lambda, not a std::function This std::function causes allocations, both on construction and in other operations. This costs ~2200 instructions for a DC-local query. Fix that. Closes #11494 --- locator/token_metadata.cc | 6 ------ locator/token_metadata.hh | 9 ++++++--- service/storage_service.cc | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/locator/token_metadata.cc b/locator/token_metadata.cc index 461c01a7d1..cf65858650 100644 --- a/locator/token_metadata.cc +++ b/locator/token_metadata.cc @@ -1313,12 +1313,6 @@ sstring topology::get_datacenter(inet_address ep) const { return i_endpoint_snitch::get_local_snitch_ptr()->get_datacenter(ep); } -std::function topology::get_local_dc_filter() const noexcept { - return [ this, local_dc = get_datacenter() ] (inet_address ep) { - return get_datacenter(ep) == local_dc; - }; -} - void topology::sort_by_proximity(inet_address address, inet_address_vector_replica_set& addresses) const { if (_sort_by_proximity) { std::sort(addresses.begin(), addresses.end(), [this, &address](inet_address& a1, inet_address& a2) { diff --git a/locator/token_metadata.hh b/locator/token_metadata.hh index 736825e47d..164e3f345f 100644 --- a/locator/token_metadata.hh +++ b/locator/token_metadata.hh @@ -84,12 +84,15 @@ public: sstring get_datacenter() const; sstring get_datacenter(inet_address ep) const; - std::function get_local_dc_filter() const noexcept; + auto get_local_dc_filter() const noexcept { + return [ this, local_dc = get_datacenter() ] (inet_address ep) { + return get_datacenter(ep) == local_dc; + }; + }; template inline size_t count_local_endpoints(const Range& endpoints) const { - auto filter = get_local_dc_filter(); - return std::count_if(endpoints.begin(), endpoints.end(), filter); + return std::count_if(endpoints.begin(), endpoints.end(), get_local_dc_filter()); } /** diff --git a/service/storage_service.cc b/service/storage_service.cc index 779c75d3cb..5ad767d407 100644 --- a/service/storage_service.cc +++ b/service/storage_service.cc @@ -778,7 +778,7 @@ storage_service::get_range_to_address_map_in_local_dc( for (auto entry : orig_map) { auto& addresses = filtered_map[entry.first]; addresses.reserve(entry.second.size()); - std::copy_if(entry.second.begin(), entry.second.end(), std::back_inserter(addresses), local_dc_filter); + std::copy_if(entry.second.begin(), entry.second.end(), std::back_inserter(addresses), std::cref(local_dc_filter)); co_await coroutine::maybe_yield(); }