From 1e437e925ca83697a86fb083a144a1acdc17cbbd Mon Sep 17 00:00:00 2001 From: Asias He Date: Fri, 5 Feb 2016 14:42:02 +0800 Subject: [PATCH] gossip: Introduce get_supported_features - Get features supported by this particular node std::set get_supported_features(inet_address endpoint) const; - Get features supported by all the nodes this node knows about std::set get_supported_features() const; --- gms/gossiper.cc | 41 +++++++++++++++++++++++++++++++++++++++++ gms/gossiper.hh | 6 ++++++ 2 files changed, 47 insertions(+) diff --git a/gms/gossiper.cc b/gms/gossiper.cc index 12b8a91aca..1322783a44 100644 --- a/gms/gossiper.cc +++ b/gms/gossiper.cc @@ -1708,4 +1708,45 @@ bool gossiper::is_safe_for_bootstrap(inet_address endpoint) { return !unsafe_statuses.count(status); } +std::set gossiper::get_supported_features(inet_address endpoint) const { + std::set features; + auto ep_state = get_endpoint_state_for_endpoint(endpoint); + if (!ep_state) { + return features; + } + auto app_state = ep_state->get_application_state(application_state::SUPPORTED_FEATURES); + if (!app_state) { + return features; + } + boost::split(features, app_state->value, boost::is_any_of(",")); + return features; +} + +std::set gossiper::get_supported_features() const { + std::unordered_map> features_map; + std::set common_features; + + for (auto& x : endpoint_state_map) { + auto endpoint = x.first; + auto features = get_supported_features(endpoint); + if (features.empty()) { + return std::set(); + } + if (common_features.empty()) { + common_features = features; + } + features_map.emplace(endpoint, std::move(features)); + } + + for (auto& x : features_map) { + auto& features = x.second; + std::set result; + std::set_intersection(features.begin(), features.end(), + common_features.begin(), common_features.end(), + std::inserter(result, result.begin())); + common_features = std::move(result); + } + return common_features; +} + } // namespace gms diff --git a/gms/gossiper.hh b/gms/gossiper.hh index 2f190af0ea..3c998a5a9e 100644 --- a/gms/gossiper.hh +++ b/gms/gossiper.hh @@ -53,6 +53,7 @@ #include #include #include +#include namespace gms { @@ -513,6 +514,11 @@ private: uint64_t _nr_run = 0; bool _ms_registered = false; bool _gossiped_to_seed = false; +public: + // Get features supported by a particular node + std::set get_supported_features(inet_address endpoint) const; + // Get features supported by all the nodes this node knows about + std::set get_supported_features() const; }; extern distributed _the_gossiper;