locator: add a replication strategy type field to abstract_replication_strategy

This is meant to exclude the exceptions throwing when we want to
branch on a specific instance type (Java's instanceof call).

Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
This commit is contained in:
Vlad Zolotarov
2015-06-30 13:00:01 +03:00
parent a4d2946d20
commit 888a33f9d2
5 changed files with 29 additions and 6 deletions

View File

@@ -8,8 +8,17 @@
namespace locator {
abstract_replication_strategy::abstract_replication_strategy(const sstring& ks_name, token_metadata& token_metadata, snitch_ptr& snitch, const std::map<sstring, sstring>& config_options) :
_ks_name(ks_name), _config_options(config_options), _token_metadata(token_metadata), _snitch(snitch) {}
abstract_replication_strategy::abstract_replication_strategy(
const sstring& ks_name,
token_metadata& token_metadata,
snitch_ptr& snitch,
const std::map<sstring, sstring>& config_options,
replication_strategy_type my_type)
: _ks_name(ks_name)
, _config_options(config_options)
, _token_metadata(token_metadata)
, _snitch(snitch)
, _my_type(my_type) {}
std::unique_ptr<abstract_replication_strategy> abstract_replication_strategy::create_replication_strategy(const sstring& ks_name, const sstring& strategy_name, token_metadata& tk_metadata, const std::map<sstring, sstring>& config_options) {
assert(locator::i_endpoint_snitch::get_local_snitch_ptr());

View File

@@ -20,6 +20,12 @@ namespace locator {
using inet_address = gms::inet_address;
using token = dht::token;
enum class replication_strategy_type {
simple,
local,
network_topology,
};
class abstract_replication_strategy {
private:
long _last_invalidated_ring_version = 0;
@@ -41,6 +47,7 @@ protected:
std::map<sstring, sstring> _config_options;
token_metadata& _token_metadata;
snitch_ptr& _snitch;
replication_strategy_type _my_type;
template <typename... Args>
void err(const char* fmt, Args&&... args) const {
@@ -62,12 +69,18 @@ protected:
virtual std::vector<inet_address> calculate_natural_endpoints(const token& search_token) = 0;
public:
abstract_replication_strategy(const sstring& keyspace_name, token_metadata& token_metadata, snitch_ptr& snitch, const std::map<sstring, sstring>& config_options);
abstract_replication_strategy(
const sstring& keyspace_name,
token_metadata& token_metadata,
snitch_ptr& snitch,
const std::map<sstring, sstring>& config_options,
replication_strategy_type my_type);
virtual ~abstract_replication_strategy() {}
static std::unique_ptr<abstract_replication_strategy> create_replication_strategy(const sstring& ks_name, const sstring& strategy_name, token_metadata& token_metadata, const std::map<sstring, sstring>& config_options);
std::vector<inet_address> get_natural_endpoints(const token& search_token);
virtual size_t get_replication_factor() const = 0;
uint64_t get_cache_hits_count() const { return _cache_hits_count; }
replication_strategy_type get_type() const { return _my_type; }
};
}

View File

@@ -11,7 +11,7 @@
namespace locator {
local_strategy::local_strategy(const sstring& keyspace_name, token_metadata& token_metadata, snitch_ptr& snitch, const std::map<sstring, sstring>& config_options) :
abstract_replication_strategy(keyspace_name, token_metadata, snitch, config_options) {}
abstract_replication_strategy(keyspace_name, token_metadata, snitch, config_options, replication_strategy_type::local) {}
std::vector<inet_address> local_strategy::calculate_natural_endpoints(const token& t) {
std::vector<inet_address> endpoints;

View File

@@ -34,7 +34,8 @@ network_topology_strategy::network_topology_strategy(
abstract_replication_strategy(keyspace_name,
token_metadata,
snitch,
config_options) {
config_options,
replication_strategy_type::network_topology) {
for (auto& config_pair : config_options) {
auto& key = config_pair.first;
auto& val = config_pair.second;

View File

@@ -11,7 +11,7 @@
namespace locator {
simple_strategy::simple_strategy(const sstring& keyspace_name, token_metadata& token_metadata, snitch_ptr& snitch, const std::map<sstring, sstring>& config_options) :
abstract_replication_strategy(keyspace_name, token_metadata, snitch, config_options) {
abstract_replication_strategy(keyspace_name, token_metadata, snitch, config_options, replication_strategy_type::simple) {
for (auto& config_pair : config_options) {
auto& key = config_pair.first;
auto& val = config_pair.second;