From efda753c0c543128eec7fa95cefedb856e7284c0 Mon Sep 17 00:00:00 2001 From: Asias He Date: Wed, 11 Nov 2015 12:35:24 +0800 Subject: [PATCH] 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 --- locator/token_metadata.cc | 13 +++++++++++++ locator/token_metadata.hh | 20 +------------------- service/storage_proxy.cc | 6 ++++-- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/locator/token_metadata.cc b/locator/token_metadata.cc index ac575e8f6d..59bd298b71 100644 --- a/locator/token_metadata.cc +++ b/locator/token_metadata.cc @@ -489,6 +489,19 @@ void token_metadata::add_moving_endpoint(token t, inet_address endpoint) { _moving_endpoints[t] = endpoint; } +std::vector token_metadata::pending_endpoints_for(const token& token, const sstring& keyspace_name) { + std::vector 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(); diff --git a/locator/token_metadata.hh b/locator/token_metadata.hh index 382235fb12..750ebc4e3e 100644 --- a/locator/token_metadata.hh +++ b/locator/token_metadata.hh @@ -882,25 +882,7 @@ public: return sb.toString(); } #endif - std::vector pending_endpoints_for(const token& token, const keyspace& ks) - { - // FIXME: implement it - return std::vector(); -#if 0 - Map, Collection> ranges = getPendingRanges(keyspaceName); - if (ranges.isEmpty()) - return Collections.emptyList(); - - Set endpoints = new HashSet(); - for (Map.Entry, Collection> entry : ranges.entrySet()) - { - if (entry.getKey().contains(token)) - endpoints.addAll(entry.getValue()); - } - - return endpoints; -#endif - } + std::vector pending_endpoints_for(const token& token, const sstring& keyspace_name); #if 0 /** * @deprecated retained for benefit of old tests diff --git a/service/storage_proxy.cc b/service/storage_proxy.cc index f4bde69ed9..aefc8ff826 100644 --- a/service/storage_proxy.cc +++ b/service/storage_proxy.cc @@ -760,10 +760,12 @@ storage_proxy::mutate_locally(std::vector 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 natural_endpoints = rs.get_natural_endpoints(m.token()); - std::vector pending_endpoints = get_local_storage_service().get_token_metadata().pending_endpoints_for(m.token(), ks); + std::vector 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);