raft topology: add fence_version

It's stored outside of topology table,
since it's updated not through RAFT, but
with a new 'fence' raft command.
The current value is cached in shared_token_metadata.
An initial fence version is loaded in main
during storage_service initialisation.
This commit is contained in:
Petr Gusev
2023-05-18 18:57:11 +04:00
parent 4f99302c2b
commit f6b019c229
10 changed files with 71 additions and 3 deletions

View File

@@ -1190,6 +1190,19 @@ void shared_token_metadata::set(mutable_token_metadata_ptr tmptr) noexcept {
_shared->set_version_tracker(_versions_barrier.start());
}
void shared_token_metadata::update_fence_version(token_metadata::version_t version) {
if (const auto current_version = _shared->get_version(); version > current_version) {
on_internal_error(tlogger,
format("shared_token_metadata: invalid new fence version, can't be greater than the current version, "
"current version {}, new fence version {}", current_version, version));
}
if (version < _fence_version) {
on_internal_error(tlogger,
format("shared_token_metadata: must not set decreasing fence version: {} -> {}", _fence_version, version));
}
_fence_version = version;
}
future<> shared_token_metadata::mutate_token_metadata(seastar::noncopyable_function<future<> (token_metadata&)> func) {
auto lk = co_await get_lock();
auto tm = co_await _shared->clone_async();

View File

@@ -332,6 +332,7 @@ class shared_token_metadata {
// includes its own invocation as an operation in the new phase.
utils::phased_barrier _versions_barrier;
shared_future<> _stale_versions_in_use{make_ready_future<>()};
token_metadata::version_t _fence_version = 0;
public:
// used to construct the shared object as a sharded<> instance
@@ -356,6 +357,11 @@ public:
return _stale_versions_in_use.get_future();
}
void update_fence_version(token_metadata::version_t version);
token_metadata::version_t get_fence_version() const noexcept {
return _fence_version;
}
// Token metadata changes are serialized
// using the schema_tables merge_lock.
//