From: Adam Kupczyk Date: Tue, 10 Jan 2023 17:40:57 +0000 (+0000) Subject: os/bluestore: Add printing of broken shared blobs X-Git-Tag: v19.0.0~486^2~37 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e5979217b1717c6d339a634831ee9b8f649d40cf;p=ceph.git os/bluestore: Add printing of broken shared blobs 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 --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 1b29ff031a86..6eb2f7c50476 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -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) { diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index a453b92e422e..4ee5f174e972 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -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,