From cb6004b625fb97374831ceb0e2fc489d2e47ba06 Mon Sep 17 00:00:00 2001 From: Benny Halevy Date: Thu, 26 Mar 2026 17:04:48 +0200 Subject: [PATCH] db: call initialize_virtual_tables from shard 0 only Move the smp::invoke_on_all dispatch from the callers into initialize_virtual_tables() itself, so the function is called once from shard 0 and internally distributes the per-shard virtual table setup to all shards. This simplifies the callers and allows a single place to add cross-shard coordination logic (e.g. feature-gated table registration) in future commits. --- db/virtual_tables.cc | 64 +++++++++++++++++++++------------------- main.cc | 4 +-- test/lib/cql_test_env.cc | 4 +-- 3 files changed, 35 insertions(+), 37 deletions(-) diff --git a/db/virtual_tables.cc b/db/virtual_tables.cc index 668c4ff4fa..0b9909562f 100644 --- a/db/virtual_tables.cc +++ b/db/virtual_tables.cc @@ -1470,40 +1470,42 @@ future<> initialize_virtual_tables( sharded& tablet_allocator, sharded& ms, db::config& cfg) { - auto& virtual_tables_registry = sys_ks.local().get_virtual_tables_registry(); - auto& virtual_tables = *virtual_tables_registry; - auto& db = dist_db.local(); - auto& ss = dist_ss.local(); + co_await smp::invoke_on_all([&] () -> future<> { + auto& virtual_tables_registry = sys_ks.local().get_virtual_tables_registry(); + auto& virtual_tables = *virtual_tables_registry; + auto& db = dist_db.local(); + auto& ss = dist_ss.local(); - auto add_table = [&] (std::unique_ptr&& tbl) -> future<> { - auto schema = tbl->schema(); - virtual_tables[schema->id()] = std::move(tbl); - co_await db.create_local_system_table(schema, false, ss.get_erm_factory()); - auto& cf = db.find_column_family(schema); - cf.mark_ready_for_writes(nullptr); - auto& vt = virtual_tables[schema->id()]; - cf.set_virtual_reader(vt->as_mutation_source()); - cf.set_virtual_writer([&vt = *vt] (const frozen_mutation& m) { return vt.apply(m); }); - }; + auto add_table = [&] (std::unique_ptr&& tbl) -> future<> { + auto schema = tbl->schema(); + virtual_tables[schema->id()] = std::move(tbl); + co_await db.create_local_system_table(schema, false, ss.get_erm_factory()); + auto& cf = db.find_column_family(schema); + cf.mark_ready_for_writes(nullptr); + auto& vt = virtual_tables[schema->id()]; + cf.set_virtual_reader(vt->as_mutation_source()); + cf.set_virtual_writer([&vt = *vt] (const frozen_mutation& m) { return vt.apply(m); }); + }; - // Add built-in virtual tables here. - co_await add_table(std::make_unique(dist_ss, dist_gossiper)); - co_await add_table(std::make_unique(db, ss)); - co_await add_table(std::make_unique(dist_db)); - co_await add_table(std::make_unique(ss)); - co_await add_table(std::make_unique(dist_db, ss)); - co_await add_table(std::make_unique()); - co_await add_table(std::make_unique(cfg)); - co_await add_table(std::make_unique(ss)); - co_await add_table(std::make_unique(dist_raft_gr)); - co_await add_table(std::make_unique(tablet_allocator, dist_db, dist_raft_gr, ms, dist_gossiper)); - co_await add_table(std::make_unique(tablet_allocator, dist_db, dist_raft_gr, ms)); - co_await add_table(std::make_unique(db, ss)); - co_await add_table(std::make_unique(db, ss)); + // Add built-in virtual tables here. + co_await add_table(std::make_unique(dist_ss, dist_gossiper)); + co_await add_table(std::make_unique(db, ss)); + co_await add_table(std::make_unique(dist_db)); + co_await add_table(std::make_unique(ss)); + co_await add_table(std::make_unique(dist_db, ss)); + co_await add_table(std::make_unique()); + co_await add_table(std::make_unique(cfg)); + co_await add_table(std::make_unique(ss)); + co_await add_table(std::make_unique(dist_raft_gr)); + co_await add_table(std::make_unique(tablet_allocator, dist_db, dist_raft_gr, ms, dist_gossiper)); + co_await add_table(std::make_unique(tablet_allocator, dist_db, dist_raft_gr, ms)); + co_await add_table(std::make_unique(db, ss)); + co_await add_table(std::make_unique(db, ss)); - db.find_column_family(system_keyspace::size_estimates()).set_virtual_reader(mutation_source(db::size_estimates::virtual_reader(db, sys_ks.local()))); - db.find_column_family(system_keyspace::views_builds_in_progress()).set_virtual_reader(mutation_source(db::view::build_progress_virtual_reader(db))); - db.find_column_family(system_keyspace::built_indexes()).set_virtual_reader(mutation_source(db::index::built_indexes_virtual_reader(db))); + db.find_column_family(system_keyspace::size_estimates()).set_virtual_reader(mutation_source(db::size_estimates::virtual_reader(db, sys_ks.local()))); + db.find_column_family(system_keyspace::views_builds_in_progress()).set_virtual_reader(mutation_source(db::view::build_progress_virtual_reader(db))); + db.find_column_family(system_keyspace::built_indexes()).set_virtual_reader(mutation_source(db::index::built_indexes_virtual_reader(db))); + }); } virtual_tables_registry::virtual_tables_registry() : unique_ptr(std::make_unique()) { diff --git a/main.cc b/main.cc index 44678c836a..f2cad1f061 100644 --- a/main.cc +++ b/main.cc @@ -1963,9 +1963,7 @@ To start the scylla server proper, simply invoke as: scylla server (or just scyl }); checkpoint(stop_signal, "initializing virtual tables"); - smp::invoke_on_all([&] { - return db::initialize_virtual_tables(db, ss, gossiper, raft_gr, sys_ks, tablet_allocator, messaging, *cfg); - }).get(); + db::initialize_virtual_tables(db, ss, gossiper, raft_gr, sys_ks, tablet_allocator, messaging, *cfg).get(); // #293 - do not stop anything // engine().at_exit([&qp] { return qp.stop(); }); diff --git a/test/lib/cql_test_env.cc b/test/lib/cql_test_env.cc index c8f93be45f..5742e6c40e 100644 --- a/test/lib/cql_test_env.cc +++ b/test/lib/cql_test_env.cc @@ -1008,9 +1008,7 @@ private: _mnotifier.local().unregister_listener(&_ss.local()).get(); }); - smp::invoke_on_all([&] { - return db::initialize_virtual_tables(_db, _ss, _gossiper, _group0_registry, _sys_ks, _tablet_allocator, _ms, *cfg); - }).get(); + db::initialize_virtual_tables(_db, _ss, _gossiper, _group0_registry, _sys_ks, _tablet_allocator, _ms, *cfg).get(); _qp.invoke_on_all([this, &group0_client] (cql3::query_processor& qp) { qp.start_remote(_mm.local(), _mapreduce_service.local(), _ss.local(), group0_client,