]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: Add printing of broken shared blobs
authorAdam Kupczyk <akupczyk@redhat.com>
Tue, 10 Jan 2023 17:40:57 +0000 (17:40 +0000)
committerAdam Kupczyk <akupczyk@ibm.com>
Wed, 10 May 2023 11:47:46 +0000 (11:47 +0000)
When we do fsck with non-repair mode, we do not get any info about shared blobs
that actually were corrupted. Now we print them.

Signed-off-by: Adam Kupczyk <akupczyk@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index 1b29ff031a86ee36c7037857115ea9ffb6413e1f..6eb2f7c504764cc61f0dc25b4f435ee23c20e55c 100644 (file)
@@ -8033,7 +8033,7 @@ void BlueStore::_fsck_check_statfs(
 }
 
 void BlueStore::_fsck_foreach_shared_blob(
-  std::function< void (coll_t, ghobject_t, uint64_t, const bluestore_blob_t&)> cb) {
+  std::function< bool (coll_t, ghobject_t, uint64_t, const bluestore_blob_t&)> cb) {
   auto it = db->get_iterator(PREFIX_OBJ, KeyValueDB::ITERATOR_NOCACHE);
   if (it) {
     CollectionRef c;
@@ -8083,12 +8083,15 @@ void BlueStore::_fsck_foreach_shared_blob(
        auto& b = e.blob->get_blob();
        if (b.is_shared() && passed_sbs.count(e.blob) == 0) {
          auto sbid = e.blob->shared_blob->get_sbid();
-         cb(c->cid, oid, sbid, b);
+         if (cb(c->cid, oid, sbid, b) == false) {
+           goto stop_iterating;
+         }
          passed_sbs.emplace(e.blob);
        }
       } // for ... extent_map
     } // for ... it->valid
   } //if (it(PREFIX_OBJ))
+ stop_iterating:;
 }
 
 void BlueStore::_fsck_repair_shared_blobs(
@@ -8111,7 +8114,7 @@ void BlueStore::_fsck_repair_shared_blobs(
                            const bluestore_blob_t& b) {
     auto it = refs_map.lower_bound(sbid);
     if(it != refs_map.end() && it->first == sbid) {
-      return;
+      return true;
     }
     for (auto& p : b.get_extents()) {
       if (p.is_valid() &&
@@ -8122,11 +8125,12 @@ void BlueStore::_fsck_repair_shared_blobs(
         dout(20) << __func__
                  << " broken shared blob found for col:" << cid
                 << " obj:" << oid
-                << " sbid 0x " << std::hex << sbid << std::dec
+                << " sbid 0x" << std::hex << sbid << std::dec
                 << dendl;
        break;
       }
     }
+    return true;
   });
 
   // second iteration over objects to build new ref map for the broken sbids
@@ -8136,7 +8140,7 @@ void BlueStore::_fsck_repair_shared_blobs(
                            const bluestore_blob_t& b) {
     auto it = refs_map.find(sbid);
     if(it == refs_map.end()) {
-      return;
+      return true;
     }
     for (auto& p : b.get_extents()) {
       if (p.is_valid()) {
@@ -8144,6 +8148,7 @@ void BlueStore::_fsck_repair_shared_blobs(
        break;
       }
     }
+    return true;
   });
 
   // update shared blob records
@@ -9478,6 +9483,29 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
          << " shared blob references aren't matching, at least "
          << sb_ref_mismatches << " found" << dendl;
     errors += sb_ref_mismatches;
+    if (!repair) {
+      uint32_t cnts = 0;
+      _fsck_foreach_shared_blob( [&](coll_t cid,
+                                    ghobject_t oid,
+                                    uint64_t sbid,
+                                    const bluestore_blob_t& b) {
+       for (auto& p : b.get_extents()) {
+         if (p.is_valid() &&
+             !sb_ref_counts.test_all_zero_range(sbid,
+                                                p.offset,
+                                                p.length)) {
+           derr << "fsck possibly broken shared blob found for col:" << cid
+                << " obj:" << oid
+                << " sbid 0x" << std::hex << sbid << std::dec
+                << " " << p
+                << dendl;
+           ++cnts;
+           break;
+         }
+       }
+       return cnts <= MAX_FSCK_ERROR_LINES;
+      });
+    }
   }
 
   if (depth != FSCK_SHALLOW && repair) {
index a453b92e422ee5d968e2f3264857d8ad23669dd3..4ee5f174e972b6126d48467554cde7fae420b148 100644 (file)
@@ -2797,8 +2797,9 @@ private:
     int64_t& errors,
     int64_t &warnings,
     BlueStoreRepairer* repairer);
+  // When cb returns false stops iterating.
   void _fsck_foreach_shared_blob(
-    std::function< void (coll_t, ghobject_t, uint64_t, const bluestore_blob_t&)> cb);
+    std::function< bool (coll_t, ghobject_t, uint64_t, const bluestore_blob_t&)> cb);
   void _fsck_repair_shared_blobs(
     BlueStoreRepairer& repairer,
     shared_blob_2hash_tracker_t& sb_ref_counts,