From 64d0cf58eac1bc34fddb5ae5c565ef08e476a5a5 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Tue, 26 Jul 2016 23:04:48 +0300 Subject: [PATCH] size_estimates_recorder: unwrap ranges before searching for sstables column_family::select_sstables() requires unwrapped ranges, so unwrap them. Fixes crash with Leveled Compaction Strategy. Fixes #1507. Reviewed-by: Duarte Nunes Message-Id: <1469563488-14869-1-git-send-email-avi@scylladb.com> --- db/size_estimates_recorder.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/db/size_estimates_recorder.cc b/db/size_estimates_recorder.cc index 795cf49365..d271cb112c 100644 --- a/db/size_estimates_recorder.cc +++ b/db/size_estimates_recorder.cc @@ -71,13 +71,24 @@ static std::vector estimates_for(const col std::vector estimates; estimates.reserve(local_ranges.size()); + std::vector unwrapped; // Each range defines both bounds. for (auto& range : local_ranges) { int64_t count{0}; sstables::estimated_histogram hist{0}; - for (auto&& sstable : cf.select_sstables(range)) { + unwrapped.clear(); + if (range.is_wrap_around(dht::ring_position_comparator(*cf.schema()))) { + auto uw = range.unwrap(); + unwrapped.push_back(std::move(uw.first)); + unwrapped.push_back(std::move(uw.second)); + } else { + unwrapped.push_back(range); + } + for (auto&& uwr : unwrapped) { + for (auto&& sstable : cf.select_sstables(uwr)) { count += sstable->get_estimated_key_count(); hist.merge(sstable->get_stats_metadata().estimated_row_size); + } } estimates.emplace_back(db::system_keyspace::range_estimates{ range.start()->value().token(),