From: Sage Weil Date: Tue, 22 Dec 2015 21:36:42 +0000 (-0500) Subject: os/bluestore/FreelistManager: audit X-Git-Tag: v10.0.3~154^2~60 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d48a2ba9f72016b33d816e784e0cc22d39bf3447;p=ceph.git os/bluestore/FreelistManager: audit Signed-off-by: Sage Weil --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index e4721d2c21b6..26fae376a5c0 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -890,6 +890,7 @@ OPTION(bluestore_clone_cow, OPT_BOOL, true) // do copy-on-write for clones OPTION(bluestore_debug_misc, OPT_BOOL, false) OPTION(bluestore_debug_no_reuse_blocks, OPT_BOOL, false) OPTION(bluestore_debug_small_allocations, OPT_INT, 0) +OPTION(bluestore_debug_freelist, OPT_BOOL, false) OPTION(kstore_max_ops, OPT_U64, 512) OPTION(kstore_max_bytes, OPT_U64, 64*1024*1024) diff --git a/src/os/bluestore/FreelistManager.cc b/src/os/bluestore/FreelistManager.cc index fc38188546e6..b3694fb7bbed 100644 --- a/src/os/bluestore/FreelistManager.cc +++ b/src/os/bluestore/FreelistManager.cc @@ -87,6 +87,21 @@ void FreelistManager::dump() } } +void FreelistManager::_audit() +{ + assert(lock.is_locked()); + uint64_t sum = 0; + for (auto& p : kv_free) { + sum += p.second; + } + if (total_free != sum) { + derr << __func__ << " sum " << sum << " != total_free " << total_free + << dendl; + derr << kv_free << dendl; + assert(0 == "freelistmanager bug"); + } +} + int FreelistManager::allocate( uint64_t offset, uint64_t length, KeyValueDB::Transaction txn) @@ -155,7 +170,8 @@ int FreelistManager::allocate( } p->second = newlen; } - + if (g_conf->bluestore_debug_freelist) + _audit(); return 0; } @@ -221,5 +237,8 @@ int FreelistManager::release( dout(20) << __func__ << " set " << offset << "~" << length << dendl; kv_free[offset] = length; + + if (g_conf->bluestore_debug_freelist) + _audit(); return 0; } diff --git a/src/os/bluestore/FreelistManager.h b/src/os/bluestore/FreelistManager.h index de75d2b5009c..7993a510e760 100644 --- a/src/os/bluestore/FreelistManager.h +++ b/src/os/bluestore/FreelistManager.h @@ -17,6 +17,8 @@ class FreelistManager { std::map kv_free; ///< mirrors our kv values in the db + void _audit(); + public: FreelistManager() : lock("FreelistManager::lock"), diff --git a/src/test/objectstore/store_test.cc b/src/test/objectstore/store_test.cc index cd1a2157fafb..b67000e4f550 100644 --- a/src/test/objectstore/store_test.cc +++ b/src/test/objectstore/store_test.cc @@ -3194,6 +3194,7 @@ int main(int argc, char **argv) { g_ceph_context->_conf->set_val("bluestore_fsck_on_umount", "true"); g_ceph_context->_conf->set_val("bluestore_debug_misc", "true"); g_ceph_context->_conf->set_val("bluestore_debug_small_allocations", "4"); + g_ceph_context->_conf->set_val("bluestore_debug_freelist", "true"); g_ceph_context->_conf->set_val( "enable_experimental_unrecoverable_data_corrupting_features", "*"); g_ceph_context->_conf->apply_changes(NULL);