From a670aa5a711dd3fcbe4ef7ebc7e74426e178a6d9 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Thu, 13 Feb 2025 23:41:31 -0500 Subject: [PATCH] extent scan: don't divide by zero if there were no loops Commit 183b6a5361e040d7cc70c3b3391f43e0d126bc33 ("extent scan: refactor BeesCrawl, BeesScanMode*") moved some statistics calculations out of the loop in `find_next_extent`, but did not ensure that the statistics would not be calculated if the loop had not executed any iterations. In rare instances, the function returns without entering the loop at all, which results in divide by zero. Add a check just before doing that. Signed-off-by: Zygo Blaxell --- src/bees-roots.cc | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/bees-roots.cc b/src/bees-roots.cc index d72531e..c4b2381 100644 --- a/src/bees-roots.cc +++ b/src/bees-roots.cc @@ -948,22 +948,24 @@ BeesScanModeExtent::SizeTier::find_next_extent() const auto search_calls = BtrfsIoctlSearchKey::s_calls - init_s_calls; const auto search_loops = BtrfsIoctlSearchKey::s_loops - init_s_loops; if (crawl_time.age() > 1) { - BEESLOGDEBUG( - "loop_count " << loop_count - << " size_low_count " << size_low_count - << " size_high_count " << size_high_count - << " gen_low_count " << gen_low_count - << " gen_high_count " << gen_high_count - << " search_calls " << search_calls - << " search_loops " << search_loops - << " skips " << skip_count - << " flops " << flop_count - << " time " << crawl_time - << " subvol " << m_subvol - << " search/loop " << pretty(search_calls / loop_count) - << " skip/loop " << (100 * skip_count / loop_count) << "%" - << " flop/loop " << (100 * flop_count / loop_count) << "%" - ); + if (loop_count) { + BEESLOGDEBUG( + "loop_count " << loop_count + << " size_low_count " << size_low_count + << " size_high_count " << size_high_count + << " gen_low_count " << gen_low_count + << " gen_high_count " << gen_high_count + << " search_calls " << search_calls + << " search_loops " << search_loops + << " skips " << skip_count + << " flops " << flop_count + << " time " << crawl_time + << " subvol " << m_subvol + << " search/loop " << pretty(search_calls / loop_count) + << " skip/loop " << (100 * skip_count / loop_count) << "%" + << " flop/loop " << (100 * flop_count / loop_count) << "%" + ); + } if (debug_oss) { BEESLOGDEBUG("debug oss trace:\n" << debug_oss->str()); }