From: Venky Shankar Date: Thu, 26 Feb 2026 14:43:19 +0000 (+0530) Subject: tools/cephfs: always execute scan_{extents,inodes,frags} and cleanup X-Git-Tag: v21.0.1~86^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=014a446227e75ec74d01a77d96c3204bf6dd956f;p=ceph.git tools/cephfs: always execute scan_{extents,inodes,frags} and cleanup Even when the number of objects reported from pool stats is zero. Pool stats metrics are delayed and cannot be fully relied on for accuracy. Trusting the number of objects (esp. when reported as zero) could result in missed steps during data-scan execution. So, we try to do two things now: 1. ProgressTracker::display_progress() will display progress only when the total items exceeds to the number of progress items. 2. Refresh total object count during each iteration of processing objects. This might be a bit too much, so we probably need to do this periodically rather than on each iteration. Fixes: http://tracker.ceph.com/issues/75083 Signed-off-by: Venky Shankar --- diff --git a/src/tools/cephfs/DataScan.cc b/src/tools/cephfs/DataScan.cc index a847f172a8b..52965596479 100644 --- a/src/tools/cephfs/DataScan.cc +++ b/src/tools/cephfs/DataScan.cc @@ -600,13 +600,8 @@ int DataScan::scan_extents() progress_tracker->set_enable_progress_update(true); progress_tracker->start(total_objects); - if (total_objects == 0) { - dout(4) << "No objects found in data pools" << dendl; - return 0; - } - for (auto ioctx : data_ios) { - int r = forall_objects(*ioctx, false, [this, ioctx, &progress_tracker]( + int r = forall_objects(*ioctx, false, [this, ioctx, &progress_tracker, &total_objects]( std::string const &oid, uint64_t obj_name_ino, uint64_t obj_name_offset) -> int @@ -650,6 +645,11 @@ int DataScan::scan_extents() } progress_tracker->increment(); + uint64_t _total_objects = get_pool_objects({&data_io}); + if (_total_objects > total_objects) { + progress_tracker->set_total(_total_objects); + total_objects = _total_objects; + } progress_tracker->display_progress(); return r; @@ -864,14 +864,9 @@ int DataScan::scan_inodes() progress_tracker->set_enable_progress_update(true); progress_tracker->start(total_objects); - if (total_objects == 0) { - dout(4) << "No objects found in data pool" << dendl; - return 0; - } - r = forall_objects( data_io, true, - [this, &progress_tracker]( + [this, &progress_tracker, &total_objects]( std::string const& oid, uint64_t obj_name_ino, uint64_t obj_name_offset) -> int { int r = 0; @@ -1146,6 +1141,11 @@ int DataScan::scan_inodes() } progress_tracker->increment(); + uint64_t _total_objects = get_pool_objects({&data_io}); + if (_total_objects > total_objects) { + progress_tracker->set_total(_total_objects); + total_objects = _total_objects; + } progress_tracker->display_progress(); return r; @@ -1160,15 +1160,10 @@ int DataScan::cleanup() progress_tracker->set_enable_progress_update(true); progress_tracker->start(total_objects); - if (total_objects == 0) { - dout(4) << "No objects found in data pool" << dendl; - return 0; - } - // We are looking for only zeroth object return forall_objects( data_io, true, - [this, &progress_tracker]( + [this, &progress_tracker, &total_objects]( std::string const& oid, uint64_t obj_name_ino, uint64_t obj_name_offset) -> int { int r = ClsCephFSClient::delete_inode_accumulate_result(data_io, oid); @@ -1178,6 +1173,11 @@ int DataScan::cleanup() } progress_tracker->increment(); + uint64_t _total_objects = get_pool_objects({&data_io}); + if (_total_objects > total_objects) { + progress_tracker->set_total(_total_objects); + total_objects = _total_objects; + } progress_tracker->display_progress(); return r; @@ -1721,10 +1721,6 @@ int DataScan::scan_frags() auto progress_tracker = std::make_unique(get_progress_operation_name("scan_frags")); progress_tracker->set_enable_progress_update(true); progress_tracker->start(total_objects); - if (total_objects == 0) { - dout(4) << "No objects found in metadata pool" << dendl; - return 0; - } bool roots_present; int r = driver->check_roots(&roots_present); @@ -1740,7 +1736,7 @@ int DataScan::scan_frags() return -EIO; } - return forall_objects(metadata_io, true, [this, &progress_tracker]( + return forall_objects(metadata_io, true, [this, &progress_tracker, &total_objects]( std::string const &oid, uint64_t obj_name_ino, uint64_t obj_name_offset) -> int @@ -1880,7 +1876,11 @@ int DataScan::scan_frags() } } - progress_tracker->increment(); + uint64_t _total_objects = get_pool_objects({&metadata_io}); + if (_total_objects > total_objects) { + progress_tracker->set_total(_total_objects); + total_objects = _total_objects; + } progress_tracker->display_progress(); return r; diff --git a/src/tools/cephfs/ProgressTracker.cc b/src/tools/cephfs/ProgressTracker.cc index 52ed354a2af..1ff691b0cff 100644 --- a/src/tools/cephfs/ProgressTracker.cc +++ b/src/tools/cephfs/ProgressTracker.cc @@ -113,7 +113,9 @@ ProgressTracker::set_total(uint64_t total) void ProgressTracker::display_progress() const { - if (!started) { + auto processed = processed_items.load(); + auto total = total_items.load(); + if (!started || !total || (processed > total)) { return; } const time_point now = clock::now(); @@ -298,6 +300,7 @@ ProgressTracker::display_final_summary() const if (!started) { return; } + std::lock_guard lock(display_mutex); std::string completed_status = get_completed_status(); write_console_line(fmt::format("Completed {}! Processed {}", operation_name, completed_status), false);