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:
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user