database: create_keyspace_on_all_shards

Part of moving the responsibility for applying
and notifying keyspace schema changes from
schema_tables to the database so that the
database can control the order of applying the changes
across shards and when to notify its listeners.

Signed-off-by: Benny Halevy <bhalevy@scylladb.com>
This commit is contained in:
Benny Halevy
2023-06-07 12:31:26 +03:00
parent 53a6ea8616
commit 3520c786bd
5 changed files with 21 additions and 14 deletions

View File

@@ -259,6 +259,11 @@ keyspace_metadata::new_keyspace(std::string_view name,
return ::make_lw_shared<keyspace_metadata>(name, strategy_name, options, durables_writes, cf_defs, user_types_metadata{}, storage_opts);
}
lw_shared_ptr<keyspace_metadata>
keyspace_metadata::new_keyspace(const keyspace_metadata& ksm) {
return new_keyspace(ksm.name(), ksm.strategy_name(), ksm.strategy_options(), ksm.durable_writes(), std::vector<schema_ptr>{}, ksm.get_storage_options());
}
void keyspace_metadata::add_user_type(const user_type ut) {
_user_types.add_type(ut);
}

View File

@@ -56,6 +56,8 @@ public:
bool durables_writes,
std::vector<schema_ptr> cf_defs = std::vector<schema_ptr>{},
storage_options storage_opts = {});
static lw_shared_ptr<keyspace_metadata>
new_keyspace(const keyspace_metadata& ksm);
void validate(const gms::feature_service&, const locator::topology&) const;
const sstring& name() const {
return _name;

View File

@@ -1361,14 +1361,11 @@ future<std::set<sstring>> merge_keyspaces(distributed<service::storage_proxy>& p
altered.emplace_back(key);
}
auto& sharded_db = proxy.local().get_db();
co_await sharded_db.invoke_on_all([&] (replica::database& db) -> future<> {
for (auto&& val : created) {
auto scylla_specific_rs = co_await extract_scylla_specific_keyspace_info(proxy, val);
auto ksm = create_keyspace_from_schema_partition(val, std::move(scylla_specific_rs));
co_await db.create_keyspace(ksm, proxy.local().get_erm_factory());
co_await db.get_notifier().create_keyspace(ksm);
}
});
for (auto&& val : created) {
auto scylla_specific_rs = co_await extract_scylla_specific_keyspace_info(proxy, val);
auto ksm = create_keyspace_from_schema_partition(val, std::move(scylla_specific_rs));
co_await replica::database::create_keyspace_on_all_shards(sharded_db, proxy, *ksm);
}
for (auto& name : altered) {
co_await replica::database::update_keyspace_on_all_shards(sharded_db, proxy, name);
}

View File

@@ -1418,11 +1418,6 @@ future<> database::create_in_memory_keyspace(const lw_shared_ptr<keyspace_metada
_keyspaces.emplace(ksm->name(), std::move(ks));
}
future<>
database::create_keyspace(const lw_shared_ptr<keyspace_metadata>& ksm, locator::effective_replication_map_factory& erm_factory) {
return create_keyspace(ksm, erm_factory, system_keyspace::no);
}
future<>
database::create_keyspace(const lw_shared_ptr<keyspace_metadata>& ksm, locator::effective_replication_map_factory& erm_factory, system_keyspace system) {
if (_keyspaces.contains(ksm->name())) {
@@ -1434,6 +1429,14 @@ database::create_keyspace(const lw_shared_ptr<keyspace_metadata>& ksm, locator::
co_await ks.init_storage();
}
future<> database::create_keyspace_on_all_shards(sharded<database>& sharded_db, sharded<service::storage_proxy>& proxy, const keyspace_metadata& ks_metadata) {
co_await sharded_db.invoke_on_all([&] (replica::database& db) -> future<> {
auto ksm = keyspace_metadata::new_keyspace(ks_metadata);
co_await db.create_keyspace(ksm, proxy.local().get_erm_factory(), system_keyspace::no);
co_await db.get_notifier().create_keyspace(ksm);
});
}
future<>
database::drop_caches() const {
std::unordered_map<table_id, lw_shared_ptr<column_family>> tables = get_column_families();

View File

@@ -1530,7 +1530,7 @@ public:
*
* @return ready future when the operation is complete
*/
future<> create_keyspace(const lw_shared_ptr<keyspace_metadata>&, locator::effective_replication_map_factory& erm_factory);
static future<> create_keyspace_on_all_shards(sharded<database>& sharded_db, sharded<service::storage_proxy>& proxy, const keyspace_metadata& ksm);
/* below, find_keyspace throws no_such_<type> on fail */
keyspace& find_keyspace(std::string_view name);
const keyspace& find_keyspace(std::string_view name) const;