Introduce `raft` experimental option.
Adjust the tests accordingly to accomodate the new option.
Hide the code related to `raft_group_registry` behind
the switch. The service object is still constructed
but no initialization is performed (`init()` is not
called) if the flag is not set.
Later, other raft-related things, such as raft schema
changes, will also use this flag.
Also, don't introduce a corresponding gossiper feature
just yet, because again, it should be done after the
raft schema changes API contract is stabilized.
This will be done in a separate series, probably related to
implementing the feature itself.
Tests: unit(dev)
Signed-off-by: Pavel Solodovnikov <
pa.solo...@scylladb.com>
---
Changelog:
v2:
* Rename `raft-schema-changes` flag to just `raft`
* Don't initialize raft RPC if the flag is not set
db/config.cc | 10 ++++++++--
db/config.hh | 2 +-
main.cc | 12 ++++++++++--
test/boost/config_test.cc | 19 +++++++++++++++++++
4 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/db/config.cc b/db/config.cc
index 00897e100a..df8197862b 100644
--- a/db/config.cc
+++ b/db/config.cc
@@ -985,11 +985,17 @@ std::unordered_map<sstring, db::experimental_features_t::feature> db::experiment
// to UNUSED switch for a while, then remove altogether.
// Change Data Capture is no longer experimental. Map it
// to UNUSED_CDC switch for a while, then remove altogether.
- return {{"lwt", UNUSED}, {"udf", UDF}, {"cdc", UNUSED_CDC}, {"alternator-streams", ALTERNATOR_STREAMS}};
+ return {
+ {"lwt", UNUSED},
+ {"udf", UDF},
+ {"cdc", UNUSED_CDC},
+ {"alternator-streams", ALTERNATOR_STREAMS},
+ {"raft", RAFT}
+ };
}
std::vector<enum_option<db::experimental_features_t>> db::experimental_features_t::all() {
- return {UDF, ALTERNATOR_STREAMS};
+ return {UDF, ALTERNATOR_STREAMS, RAFT};
}
std::unordered_map<sstring, db::tri_mode_restriction_t::mode> db::tri_mode_restriction_t::map() {
diff --git a/db/config.hh b/db/config.hh
index c87b813f9b..940f79548c 100644
--- a/db/config.hh
+++ b/db/config.hh
@@ -82,7 +82,7 @@ namespace db {
/// Enumeration of all valid values for the `experimental` config entry.
struct experimental_features_t {
- enum feature { UNUSED, UDF, UNUSED_CDC, ALTERNATOR_STREAMS };
+ enum feature { UNUSED, UDF, UNUSED_CDC, ALTERNATOR_STREAMS, RAFT };
static std::unordered_map<sstring, feature> map(); // See enum_option.
static std::vector<enum_option<experimental_features_t>> all();
};
diff --git a/main.cc b/main.cc
index 871aab16fd..c1d0f5f6e2 100644
--- a/main.cc
+++ b/main.cc
@@ -1105,11 +1105,19 @@ int main(int ac, char** av) {
auto stop_proxy_handlers = defer_verbose_shutdown("storage proxy RPC verbs", [&proxy] {
proxy.invoke_on_all(&service::storage_proxy::uninit_messaging_service).get();
});
- supervisor::notify("starting Raft RPC");
- raft_gr.invoke_on_all(&service::raft_group_registry::init).get();
+
+ const bool raft_enabled = cfg->check_experimental(db::experimental_features_t::RAFT);
+ if (raft_enabled) {
+ supervisor::notify("starting Raft RPC");
+ raft_gr.invoke_on_all(&service::raft_group_registry::init).get();
+ }
auto stop_raft_rpc = defer_verbose_shutdown("Raft RPC", [&raft_gr] {
raft_gr.invoke_on_all(&service::raft_group_registry::uninit).get();
});
+ if (!raft_enabled) {
+ stop_raft_rpc->cancel();
+ }
+
supervisor::notify("starting streaming service");
streaming::stream_session::init_streaming_service(db, sys_dist_ks, view_update_generator, messaging, mm).get();
auto stop_streaming_service = defer_verbose_shutdown("streaming service", [] {
diff --git a/test/boost/config_test.cc b/test/boost/config_test.cc
index cb3bc3ea9f..7189122a9e 100644
--- a/test/boost/config_test.cc
+++ b/test/boost/config_test.cc
@@ -936,6 +936,7 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_cdc) {
BOOST_CHECK(!cfg.check_experimental(ef::UNUSED));
BOOST_CHECK(!cfg.check_experimental(ef::UDF));
BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS));
+ BOOST_CHECK(!cfg.check_experimental(ef::RAFT));
return make_ready_future();
}
@@ -948,6 +949,7 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_unused) {
BOOST_CHECK(cfg.check_experimental(ef::UNUSED));
BOOST_CHECK(!cfg.check_experimental(ef::UDF));
BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS));
+ BOOST_CHECK(!cfg.check_experimental(ef::RAFT));
return make_ready_future();
}
@@ -960,6 +962,7 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_udf) {
BOOST_CHECK(!cfg.check_experimental(ef::UNUSED));
BOOST_CHECK(cfg.check_experimental(ef::UDF));
BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS));
+ BOOST_CHECK(!cfg.check_experimental(ef::RAFT));
return make_ready_future();
}
@@ -972,6 +975,20 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_alternator_streams) {
BOOST_CHECK(!cfg.check_experimental(ef::UNUSED));
BOOST_CHECK(!cfg.check_experimental(ef::UDF));
BOOST_CHECK(cfg.check_experimental(ef::ALTERNATOR_STREAMS));
+ BOOST_CHECK(!cfg.check_experimental(ef::RAFT));
+ return make_ready_future();
+}
+
+SEASTAR_TEST_CASE(test_parse_experimental_features_raft) {
+ auto cfg_ptr = std::make_unique<config>();
+ config& cfg = *cfg_ptr;
+ cfg.read_from_yaml("experimental_features:\n - raft\n", throw_on_error);
+ BOOST_CHECK_EQUAL(cfg.experimental_features(), features{ef::RAFT});
+ BOOST_CHECK(!cfg.check_experimental(ef::UNUSED_CDC));
+ BOOST_CHECK(!cfg.check_experimental(ef::UNUSED));
+ BOOST_CHECK(!cfg.check_experimental(ef::UDF));
+ BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS));
+ BOOST_CHECK(cfg.check_experimental(ef::RAFT));
return make_ready_future();
}
@@ -1011,6 +1028,7 @@ SEASTAR_TEST_CASE(test_parse_experimental_true) {
BOOST_CHECK(!cfg.check_experimental(ef::UNUSED));
BOOST_CHECK(cfg.check_experimental(ef::UDF));
BOOST_CHECK(cfg.check_experimental(ef::ALTERNATOR_STREAMS));
+ BOOST_CHECK(cfg.check_experimental(ef::RAFT));
return make_ready_future();
}
@@ -1022,5 +1040,6 @@ SEASTAR_TEST_CASE(test_parse_experimental_false) {
BOOST_CHECK(!cfg.check_experimental(ef::UNUSED));
BOOST_CHECK(!cfg.check_experimental(ef::UDF));
BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS));
+ BOOST_CHECK(!cfg.check_experimental(ef::RAFT));
return make_ready_future();
}
--
2.31.1