From 554972ded24281a2fa30178c234359c75465691e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 30 Mar 2017 14:01:42 -0400 Subject: [PATCH] os/bluestore: put fsck structures in mempools This lets us track them individually in debug mode. Signed-off-by: Sage Weil --- src/include/mempool.h | 1 + src/os/bluestore/BlueStore.cc | 34 ++++++++++++++++++---------------- src/os/bluestore/BlueStore.h | 8 +++++++- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/include/mempool.h b/src/include/mempool.h index ab5086b5de0f..b9a3d047bf2b 100644 --- a/src/include/mempool.h +++ b/src/include/mempool.h @@ -144,6 +144,7 @@ namespace mempool { f(bluestore_meta_onode) \ f(bluestore_meta_other) \ f(bluestore_alloc) \ + f(bluestore_fsck) \ f(bluefs) \ f(buffer_meta) \ f(buffer_data) \ diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index ca3a42805533..23713a6169b9 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -4895,9 +4895,10 @@ int BlueStore::umount() static void apply(uint64_t off, uint64_t len, uint64_t granularity, - boost::dynamic_bitset<> &bitset, + BlueStore::mempool_dynamic_bitset &bitset, const char *what, - std::function &)> f) { + std::function f) { auto end = ROUND_UP_TO(off + len, granularity); while (off < end) { uint64_t pos = off / granularity; @@ -4910,7 +4911,7 @@ int BlueStore::_fsck_check_extents( const ghobject_t& oid, const PExtentVector& extents, bool compressed, - boost::dynamic_bitset<> &used_blocks, + mempool_dynamic_bitset &used_blocks, store_statfs_t& expected_statfs) { dout(30) << __func__ << " oid " << oid << " extents " << extents << dendl; @@ -4925,7 +4926,7 @@ int BlueStore::_fsck_check_extents( bool already = false; apply( e.offset, e.length, block_size, used_blocks, __func__, - [&](uint64_t pos, boost::dynamic_bitset<> &bs) { + [&](uint64_t pos, mempool_dynamic_bitset &bs) { if (bs.test(pos)) already = true; else @@ -4949,10 +4950,10 @@ int BlueStore::fsck(bool deep) { dout(1) << __func__ << (deep ? " (deep)" : " (shallow)") << " start" << dendl; int errors = 0; - set used_nids; - set used_omap_head; - boost::dynamic_bitset<> used_blocks; - set used_sbids; + mempool::bluestore_fsck::set used_nids; + mempool::bluestore_fsck::set used_omap_head; + mempool_dynamic_bitset used_blocks; + mempool::bluestore_fsck::set used_sbids; KeyValueDB::Iterator it; store_statfs_t expected_statfs, actual_statfs; struct sb_info_t { @@ -4961,7 +4962,7 @@ int BlueStore::fsck(bool deep) bluestore_extent_ref_map_t ref_map; bool compressed; }; - map sb_info; + mempool::bluestore_fsck::map sb_info; uint64_t num_objects = 0; uint64_t num_extents = 0; @@ -5021,7 +5022,7 @@ int BlueStore::fsck(bool deep) used_blocks.resize(bdev->get_size() / block_size); apply( 0, BLUEFS_START, block_size, used_blocks, "0~BLUEFS_START", - [&](uint64_t pos, boost::dynamic_bitset<> &bs) { + [&](uint64_t pos, mempool_dynamic_bitset &bs) { bs.set(pos); } ); @@ -5030,7 +5031,7 @@ int BlueStore::fsck(bool deep) for (auto e = bluefs_extents.begin(); e != bluefs_extents.end(); ++e) { apply( e.get_start(), e.get_len(), block_size, used_blocks, "bluefs", - [&](uint64_t pos, boost::dynamic_bitset<> &bs) { + [&](uint64_t pos, mempool_dynamic_bitset &bs) { bs.set(pos); } ); @@ -5055,7 +5056,7 @@ int BlueStore::fsck(bool deep) if (it) { CollectionRef c; spg_t pgid; - list expecting_shards; + mempool::bluestore_fsck::list expecting_shards; for (it->lower_bound(string()); it->valid(); it->next()) { dout(30) << " key " << pretty_binary_string(it->key()) << dendl; if (is_extent_shard_key(it->key())) { @@ -5181,7 +5182,8 @@ int BlueStore::fsck(bool deep) // lextents map referenced; uint64_t pos = 0; - map ref_map; + mempool::bluestore_fsck::map ref_map; for (auto& l : o->extent_map.extent_map) { dout(20) << __func__ << " " << l << dendl; if (l.logical_offset < pos) { @@ -5426,7 +5428,7 @@ int BlueStore::fsck(bool deep) for (auto e = wt.released.begin(); e != wt.released.end(); ++e) { apply( e.get_start(), e.get_len(), block_size, used_blocks, "deferred", - [&](uint64_t pos, boost::dynamic_bitset<> &bs) { + [&](uint64_t pos, mempool_dynamic_bitset &bs) { bs.set(pos); } ); @@ -5441,7 +5443,7 @@ int BlueStore::fsck(bool deep) for (auto e = bluefs_extents.begin(); e != bluefs_extents.end(); ++e) { apply( e.get_start(), e.get_len(), block_size, used_blocks, "bluefs_extents", - [&](uint64_t pos, boost::dynamic_bitset<> &bs) { + [&](uint64_t pos, mempool_dynamic_bitset &bs) { bs.reset(pos); } ); @@ -5452,7 +5454,7 @@ int BlueStore::fsck(bool deep) bool intersects = false; apply( offset, length, block_size, used_blocks, "free", - [&](uint64_t pos, boost::dynamic_bitset<> &bs) { + [&](uint64_t pos, mempool_dynamic_bitset &bs) { if (bs.test(pos)) { intersects = true; } else { diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 8543b8ed1313..555cbdc44205 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1937,11 +1937,17 @@ private: int _deferred_finish(TransContext *txc); int _deferred_replay(); +public: + using mempool_dynamic_bitset = + boost::dynamic_bitset>; + +private: int _fsck_check_extents( const ghobject_t& oid, const PExtentVector& extents, bool compressed, - boost::dynamic_bitset<> &used_blocks, + mempool_dynamic_bitset &used_blocks, store_statfs_t& expected_statfs); void _buffer_cache_write( -- 2.47.3