diff --git a/locator/token_metadata.cc b/locator/token_metadata.cc index c49472a17f..419df768ca 100644 --- a/locator/token_metadata.cc +++ b/locator/token_metadata.cc @@ -50,6 +50,9 @@ private: */ // FIXME: have to be BiMultiValMap std::unordered_map _token_to_endpoint_map; + // Track the number of nodes in _token_to_endpoint_map. Need to update + // _nr_normal_token_owners when _token_to_endpoint_map is updated. + size_t _nr_normal_token_owners; /** Maintains endpoint to host ID map of every node in the cluster */ std::unordered_map _endpoint_to_host_id_map; @@ -276,6 +279,8 @@ public: /* Returns the number of different endpoints that own tokens in the ring. * Bootstrapping tokens are not taken into account. */ size_t count_normal_token_owners() const; +private: + void update_normal_token_owners(); public: // returns empty vector if keyspace_name not found. @@ -362,6 +367,7 @@ future token_metadata_impl::clone_only_token_map(bool clone return do_for_each(_token_to_endpoint_map, [&ret] (const auto& p) { ret._token_to_endpoint_map.emplace(p); }).then([this, &ret] { + ret._nr_normal_token_owners = _nr_normal_token_owners; ret._endpoint_to_host_id_map = _endpoint_to_host_id_map; }).then([this, &ret] { ret._topology = _topology; @@ -376,6 +382,7 @@ future token_metadata_impl::clone_only_token_map(bool clone future<> token_metadata_impl::clear_gently() noexcept { co_await utils::clear_gently(_token_to_endpoint_map); + update_normal_token_owners(); co_await utils::clear_gently(_endpoint_to_host_id_map); co_await utils::clear_gently(_bootstrap_tokens); co_await utils::clear_gently(_leaving_endpoints); @@ -475,6 +482,7 @@ future<> token_metadata_impl::update_normal_tokens(const std::unordered_map token_metadata_impl::update_pending_ranges( } size_t token_metadata_impl::count_normal_token_owners() const { - std::set eps; + return _nr_normal_token_owners; +} + +void token_metadata_impl::update_normal_token_owners() { + std::unordered_set eps; for (auto [t, ep]: _token_to_endpoint_map) { eps.insert(ep); } - return eps.size(); + _nr_normal_token_owners = eps.size(); } void token_metadata_impl::add_leaving_endpoint(inet_address endpoint) {