abstract_replication_strategy: get_pending_address_ranges: prevent extra vector copies

Reduce large allocations and reactor stalls seen in #11005
by open coding `get_address_ranges` and using std::vector::insert
to efficiently appending the ranges returned by `get_primary_ranges_for`
onto the returned token_range_vector in contrast to building
an unordered_multimap<inet_address, dht::token_range> first in
`get_address_ranges` and traversing it and adding one token_range
at a time.

Signed-off-by: Benny Halevy <bhalevy@scylladb.com>
This commit is contained in:
Benny Halevy
2022-07-10 17:26:52 +03:00
parent 7811b0d0aa
commit 1d4aea4441

View File

@@ -294,8 +294,13 @@ abstract_replication_strategy::get_pending_address_ranges(const token_metadata_p
token_metadata temp;
temp = co_await tmptr->clone_only_token_map();
co_await temp.update_normal_tokens(pending_tokens, pending_address);
for (auto& x : co_await get_address_ranges(temp, pending_address)) {
ret.push_back(x.second);
for (const auto& t : temp.sorted_tokens()) {
auto eps = co_await calculate_natural_endpoints(t, temp);
if (eps.contains(pending_address)) {
dht::token_range_vector r = temp.get_primary_ranges_for(t);
rslogger.debug("get_pending_address_ranges: token={} primary_range={} endpoint={}", t, r, pending_address);
ret.insert(ret.end(), r.begin(), r.end());
}
}
co_await temp.clear_gently();
co_return ret;