mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-21 17:10:35 +00:00
We currently try to detect a replaced node so to insert it to endpoints_to_remove when it has no owned tokens left. However, for each token we first generate a multimap using get_endpoint_to_token_map_for_reading(). There are 2 problems with that: 1. unless the replaced node owns a single token, this map will not be empty after erasing one token out of it, since the token metadata has not changed yet (this is done later with update_normal_tokens(owned_tokens, endpoint)). 2. generating this map for each token is inefficient, turning this algorithm complexity to quadratic in the number of tokens... This change copies the current token_to_endpoint map to temporary map and erases replaced tokens from it, while maintaining a set of candidates_for_removal. After traversing all replaced tokens, we check again the `token_to_endpoint_map` erasing from `candidates_for_removal` any endpoint that still owns tokens. The leftover candidates are endpoints the own no tokens and so they are added to `hosts_to_remove`. Fixes #12082 Signed-off-by: Benny Halevy <bhalevy@scylladb.com> Closes #12141