From d60ebc5ace71c6873ddcf72f6b48875f38559fc9 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Mon, 19 Sep 2022 16:00:36 +0300 Subject: [PATCH] token_metadata: Add config, spread everywhere Next patches will need to provide some early-start data for topology. The standard way of doing it is via service config, so this patch adds one. The new config is empty in this patch, to be filled later Signed-off-by: Pavel Emelyanov --- locator/token_metadata.cc | 11 ++++++++--- locator/token_metadata.hh | 13 +++++++++---- main.cc | 3 ++- test/boost/network_topology_strategy_test.cc | 10 +++++----- test/boost/storage_proxy_test.cc | 4 ++-- test/lib/cql_test_env.cc | 3 ++- test/manual/gossip.cc | 2 +- tools/schema_loader.cc | 2 +- 8 files changed, 30 insertions(+), 18 deletions(-) diff --git a/locator/token_metadata.cc b/locator/token_metadata.cc index 210a814c97..e4dd3b6463 100644 --- a/locator/token_metadata.cc +++ b/locator/token_metadata.cc @@ -76,10 +76,11 @@ private: struct shallow_copy {}; token_metadata_impl(shallow_copy, const token_metadata_impl& o) noexcept + : _topology(topology::config{}) {} public: - token_metadata_impl() noexcept {}; + token_metadata_impl(token_metadata::config cfg) noexcept : _topology(std::move(cfg.topo_cfg)) {}; token_metadata_impl(const token_metadata_impl&) = delete; // it's too huge for direct copy, use clone_async() token_metadata_impl(token_metadata_impl&&) noexcept = default; const std::vector& sorted_tokens() const; @@ -973,8 +974,8 @@ token_metadata::token_metadata(std::unique_ptr impl) : _impl(std::move(impl)) { } -token_metadata::token_metadata() - : _impl(std::make_unique()) { +token_metadata::token_metadata(config cfg) + : _impl(std::make_unique(std::move(cfg))) { } token_metadata::~token_metadata() = default; @@ -1245,6 +1246,10 @@ inline future<> topology::clear_gently() noexcept { co_return; } +topology::topology(config cfg) +{ +} + topology::topology(const topology& other) : _dc_endpoints(other._dc_endpoints) , _dc_racks(other._dc_racks) diff --git a/locator/token_metadata.hh b/locator/token_metadata.hh index 0beba3436d..bd550f5011 100644 --- a/locator/token_metadata.hh +++ b/locator/token_metadata.hh @@ -45,7 +45,9 @@ struct endpoint_dc_rack { class topology { public: - topology() {} + struct config { + }; + topology(config cfg); topology(const topology& other); future<> clear_gently() noexcept; @@ -135,6 +137,9 @@ class token_metadata_impl; class token_metadata final { std::unique_ptr _impl; public: + struct config { + topology::config topo_cfg; + }; using inet_address = gms::inet_address; private: class tokens_iterator { @@ -158,7 +163,7 @@ private: friend class token_metadata_impl; }; public: - token_metadata(); + token_metadata(config cfg); explicit token_metadata(std::unique_ptr impl); token_metadata(token_metadata&&) noexcept; // Can't use "= default;" - hits some static_assert in unique_ptr token_metadata& operator=(token_metadata&&) noexcept; @@ -350,8 +355,8 @@ class shared_token_metadata { public: // used to construct the shared object as a sharded<> instance // lock_func returns semaphore_units<> - explicit shared_token_metadata(token_metadata_lock_func lock_func) - : _shared(make_token_metadata_ptr()) + explicit shared_token_metadata(token_metadata_lock_func lock_func, token_metadata::config cfg) + : _shared(make_token_metadata_ptr(std::move(cfg))) , _lock_func(std::move(lock_func)) { } diff --git a/main.cc b/main.cc index c3eeaa39a9..95c39d72df 100644 --- a/main.cc +++ b/main.cc @@ -713,7 +713,8 @@ To start the scylla server proper, simply invoke as: scylla server (or just scyl set_abort_on_internal_error(cfg->abort_on_internal_error()); supervisor::notify("starting tokens manager"); - token_metadata.start([] () noexcept { return db::schema_tables::hold_merge_lock(); }).get(); + locator::token_metadata::config tm_cfg; + token_metadata.start([] () noexcept { return db::schema_tables::hold_merge_lock(); }, tm_cfg).get(); // storage_proxy holds a reference on it and is not yet stopped. // what's worse is that the calltrace // storage_proxy::do_query diff --git a/test/boost/network_topology_strategy_test.cc b/test/boost/network_topology_strategy_test.cc index d109da9ff6..36fc643cad 100644 --- a/test/boost/network_topology_strategy_test.cc +++ b/test/boost/network_topology_strategy_test.cc @@ -172,7 +172,7 @@ void full_ring_check(const std::vector& ring_points, } std::unique_ptr generate_topology(const std::vector& pts) { - auto topo = std::make_unique(); + auto topo = std::make_unique(locator::topology::config{}); // This resembles rack_inferring_snitch dc/rack generation which is // still in use by this test via token_metadata internals @@ -199,7 +199,7 @@ void simple_test() { auto stop_snitch = defer([&snitch] { snitch.stop().get(); }); snitch.invoke_on_all(&snitch_ptr::start).get(); - locator::shared_token_metadata stm([] () noexcept { return db::schema_tables::hold_merge_lock(); }); + locator::shared_token_metadata stm([] () noexcept { return db::schema_tables::hold_merge_lock(); }, locator::token_metadata::config{}); std::vector ring_points = { { 1.0, inet_address("192.100.10.1") }, @@ -284,7 +284,7 @@ void heavy_origin_test() { auto stop_snitch = defer([&snitch] { snitch.stop().get(); }); snitch.invoke_on_all(&snitch_ptr::start).get(); - locator::shared_token_metadata stm([] () noexcept { return db::schema_tables::hold_merge_lock(); }); + locator::shared_token_metadata stm([] () noexcept { return db::schema_tables::hold_merge_lock(); }, locator::token_metadata::config{}); std::vector dc_racks = {2, 4, 8}; std::vector dc_endpoints = {128, 256, 512}; @@ -559,7 +559,7 @@ std::unique_ptr generate_topology(const std::unordered_map(); + auto topo = std::make_unique(locator::topology::config{}); for (auto& node : nodes) { const sstring& dc = dcs[udist(0, dcs.size() - 1)(e1)]; @@ -594,7 +594,7 @@ SEASTAR_THREAD_TEST_CASE(testCalculateEndpoints) { for (size_t run = 0; run < RUNS; ++run) { semaphore sem(1); - shared_token_metadata stm([&sem] () noexcept { return get_units(sem, 1); }); + shared_token_metadata stm([&sem] () noexcept { return get_units(sem, 1); }, locator::token_metadata::config{}); auto topo = generate_topology(datacenters, nodes); std::unordered_set random_tokens; diff --git a/test/boost/storage_proxy_test.cc b/test/boost/storage_proxy_test.cc index 01590984f5..8ea20f185f 100644 --- a/test/boost/storage_proxy_test.cc +++ b/test/boost/storage_proxy_test.cc @@ -54,7 +54,7 @@ SEASTAR_TEST_CASE(test_get_restricted_ranges) { { // Ring with minimum token - auto tmptr = locator::make_token_metadata_ptr(); + auto tmptr = locator::make_token_metadata_ptr(locator::token_metadata::config{}); tmptr->update_topology(gms::inet_address("10.0.0.1"), {}); tmptr->update_normal_tokens(std::unordered_set({dht::minimum_token()}), gms::inet_address("10.0.0.1")).get(); @@ -68,7 +68,7 @@ SEASTAR_TEST_CASE(test_get_restricted_ranges) { } { - auto tmptr = locator::make_token_metadata_ptr(); + auto tmptr = locator::make_token_metadata_ptr(locator::token_metadata::config{}); tmptr->update_topology(gms::inet_address("10.0.0.1"), {}); tmptr->update_normal_tokens(std::unordered_set({ring[2].token()}), gms::inet_address("10.0.0.1")).get(); tmptr->update_topology(gms::inet_address("10.0.0.2"), {}); diff --git a/test/lib/cql_test_env.cc b/test/lib/cql_test_env.cc index 757d433ebd..d5621cb649 100644 --- a/test/lib/cql_test_env.cc +++ b/test/lib/cql_test_env.cc @@ -526,7 +526,8 @@ public: } sharded token_metadata; - token_metadata.start([] () noexcept { return db::schema_tables::hold_merge_lock(); }).get(); + locator::token_metadata::config tm_cfg; + token_metadata.start([] () noexcept { return db::schema_tables::hold_merge_lock(); }, tm_cfg).get(); auto stop_token_metadata = defer([&token_metadata] { token_metadata.stop().get(); }); sharded erm_factory; diff --git a/test/manual/gossip.cc b/test/manual/gossip.cc index 67d2fe860f..16db50a081 100644 --- a/test/manual/gossip.cc +++ b/test/manual/gossip.cc @@ -72,7 +72,7 @@ int main(int ac, char ** av) { abort_sources.start().get(); auto stop_abort_source = defer([&] { abort_sources.stop().get(); }); - token_metadata.start([] () noexcept { return db::schema_tables::hold_merge_lock(); }).get(); + token_metadata.start([] () noexcept { return db::schema_tables::hold_merge_lock(); }, locator::token_metadata::config{}).get(); auto stop_token_mgr = defer([&] { token_metadata.stop().get(); }); messaging.start(listen).get(); diff --git a/tools/schema_loader.cc b/tools/schema_loader.cc index 9878f8903d..ad330c2c5e 100644 --- a/tools/schema_loader.cc +++ b/tools/schema_loader.cc @@ -198,7 +198,7 @@ std::vector do_load_schemas(std::string_view schema_str) { feature_service.enable(feature_service.supported_feature_set()); sharded token_metadata; - token_metadata.start([] () noexcept { return db::schema_tables::hold_merge_lock(); }).get(); + token_metadata.start([] () noexcept { return db::schema_tables::hold_merge_lock(); }, locator::token_metadata::config{}).get(); auto stop_token_metadata = deferred_stop(token_metadata); data_dictionary_impl dd_impl;