From bb0ea0b1c0c8cf5eb7e838ad4d1bcc146bf29ec7 Mon Sep 17 00:00:00 2001 From: Benny Halevy Date: Thu, 30 Sep 2021 20:11:57 +0300 Subject: [PATCH] shared_token_metadata: set: check version monotonicity Setting the ring version backwards means it got out of sync. Possibly concurrent updates weren't serialized properly using token_metadata_lock / mutate_token_metadata. Signed-off-by: Benny Halevy --- locator/token_metadata.cc | 7 +++++++ locator/token_metadata.hh | 4 +--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/locator/token_metadata.cc b/locator/token_metadata.cc index 3b0bae3426..35ed1f3399 100644 --- a/locator/token_metadata.cc +++ b/locator/token_metadata.cc @@ -1424,6 +1424,13 @@ const endpoint_dc_rack& topology::get_location(const inet_address& ep) const { /////////////////// class topology end ///////////////////////////////////////// +void shared_token_metadata::set(mutable_token_metadata_ptr tmptr) noexcept { + if (_shared->get_ring_version() >= tmptr->get_ring_version()) { + on_internal_error(tlogger, format("shared_token_metadata: must not set non-increasing version: {} -> {}", _shared->get_ring_version(), tmptr->get_ring_version())); + } + _shared = std::move(tmptr); +} + future<> shared_token_metadata::mutate_token_metadata(seastar::noncopyable_function (token_metadata&)> func) { auto lk = co_await get_lock(); auto tm = co_await _shared->clone_async(); diff --git a/locator/token_metadata.hh b/locator/token_metadata.hh index 483c4355ce..0b68b34898 100644 --- a/locator/token_metadata.hh +++ b/locator/token_metadata.hh @@ -379,9 +379,7 @@ public: return _shared; } - void set(mutable_token_metadata_ptr tmptr) noexcept { - _shared = std::move(tmptr); - } + void set(mutable_token_metadata_ptr tmptr) noexcept; // Token metadata changes are serialized // using the schema_tables merge_lock.