From afe0f7dc85bedb7b4df805d82531954aa6e35f8e Mon Sep 17 00:00:00 2001 From: Shlomi Livne Date: Mon, 22 Jun 2015 00:21:12 +0300 Subject: [PATCH 1/4] Add support for local_strategy Signed-off-by: Shlomi Livne --- configure.py | 1 + locator/local_strategy.cc | 29 +++++++++++++++++++++++++++++ locator/local_strategy.hh | 26 ++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 locator/local_strategy.cc create mode 100644 locator/local_strategy.hh diff --git a/configure.py b/configure.py index fef3ddda74..48e9554f79 100755 --- a/configure.py +++ b/configure.py @@ -456,6 +456,7 @@ urchin_core = (['database.cc', 'query-result-set.cc', 'locator/abstract_replication_strategy.cc', 'locator/simple_strategy.cc', + 'locator/local_strategy.cc', 'locator/token_metadata.cc', 'locator/locator.cc', 'locator/snitch_base.cc', diff --git a/locator/local_strategy.cc b/locator/local_strategy.cc new file mode 100644 index 0000000000..4d5770cf4d --- /dev/null +++ b/locator/local_strategy.cc @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2015 Cloudius Systems, Ltd. + */ + +#include +#include "local_strategy.hh" +#include "utils/class_registrator.hh" +#include "utils/fb_utilities.hh" + + +namespace locator { + +local_strategy::local_strategy(const sstring& keyspace_name, token_metadata& token_metadata, snitch_ptr&& snitch, const std::map& config_options) : + abstract_replication_strategy(keyspace_name, token_metadata, std::move(snitch), config_options) {} + +std::vector local_strategy::calculate_natural_endpoints(const token& t) { + std::vector endpoints; + endpoints.push_back(utils::fb_utilities::get_broadcast_address()); + return endpoints; +} + +size_t local_strategy::get_replication_factor() const { + return 1; +} + +using registry = class_registrator&>; +static registry registrator("org.apache.cassandra.locator.LocalStrategy"); + +} diff --git a/locator/local_strategy.hh b/locator/local_strategy.hh new file mode 100644 index 0000000000..47a5476df7 --- /dev/null +++ b/locator/local_strategy.hh @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2015 Cloudius Systems, Ltd. + */ + +#pragma once + +#include "abstract_replication_strategy.hh" + +// forward declaration since database.hh includes this file +class keyspace; + +namespace locator { + +using inet_address = gms::inet_address; +using token = dht::token; + +class local_strategy : public abstract_replication_strategy { +protected: + virtual std::vector calculate_natural_endpoints(const token& search_token); +public: + local_strategy(const sstring& keyspace_name, token_metadata& token_metadata, snitch_ptr&& snitch, const std::map& config_options); + virtual ~local_strategy() {}; + virtual size_t get_replication_factor() const; +}; + +} From 0ce374a853289c81f4e0253785597d540fc805cb Mon Sep 17 00:00:00 2001 From: Shlomi Livne Date: Mon, 22 Jun 2015 00:23:03 +0300 Subject: [PATCH 2/4] Add support for setting keyspace replication_strategy To support initialization of system tables keyspace replication_strategy without the need of having snitch creation. Signed-off-by: Shlomi Livne --- database.cc | 5 +++++ database.hh | 3 +++ 2 files changed, 8 insertions(+) diff --git a/database.cc b/database.cc index 8b0b86408f..b87cecee46 100644 --- a/database.cc +++ b/database.cc @@ -749,6 +749,11 @@ keyspace::get_replication_strategy() { return *_replication_strategy; } +void +keyspace::set_replication_strategy(std::unique_ptr replication_strategy) { + _replication_strategy = std::move(replication_strategy); +} + column_family::config keyspace::make_column_family_config(const schema& s) const { column_family::config cfg; diff --git a/database.hh b/database.hh index 8e1bf0c4d2..ff542a6086 100644 --- a/database.hh +++ b/database.hh @@ -253,6 +253,9 @@ public: return make_ready_future<>(); } + + // FIXME to allow simple registration at boostrap + void set_replication_strategy(std::unique_ptr replication_strategy); private: sstring column_family_directory(const sstring& name, utils::UUID uuid) const; }; From 36ab6c1a5ad7220ed776bfcb0a4369b6e2abda91 Mon Sep 17 00:00:00 2001 From: Shlomi Livne Date: Mon, 22 Jun 2015 13:18:14 +0300 Subject: [PATCH 3/4] Changing order of database and storage_service initialization Signed-off-by: Shlomi Livne --- main.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/main.cc b/main.cc index 7c51de7624..fbd97d7c14 100644 --- a/main.cc +++ b/main.cc @@ -53,11 +53,12 @@ int main(int ac, char** av) { sstring listen_address = cfg->listen_address(); sstring rpc_address = cfg->rpc_address(); auto seed_provider= cfg->seed_provider(); - return db.start(std::move(*cfg)).then([&db] { - engine().at_exit([&db] { return db.stop(); }); - return db.invoke_on_all(&database::init_from_data_directory); - }).then([] { - return service::init_storage_service(); + + return service::init_storage_service().then([&db,&cfg] { + return db.start(std::move(*cfg)).then([&db] { + engine().at_exit([&db] { return db.stop(); }); + return db.invoke_on_all(&database::init_from_data_directory); + }); }).then([listen_address, seed_provider] { return net::init_messaging_service(listen_address, seed_provider); }).then([&proxy, &db] { From b3e4094e117ef0b75da254954e154f6c6635149f Mon Sep 17 00:00:00 2001 From: Shlomi Livne Date: Mon, 22 Jun 2015 00:25:48 +0300 Subject: [PATCH 4/4] Updating setting of system keyspace strategy to be local_strategy Signed-off-by: Shlomi Livne --- db/system_keyspace.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/db/system_keyspace.cc b/db/system_keyspace.cc index ff930934f7..3c9e8cb570 100644 --- a/db/system_keyspace.cc +++ b/db/system_keyspace.cc @@ -23,6 +23,7 @@ #include "system_keyspace.hh" #include "types.hh" +#include "service/storage_service.hh" namespace db { namespace system_keyspace { @@ -1002,12 +1003,14 @@ std::vector all_tables() { void make(database& db, bool durable) { auto ksm = make_lw_shared(NAME, - "org.apache.cassandra.locator.SimpleStrategy", + "org.apache.cassandra.locator.LocalStrategy", std::map{}, durable ); auto kscfg = db.make_keyspace_config(*ksm); keyspace _ks{ksm, std::move(kscfg)}; + auto rs(locator::abstract_replication_strategy::create_replication_strategy(NAME, "LocalStrategy", service::get_local_storage_service().get_token_metadata(), nullptr, ksm->strategy_options())); + _ks.set_replication_strategy(std::move(rs)); db.add_keyspace(NAME, std::move(_ks)); auto& ks = db.find_keyspace(NAME); for (auto&& table : all_tables()) {