/* * Copyright (C) 2020-present ScyllaDB * */ /* * SPDX-License-Identifier: AGPL-3.0-or-later */ #pragma once #include #include #include #include #include "sstables/version.hh" #include "gms/feature.hh" using namespace seastar; namespace replica { class database; } namespace gms { class gossiper; class feature_service; } namespace db { class sstables_format_selector; class feature_enabled_listener : public gms::feature::listener { sstables_format_selector& _selector; sstables::sstable_version_types _format; public: feature_enabled_listener(sstables_format_selector& s, sstables::sstable_version_types format) : _selector(s) , _format(format) { } void on_enabled() override; }; class sstables_format_selector { gms::gossiper& _gossiper; sharded& _features; sharded& _db; seastar::named_semaphore _sem = {1, named_semaphore_exception_factory{"feature listeners"}}; seastar::gate _sel; feature_enabled_listener _md_feature_listener; feature_enabled_listener _me_feature_listener; sstables::sstable_version_types _selected_format = sstables::sstable_version_types::mc; future<> select_format(sstables::sstable_version_types new_format); future<> read_sstables_format(); future<> do_maybe_select_format(sstables::sstable_version_types new_format); public: sstables_format_selector(gms::gossiper& g, sharded& f, sharded& db); future<> start(); future<> stop(); future<> maybe_select_format(sstables::sstable_version_types new_format); void sync() { get_units(_sem, 1).get0(); } }; } // namespace sstables