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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user