From bdecf4318a724b236d60f9aeea1c1e644f7fdddc Mon Sep 17 00:00:00 2001 From: Asias He Date: Mon, 31 Oct 2022 08:41:47 +0800 Subject: [PATCH] gossip: Improve get_live_token_owners and get_unreachable_token_owners The get_live_token_owners returns the nodes that are part of the ring and live. The get_unreachable_token_owners returns the nodes that are part of the ring and is not alive. The token_metadata::get_all_endpoints returns nodes that are part of the ring. The patch changes both functions to use the more authoritative source to get the nodes that are part of the ring and call is_alive to check if the node is up or down. So that the correctness does not depend on any derived information. This patch fixes a truncate issue in storage_proxy::truncate_blocking where it calls get_live_token_owners and get_unreachable_token_owners to decide the nodes to talk with for truncate operation. The truncate failed because incorrect nodes were returned. Fixes #10296 Fixes #11928 Closes #11952 (cherry picked from commit 16bd9ec8b1b890fd03618c80e3528028db96fc7a) --- gms/gossiper.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/gms/gossiper.cc b/gms/gossiper.cc index 1535b44cec..22a90fa145 100644 --- a/gms/gossiper.cc +++ b/gms/gossiper.cc @@ -1037,10 +1037,10 @@ std::set gossiper::get_live_members() { std::set gossiper::get_live_token_owners() { std::set token_owners; - for (auto& member : get_live_members()) { - auto es = get_endpoint_state_for_endpoint_ptr(member); - if (es && !is_dead_state(*es) && get_token_metadata_ptr()->is_member(member)) { - token_owners.insert(member); + auto normal_token_owners = get_token_metadata_ptr()->get_all_endpoints(); + for (auto& node: normal_token_owners) { + if (is_alive(node)) { + token_owners.insert(node); } } return token_owners; @@ -1048,10 +1048,10 @@ std::set gossiper::get_live_token_owners() { std::set gossiper::get_unreachable_token_owners() { std::set token_owners; - for (auto&& x : _unreachable_endpoints) { - auto& endpoint = x.first; - if (get_token_metadata_ptr()->is_member(endpoint)) { - token_owners.insert(endpoint); + auto normal_token_owners = get_token_metadata_ptr()->get_all_endpoints(); + for (auto& node: normal_token_owners) { + if (!is_alive(node)) { + token_owners.insert(node); } } return token_owners;