locator: Make calculate_natural_endpoints take extra token_metadata parameter

When adding/removing a node, we need to use a temporary token_metadata
with pending tokens.
This commit is contained in:
Asias He
2015-10-10 11:40:05 +08:00
parent 7959c12073
commit ddfd417c13
8 changed files with 17 additions and 17 deletions

View File

@@ -75,7 +75,7 @@ std::vector<inet_address> abstract_replication_strategy::get_natural_endpoints(c
auto res = cached_endpoints.find(key_token);
if (res == cached_endpoints.end()) {
auto endpoints = calculate_natural_endpoints(search_token);
auto endpoints = calculate_natural_endpoints(search_token, _token_metadata);
cached_endpoints.emplace(key_token, endpoints);
return std::move(endpoints);
@@ -113,7 +113,7 @@ abstract_replication_strategy::get_ranges(inet_address ep) const {
std::vector<range<token>> ret;
auto prev_tok = _token_metadata.sorted_tokens().back();
for (auto tok : _token_metadata.sorted_tokens()) {
for (inet_address a : calculate_natural_endpoints(tok)) {
for (inet_address a : calculate_natural_endpoints(tok, _token_metadata)) {
if (a == ep) {
ret.emplace_back(
range<token>::bound(prev_tok, false),
@@ -131,7 +131,7 @@ abstract_replication_strategy::get_primary_ranges(inet_address ep) {
std::vector<range<token>> ret;
auto prev_tok = _token_metadata.sorted_tokens().back();
for (auto tok : _token_metadata.sorted_tokens()) {
auto&& eps = calculate_natural_endpoints(tok);
auto&& eps = calculate_natural_endpoints(tok, _token_metadata);
if (eps.size() > 0 && eps[0] == ep) {
ret.emplace_back(
range<token>::bound(prev_tok, false),

View File

@@ -79,7 +79,7 @@ protected:
void validate_replication_factor(sstring rf) const;
virtual std::vector<inet_address> calculate_natural_endpoints(const token& search_token) const = 0;
virtual std::vector<inet_address> calculate_natural_endpoints(const token& search_token, token_metadata& tm) const = 0;
public:
abstract_replication_strategy(

View File

@@ -31,10 +31,10 @@ local_strategy::local_strategy(const sstring& keyspace_name, token_metadata& tok
abstract_replication_strategy(keyspace_name, token_metadata, snitch, config_options, replication_strategy_type::local) {}
std::vector<inet_address> local_strategy::get_natural_endpoints(const token& t) {
return calculate_natural_endpoints(t);
return calculate_natural_endpoints(t, _token_metadata);
}
std::vector<inet_address> local_strategy::calculate_natural_endpoints(const token& t) const {
std::vector<inet_address> local_strategy::calculate_natural_endpoints(const token& t, token_metadata& tm) const {
return std::vector<inet_address>({utils::fb_utilities::get_broadcast_address()});
}

View File

@@ -36,7 +36,7 @@ using token = dht::token;
class local_strategy : public abstract_replication_strategy {
protected:
virtual std::vector<inet_address> calculate_natural_endpoints(const token& search_token) const override;
virtual std::vector<inet_address> calculate_natural_endpoints(const token& search_token, token_metadata& tm) const override;
public:
local_strategy(const sstring& keyspace_name, token_metadata& token_metadata, snitch_ptr& snitch, const std::map<sstring, sstring>& config_options);
virtual ~local_strategy() {};

View File

@@ -89,7 +89,7 @@ network_topology_strategy::network_topology_strategy(
std::vector<inet_address>
network_topology_strategy::calculate_natural_endpoints(
const token& search_token) const {
const token& search_token, token_metadata& tm) const {
//
// We want to preserve insertion order so that the first added endpoint
// becomes primary.
@@ -120,7 +120,7 @@ network_topology_strategy::calculate_natural_endpoints(
skipped_dc_endpoints[dc_name] = {};
}
topology& tp = _token_metadata.get_topology();
topology& tp = tm.get_topology();
//
// all endpoints in each DC, so we can check when we have exhausted all
@@ -141,13 +141,13 @@ network_topology_strategy::calculate_natural_endpoints(
// not aware of any cluster members
assert(!all_endpoints.empty() && !racks.empty());
for (auto& next : _token_metadata.ring_range(search_token)) {
for (auto& next : tm.ring_range(search_token)) {
if (has_sufficient_replicas(dc_replicas, all_endpoints)) {
break;
}
inet_address ep = *_token_metadata.get_endpoint(next);
inet_address ep = *tm.get_endpoint(next);
sstring dc = _snitch->get_datacenter(ep);
auto& seen_racks_dc_set = seen_racks[dc];

View File

@@ -72,7 +72,7 @@ protected:
* progress in each DC, rack etc.
*/
virtual std::vector<inet_address> calculate_natural_endpoints(
const token& search_token) const override;
const token& search_token, token_metadata& tm) const override;
virtual void validate_options() const override;

View File

@@ -41,8 +41,8 @@ simple_strategy::simple_strategy(const sstring& keyspace_name, token_metadata& t
}
}
std::vector<inet_address> simple_strategy::calculate_natural_endpoints(const token& t) const {
const std::vector<token>& tokens = _token_metadata.sorted_tokens();
std::vector<inet_address> simple_strategy::calculate_natural_endpoints(const token& t, token_metadata& tm) const {
const std::vector<token>& tokens = tm.sorted_tokens();
if (tokens.empty()) {
return std::vector<inet_address>();
@@ -52,8 +52,8 @@ std::vector<inet_address> simple_strategy::calculate_natural_endpoints(const tok
utils::sequenced_set<inet_address> endpoints;
endpoints.reserve(replicas);
for (auto& token : _token_metadata.ring_range(t)) {
auto ep = _token_metadata.get_endpoint(token);
for (auto& token : tm.ring_range(t)) {
auto ep = tm.get_endpoint(token);
assert(ep);
endpoints.push_back(*ep);

View File

@@ -30,7 +30,7 @@ namespace locator {
class simple_strategy : public abstract_replication_strategy {
protected:
virtual std::vector<inet_address> calculate_natural_endpoints(const token& search_token) const override;
virtual std::vector<inet_address> calculate_natural_endpoints(const token& search_token, token_metadata& tm) const override;
public:
simple_strategy(const sstring& keyspace_name, token_metadata& token_metadata, snitch_ptr& snitch, const std::map<sstring, sstring>& config_options);
virtual ~simple_strategy() {};