From 6d510bcd1c412f4ad2a70508e5c5036307b7efcc Mon Sep 17 00:00:00 2001 From: Tomasz Grabiec Date: Tue, 3 Feb 2026 00:06:57 +0100 Subject: [PATCH] tablets: Make stats update post-merge work with arbitrary merge boundaries We only assume that new tablets share boundaries with some old tablets. In preparation for supporting arbitrary merge plan, where any replica can be isolated (not merged with siblings) by the merge plan. --- locator/tablets.cc | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/locator/tablets.cc b/locator/tablets.cc index 4e982c26b0..5ffe3dff66 100644 --- a/locator/tablets.cc +++ b/locator/tablets.cc @@ -1091,30 +1091,25 @@ lw_shared_ptr load_stats::reconcile_tablets_resize(const std::unorde const auto& new_tmap = new_tm.tablets().get_tablet_map(table); size_t old_tablet_count = old_tmap.tablet_count(); size_t new_tablet_count = new_tmap.tablet_count(); - if (old_tablet_count == new_tablet_count * 2) { + if (old_tablet_count > new_tablet_count) { // Reconcile for merge - for (size_t i = 0; i < old_tablet_count; i += 2) { - range_based_tablet_id rb_tid1 { table, old_tmap.get_token_range(tablet_id(i)) }; - range_based_tablet_id rb_tid2 { table, old_tmap.get_token_range(tablet_id(i + 1)) }; - auto& tinfo = old_tmap.get_tablet_info(tablet_id(i)); + for (size_t i = 0; i < old_tablet_count; i++) { + auto old_tablet_id = tablet_id(i); + auto new_tablet_id = new_tmap.get_tablet_id(old_tmap.get_last_token(old_tablet_id)); + auto new_range = new_tmap.get_token_range(new_tablet_id); + auto rb_tid = range_based_tablet_id{table, old_tmap.get_token_range(old_tablet_id)}; + auto& tinfo = old_tmap.get_tablet_info(old_tablet_id); for (auto& replica : tinfo.replicas) { - auto tablet_size_opt1 = new_stats.get_tablet_size(replica.host, rb_tid1); - auto tablet_size_opt2 = new_stats.get_tablet_size(replica.host, rb_tid2); - if (!tablet_size_opt1 || !tablet_size_opt2) { - if (!tablet_size_opt1) { - tablet_logger.debug("Unable to find tablet size in stats for table resize reconcile for tablet {} on host {}", rb_tid1, replica.host); - } - if (!tablet_size_opt2) { - tablet_logger.debug("Unable to find tablet size in stats for table resize reconcile for tablet {} on host {}", rb_tid2, replica.host); - } + auto tablet_size_opt = new_stats.get_tablet_size(replica.host, rb_tid); + if (!tablet_size_opt) { + tablet_logger.debug("Unable to find tablet size in stats for table resize reconcile for tablet {} on host {}", rb_tid, replica.host); return nullptr; } - dht::token_range new_range { new_tmap.get_token_range(tablet_id(i / 2)) }; auto& sizes_for_table = new_stats.tablet_stats.at(replica.host).tablet_sizes.at(table); - uint64_t merged_tablet_size = *tablet_size_opt1 + *tablet_size_opt2; - sizes_for_table[new_range] = merged_tablet_size; - sizes_for_table.erase(rb_tid1.range); - sizes_for_table.erase(rb_tid2.range); + sizes_for_table.erase(rb_tid.range); // rb_tid.range may be equal to new_range, so do it first + sizes_for_table[new_range] += *tablet_size_opt; + tablet_logger.debug("reconcile merge: host {}, old tablet {}, old range {}, new tablet {}, new range {}, size {}", + replica.host, old_tablet_id, rb_tid.range, new_tablet_id, new_range, *tablet_size_opt); } } } else if (old_tablet_count == new_tablet_count / 2) {