]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: fsck: use common helper to verify blobs and refs
authorSage Weil <sage@redhat.com>
Tue, 31 May 2016 19:17:51 +0000 (15:17 -0400)
committerSage Weil <sage@redhat.com>
Wed, 1 Jun 2016 15:40:50 +0000 (11:40 -0400)
The checks are the same (or should be--we had missed a few).

Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index 7e9ef9a3dc1ff63f64c8cce48616d1aa15b8e399..ee7d208b4dc7c2be6bf777f9b1d6fe5540fff09c 100644 (file)
@@ -2320,22 +2320,23 @@ int BlueStore::umount()
   return 0;
 }
 
-int BlueStore::_verify_bnode_shared(
-  BnodeRef bnode,
+int BlueStore::_fsck_verify_blob_map(
+  string what,
+  const bluestore_blob_map_t& blob_map,
   map<int64_t,bluestore_extent_ref_map_t>& v,
   interval_set<uint64_t> &used_blocks)
 {
   int errors = 0;
-  dout(10) << __func__ << " hash " << bnode->hash << " " << v << dendl;
-  for (auto& b : bnode->blob_map) {
+  dout(20) << __func__ << " " << what << " " << v << dendl;
+  for (auto& b : blob_map) {
     auto pv = v.find(b.first);
     if (pv == v.end()) {
-      derr << " hash " << bnode->hash << " blob " << b.first
-          << " exists in bnode but has no refs" << dendl;
+      derr << " " << what << " blob " << b.first
+          << " has no lextent refs" << dendl;
       ++errors;
     }
     if (pv->second != b.second.ref_map) {
-      derr << " hash " << bnode->hash << " blob " << b.first
+      derr << " " << what << " blob " << b.first
           << " ref_map " << b.second.ref_map
           << " != expected " << pv->second << dendl;
       ++errors;
@@ -2347,16 +2348,21 @@ int BlueStore::_verify_bnode_shared(
       e.insert(p.offset, p.length);
       i.intersection_of(e, used_blocks);
       if (!i.empty()) {
-       derr << " hash " << bnode->hash << " extent(s) " << i
+       derr << " " << what << " extent(s) " << i
             << " already allocated" << dendl;
        ++errors;
       } else {
        used_blocks.insert(p.offset, p.length);
+       if (p.end() > bdev->get_size()) {
+         derr << " " << what << " blob " << b.first << " extent " << e
+              << " past end of block device" << dendl;
+         ++errors;
+       }
       }
     }
   }
   for (auto& p : v) {
-    derr << " hash " << bnode->hash << " blob " << p.first
+    derr << " " << what << " blob " << p.first
         << " dne, has extent refs " << p.second << dendl;
     ++errors;
   }
@@ -2453,7 +2459,11 @@ int BlueStore::fsck()
        }
        if (!bnode || bnode->hash != o->oid.hobj.get_hash()) {
          if (bnode)
-           errors += _verify_bnode_shared(bnode, hash_shared, used_blocks);
+           errors += _fsck_verify_blob_map(
+             "hash " + stringify(bnode->hash),
+             bnode->blob_map,
+             hash_shared,
+             used_blocks);
          bnode = c->get_bnode(o->oid.hobj.get_hash());
          hash_shared.clear();
        }
@@ -2469,7 +2479,7 @@ int BlueStore::fsck()
          used_nids.insert(o->onode.nid);
        }
        // lextents
-       map<uint64_t,bluestore_extent_ref_map_t> local_blobs;
+       map<int64_t,bluestore_extent_ref_map_t> local_blobs;
        for (auto& l : o->onode.extent_map) {
          if (l.second.blob >= 0) {
            local_blobs[l.second.blob].get(l.second.offset, l.second.length);
@@ -2478,36 +2488,11 @@ int BlueStore::fsck()
          }
        }
        // blobs
-       for (auto& b : o->onode.blob_map) {
-         for (auto& e : b.second.extents) {
-           if (used_blocks.intersects(e.offset, e.length)) {
-             derr << " " << oid << " blob " << b.first << " extent " << e
-                  << " already allocated" << dendl;
-             ++errors;
-             continue;
-           }
-           used_blocks.insert(e.offset, e.length);
-           if (e.end() > bdev->get_size()) {
-             derr << " " << oid << " blob " << b.first << " extent " << e
-                  << " past end of block device" << dendl;
-             ++errors;
-           }
-         }
-         auto bp = local_blobs.find(b.first);
-         if (bp != local_blobs.end()) {
-           if (bp->second != b.second.ref_map) {
-             derr << " " << oid << " blob " << b.first << " ref_map should be "
-                  << bp->second << " but is " << b.second.ref_map
-                  << dendl;
-             ++errors;
-           }
-           local_blobs.erase(b.first);
-         } else {
-           derr << " " << oid << " blob " << b.first << " has no lextent refs"
-                << dendl;
-           ++errors;
-         }
-       }
+       errors += _fsck_verify_blob_map(
+         "object " + stringify(oid),
+         o->onode.blob_map,
+         local_blobs,
+         used_blocks);
        // overlays
        set<string> overlay_keys;
        map<uint64_t,int> refs;
@@ -2619,7 +2604,11 @@ int BlueStore::fsck()
     }
   }
   if (bnode) {
-    errors += _verify_bnode_shared(bnode, hash_shared, used_blocks);
+    errors += _fsck_verify_blob_map(
+      "hash " + stringify(bnode->hash),
+      bnode->blob_map,
+      hash_shared,
+      used_blocks);
     hash_shared.clear();
     bnode.reset();
   }
index ec9597947487fecb7c3f9faf9eeb87fe123c2a82..6026d9d66eac20a60cdcae165658187e0ebd1b5b 100644 (file)
@@ -927,9 +927,11 @@ private:
   int _wal_replay();
 
   // for fsck
-  int _verify_bnode_shared(BnodeRef bnode,
-                          map<int64_t,bluestore_extent_ref_map_t>& v,
-                          interval_set<uint64_t> &used_blocks);
+  int _fsck_verify_blob_map(
+    string what,
+    const bluestore_blob_map_t& blob_map,
+    map<int64_t,bluestore_extent_ref_map_t>& v,
+    interval_set<uint64_t> &used_blocks);
 
 public:
   BlueStore(CephContext *cct, const string& path);