diff --git a/replica/database.cc b/replica/database.cc index b22a8e8d26..2c01a8e69c 100644 --- a/replica/database.cc +++ b/replica/database.cc @@ -636,6 +636,7 @@ void database::set_format(sstables::sstable_version_types format) noexcept { database::~database() { _user_types->deactivate(); + local_schema_registry().clear(); } void database::update_version(const table_schema_version& version) { diff --git a/schema/schema_registry.cc b/schema/schema_registry.cc index 2fe0b1cf02..c2d462649f 100644 --- a/schema/schema_registry.cc +++ b/schema/schema_registry.cc @@ -164,6 +164,10 @@ schema_ptr schema_registry::get_or_load(table_schema_version v, const schema_loa return e.get_schema(); } +void schema_registry::clear() { + _entries.clear(); +} + schema_ptr schema_registry_entry::load(frozen_schema fs) { _frozen_schema = std::move(fs); auto s = get_schema(); diff --git a/schema/schema_registry.hh b/schema/schema_registry.hh index 8f1b95e04d..9490439021 100644 --- a/schema/schema_registry.hh +++ b/schema/schema_registry.hh @@ -150,6 +150,12 @@ public: // The schema instance pointed to by the argument will be attached to the registry // entry and will keep it alive. schema_ptr learn(const schema_ptr&); + + // Removes all entries from the registry. This in turn removes all dependencies + // on the Seastar reactor. + // + // Prerequisite: all futures from get_or_load() are resolved. + void clear(); }; schema_registry& local_schema_registry();