token_metadata: Implement pending_endpoints_for

It is used in storage_proxy::create_write_response_handler. The second
argument should be keyspace name instead of the keyspace class.

Refs: #539
This commit is contained in:
Asias He
2015-11-11 12:35:24 +08:00
committed by Pekka Enberg
parent 72573d0b46
commit efda753c0c
3 changed files with 18 additions and 21 deletions

View File

@@ -489,6 +489,19 @@ void token_metadata::add_moving_endpoint(token t, inet_address endpoint) {
_moving_endpoints[t] = endpoint;
}
std::vector<gms::inet_address> token_metadata::pending_endpoints_for(const token& token, const sstring& keyspace_name) {
std::vector<gms::inet_address> endpoints;
auto ranges = get_pending_ranges(keyspace_name);
for (auto& x : ranges) {
if (x.first.contains(token, dht::token_comparator())) {
for (auto& addr : x.second) {
endpoints.push_back(addr);
}
}
}
return endpoints;
}
/////////////////// class topology /////////////////////////////////////////////
inline void topology::clear() {
_dc_endpoints.clear();

View File

@@ -882,25 +882,7 @@ public:
return sb.toString();
}
#endif
std::vector<gms::inet_address> pending_endpoints_for(const token& token, const keyspace& ks)
{
// FIXME: implement it
return std::vector<gms::inet_address>();
#if 0
Map<Range<Token>, Collection<InetAddress>> ranges = getPendingRanges(keyspaceName);
if (ranges.isEmpty())
return Collections.emptyList();
Set<InetAddress> endpoints = new HashSet<InetAddress>();
for (Map.Entry<Range<Token>, Collection<InetAddress>> entry : ranges.entrySet())
{
if (entry.getKey().contains(token))
endpoints.addAll(entry.getValue());
}
return endpoints;
#endif
}
std::vector<gms::inet_address> pending_endpoints_for(const token& token, const sstring& keyspace_name);
#if 0
/**
* @deprecated retained for benefit of old tests

View File

@@ -760,10 +760,12 @@ storage_proxy::mutate_locally(std::vector<mutation> mutations) {
*/
storage_proxy::response_id_type
storage_proxy::create_write_response_handler(const mutation& m, db::consistency_level cl, db::write_type type) {
keyspace& ks = _db.local().find_keyspace(m.schema()->ks_name());
auto keyspace_name = m.schema()->ks_name();
keyspace& ks = _db.local().find_keyspace(keyspace_name);
auto& rs = ks.get_replication_strategy();
std::vector<gms::inet_address> natural_endpoints = rs.get_natural_endpoints(m.token());
std::vector<gms::inet_address> pending_endpoints = get_local_storage_service().get_token_metadata().pending_endpoints_for(m.token(), ks);
std::vector<gms::inet_address> pending_endpoints =
get_local_storage_service().get_token_metadata().pending_endpoints_for(m.token(), keyspace_name);
auto all = boost::range::join(natural_endpoints, pending_endpoints);