]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
tools/cephfs: always execute scan_{extents,inodes,frags} and cleanup 67709/head
authorVenky Shankar <vshankar@redhat.com>
Thu, 26 Feb 2026 14:43:19 +0000 (20:13 +0530)
committerVenky Shankar <vshankar@redhat.com>
Thu, 14 May 2026 09:28:55 +0000 (14:58 +0530)
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 <vshankar@redhat.com>
src/tools/cephfs/DataScan.cc
src/tools/cephfs/ProgressTracker.cc

index a847f172a8ba0cd32682939eddb0129abda8e0d9..52965596479164e116b6ed67e26782bc64e5f524 100644 (file)
@@ -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<ProgressTracker>(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;
index 52ed354a2afca24e4d2608fc0ea6e45d7eb13b60..1ff691b0cffea6c6d53733047268b0d1fa9eb862 100644 (file)
@@ -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<std::mutex> lock(display_mutex);
   std::string completed_status = get_completed_status();
   write_console_line(fmt::format("Completed {}! Processed {}", operation_name, completed_status), false);