From ad14422b3d43e4c8645de751be56364a54dde853 Mon Sep 17 00:00:00 2001 From: Jianpeng Ma Date: Wed, 26 Apr 2017 04:25:47 +0800 Subject: [PATCH] os/bluestore: Remove ExtentFreeListManager. Signed-off-by: Jianpeng Ma --- src/common/config_opts.h | 1 - src/os/CMakeLists.txt | 1 - src/os/bluestore/BitmapFreelistManager.h | 4 - src/os/bluestore/BlueStore.cc | 9 +- src/os/bluestore/ExtentFreelistManager.cc | 284 ---------------------- src/os/bluestore/ExtentFreelistManager.h | 59 ----- src/os/bluestore/FreelistManager.cc | 3 - src/os/bluestore/FreelistManager.h | 4 - 8 files changed, 3 insertions(+), 362 deletions(-) delete mode 100644 src/os/bluestore/ExtentFreelistManager.cc delete mode 100644 src/os/bluestore/ExtentFreelistManager.h diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 0f88ad3339d..cb7ed27908d 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -1113,7 +1113,6 @@ OPTION(bluestore_cache_size, OPT_U64, 1024*1024*1024) OPTION(bluestore_cache_meta_ratio, OPT_DOUBLE, .9) OPTION(bluestore_kvbackend, OPT_STR, "rocksdb") OPTION(bluestore_allocator, OPT_STR, "bitmap") // stupid | bitmap -OPTION(bluestore_freelist_type, OPT_STR, "bitmap") // extent | bitmap OPTION(bluestore_freelist_blocks_per_key, OPT_INT, 128) OPTION(bluestore_bitmapallocator_blocks_per_zone, OPT_INT, 1024) // must be power of 2 aligned, e.g., 512, 1024, 2048... OPTION(bluestore_bitmapallocator_span_size, OPT_INT, 1024) // must be power of 2 aligned, e.g., 512, 1024, 2048... diff --git a/src/os/CMakeLists.txt b/src/os/CMakeLists.txt index 1194c3f57c8..0fe5a8048d2 100644 --- a/src/os/CMakeLists.txt +++ b/src/os/CMakeLists.txt @@ -36,7 +36,6 @@ if(HAVE_LIBAIO) bluestore/BlueRocksEnv.cc bluestore/BlueStore.cc bluestore/bluestore_types.cc - bluestore/ExtentFreelistManager.cc bluestore/FreelistManager.cc bluestore/KernelDevice.cc bluestore/StupidAllocator.cc diff --git a/src/os/bluestore/BitmapFreelistManager.h b/src/os/bluestore/BitmapFreelistManager.h index 5b5042be290..9ed39ff5653 100644 --- a/src/os/bluestore/BitmapFreelistManager.h +++ b/src/os/bluestore/BitmapFreelistManager.h @@ -67,10 +67,6 @@ public: void release( uint64_t offset, uint64_t length, KeyValueDB::Transaction txn) override; - - bool supports_parallel_transactions() override { - return true; - } }; #endif diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 6f35698d98a..c41037c20a7 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -4649,7 +4649,7 @@ int BlueStore::mkfs() } } - freelist_type = cct->_conf->bluestore_freelist_type; + freelist_type = "bitmap"; r = _open_path(); if (r < 0) @@ -7121,9 +7121,7 @@ int BlueStore::_open_super_meta() freelist_type = std::string(bl.c_str(), bl.length()); dout(10) << __func__ << " freelist_type " << freelist_type << dendl; } else { - freelist_type = "extent"; - dout(10) << __func__ << " freelist_type " << freelist_type - << " (legacy bluestore instance)" << dendl; + assert("Not Support extent freelist manager" == 0); } } @@ -7357,8 +7355,7 @@ void BlueStore::_txc_state_proc(TransContext *txc) } txc->log_state_latency(logger, l_bluestore_state_io_done_lat); txc->state = TransContext::STATE_KV_QUEUED; - if (cct->_conf->bluestore_sync_submit_transaction && - fm->supports_parallel_transactions()) { + if (cct->_conf->bluestore_sync_submit_transaction) { if (txc->last_nid >= nid_max || txc->last_blobid >= blobid_max) { dout(20) << __func__ diff --git a/src/os/bluestore/ExtentFreelistManager.cc b/src/os/bluestore/ExtentFreelistManager.cc deleted file mode 100644 index f211e5b8da4..00000000000 --- a/src/os/bluestore/ExtentFreelistManager.cc +++ /dev/null @@ -1,284 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#include "ExtentFreelistManager.h" -#include "kv/KeyValueDB.h" -#include "os/kv.h" - -#include "common/debug.h" - -#define dout_context cct -#define dout_subsys ceph_subsys_bluestore -#undef dout_prefix -#define dout_prefix *_dout << "freelist " - -int ExtentFreelistManager::create(uint64_t size, KeyValueDB::Transaction txn) -{ - release(0, size, txn); - return 0; -} - -int ExtentFreelistManager::init() -{ - dout(1) << __func__ << dendl; - - // load state from kvstore - KeyValueDB::Transaction txn = kvdb->get_transaction(); - int fixed = 0; - - KeyValueDB::Iterator it = kvdb->get_iterator(prefix); - it->lower_bound(string()); - uint64_t last_offset = 0; - uint64_t last_length = 0; - while (it->valid()) { - uint64_t offset, length; - string k = it->key(); - const char *p = _key_decode_u64(k.c_str(), &offset); - assert(p); - bufferlist bl = it->value(); - bufferlist::iterator bp = bl.begin(); - ::decode(length, bp); - - total_free += length; - - if (offset < last_offset + last_length) { - derr << __func__ << " detected overlapping extent on load, had " - << last_offset << "~" << last_length - << " and got " - << offset << "~" << length - << dendl; - return -EIO; - } - if (offset && offset == last_offset + last_length) { - derr << __func__ << " detected contiguous extent on load, merging " - << last_offset << "~" << last_length << " with " - << offset << "~" << length - << dendl; - kv_free.erase(last_offset); - string key; - _key_encode_u64(last_offset, &key); - txn->rmkey(prefix, key); - offset -= last_length; - length += last_length; - bufferlist value; - ::encode(length, value); - txn->set(prefix, key, value); - fixed++; - } - - kv_free[offset] = length; - dout(20) << __func__ << " " << offset << "~" << length << dendl; - - last_offset = offset; - last_length = length; - it->next(); - } - - if (fixed) { - kvdb->submit_transaction_sync(txn); - derr << " fixed " << fixed << " extents" << dendl; - } - - dout(10) << __func__ << " loaded " << kv_free.size() << " extents" << dendl; - return 0; -} - -void ExtentFreelistManager::shutdown() -{ - dout(1) << __func__ << dendl; -} - -void ExtentFreelistManager::dump() -{ - std::lock_guard l(lock); - _dump(); -} - -void ExtentFreelistManager::enumerate_reset() -{ - std::lock_guard l(lock); - enumerate_p = kv_free.begin(); -} - -bool ExtentFreelistManager::enumerate_next(uint64_t *offset, uint64_t *length) -{ - std::lock_guard l(lock); - if (enumerate_p == kv_free.end()) - return false; - *offset = enumerate_p->first; - *length = enumerate_p->second; - ++enumerate_p; - return true; -} - -void ExtentFreelistManager::_dump() -{ - dout(30) << __func__ << " " << total_free - << " in " << kv_free.size() << " extents" << dendl; - for (auto p = kv_free.begin(); - p != kv_free.end(); - ++p) { - dout(30) << __func__ << " " << p->first << "~" << p->second << dendl; - } -} - -void ExtentFreelistManager::_audit() -{ - 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"); - } -} - -void ExtentFreelistManager::allocate( - uint64_t offset, uint64_t length, - KeyValueDB::Transaction txn) -{ - std::lock_guard l(lock); - dout(10) << __func__ << " " << offset << "~" << length << dendl; - total_free -= length; - auto p = kv_free.lower_bound(offset); - if ((p == kv_free.end() || p->first > offset) && - p != kv_free.begin()) { - --p; - } - if (p == kv_free.end() || - p->first > offset || - p->first + p->second < offset + length) { - derr << " bad allocate " << offset << "~" << length << " - dne" << dendl; - if (p != kv_free.end()) { - derr << " existing extent " << p->first << "~" << p->second << dendl; - } - _dump(); - assert(0 == "bad allocate"); - } - - if (p->first == offset) { - string key; - _key_encode_u64(offset, &key); - txn->rmkey(prefix, key); - dout(20) << __func__ << " rm " << p->first << "~" << p->second << dendl; - if (p->second > length) { - uint64_t newoff = offset + length; - uint64_t newlen = p->second - length; - string newkey; - _key_encode_u64(newoff, &newkey); - bufferlist newvalue; - ::encode(newlen, newvalue); - txn->set(prefix, newkey, newvalue); - dout(20) << __func__ << " set " << newoff << "~" << newlen - << " (remaining tail)" << dendl; - kv_free.erase(p); - kv_free[newoff] = newlen; - } else { - kv_free.erase(p); - } - } else { - assert(p->first < offset); - // shorten - uint64_t newlen = offset - p->first; - string key; - _key_encode_u64(p->first, &key); - bufferlist newvalue; - ::encode(newlen, newvalue); - txn->set(prefix, key, newvalue); - dout(30) << __func__ << " set " << p->first << "~" << newlen - << " (remaining head from " << p->second << ")" << dendl; - if (p->first + p->second > offset + length) { - // new trailing piece, too - uint64_t tailoff = offset + length; - uint64_t taillen = p->first + p->second - (offset + length); - string tailkey; - _key_encode_u64(tailoff, &tailkey); - bufferlist tailvalue; - ::encode(taillen, tailvalue); - txn->set(prefix, tailkey, tailvalue); - dout(20) << __func__ << " set " << tailoff << "~" << taillen - << " (remaining tail from " << p->first << "~" << p->second << ")" - << dendl; - p->second = newlen; - kv_free[tailoff] = taillen; - } else { - p->second = newlen; - } - } - if (cct->_conf->bluestore_debug_freelist) - _audit(); -} - -void ExtentFreelistManager::release( - uint64_t offset, uint64_t length, - KeyValueDB::Transaction txn) -{ - std::lock_guard l(lock); - dout(10) << __func__ << " " << offset << "~" << length << dendl; - total_free += length; - auto p = kv_free.lower_bound(offset); - - // contiguous with previous extent? - if (p != kv_free.begin()) { - --p; - if (p->first + p->second == offset) { - string prevkey; - _key_encode_u64(p->first, &prevkey); - txn->rmkey(prefix, prevkey); - dout(20) << __func__ << " rm " << p->first << "~" << p->second - << " (merge with previous)" << dendl; - length += p->second; - offset = p->first; - if (map_t_has_stable_iterators) { - kv_free.erase(p++); - } else { - p = kv_free.erase(p); - } - } else if (p->first + p->second > offset) { - derr << __func__ << " bad release " << offset << "~" << length - << " overlaps with " << p->first << "~" << p->second << dendl; - _dump(); - assert(0 == "bad release overlap"); - } else { - dout(30) << __func__ << " previous extent " << p->first << "~" << p->second - << " is not contiguous" << dendl; - ++p; - } - } - - // contiguous with next extent? - if (p != kv_free.end()) { - if (p->first == offset + length) { - string tailkey; - _key_encode_u64(p->first, &tailkey); - txn->rmkey(prefix, tailkey); - dout(20) << __func__ << " rm " << p->first << "~" << p->second - << " (merge with next)" << dendl; - length += p->second; - kv_free.erase(p); - } else if (p->first < offset + length) { - derr << __func__ << " bad release " << offset << "~" << length - << " overlaps with " << p->first << "~" << p->second << dendl; - _dump(); - assert(0 == "bad release overlap"); - } else { - dout(30) << __func__ << " next extent " << p->first << "~" << p->second - << " is not contiguous" << dendl; - } - } - - string key; - _key_encode_u64(offset, &key); - bufferlist value; - ::encode(length, value); - txn->set(prefix, key, value); - dout(20) << __func__ << " set " << offset << "~" << length << dendl; - - kv_free[offset] = length; - - if (cct->_conf->bluestore_debug_freelist) - _audit(); -} diff --git a/src/os/bluestore/ExtentFreelistManager.h b/src/os/bluestore/ExtentFreelistManager.h deleted file mode 100644 index 3567a8edd8b..00000000000 --- a/src/os/bluestore/ExtentFreelistManager.h +++ /dev/null @@ -1,59 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#ifndef CEPH_OS_BLUESTORE_EXTENTFREELISTMANAGER_H -#define CEPH_OS_BLUESTORE_EXTENTFREELISTMANAGER_H - -#include -#include -#include -#include -#include "FreelistManager.h" - -#include "include/cpp-btree/btree_map.h" - -class ExtentFreelistManager : public FreelistManager { - KeyValueDB *kvdb; - std::string prefix; - std::mutex lock; - uint64_t total_free; - - typedef btree::btree_map map_t; - static const bool map_t_has_stable_iterators = false; - - map_t kv_free; ///< mirrors our kv values in the db - - map_t::const_iterator enumerate_p; - - void _audit(); - void _dump(); - -public: - ExtentFreelistManager(CephContext* cct, KeyValueDB *kvdb, - std::string prefix) : - FreelistManager(cct), - kvdb(kvdb), - prefix(prefix), - total_free(0) { - } - - int create(uint64_t size, KeyValueDB::Transaction txn) override; - - int init() override; - void shutdown() override; - - void dump() override; - - void enumerate_reset() override; - bool enumerate_next(uint64_t *offset, uint64_t *length) override; - - void allocate( - uint64_t offset, uint64_t length, - KeyValueDB::Transaction txn) override; - void release( - uint64_t offset, uint64_t length, - KeyValueDB::Transaction txn) override; -}; - - -#endif diff --git a/src/os/bluestore/FreelistManager.cc b/src/os/bluestore/FreelistManager.cc index ad803e85872..9b91cc09437 100644 --- a/src/os/bluestore/FreelistManager.cc +++ b/src/os/bluestore/FreelistManager.cc @@ -2,7 +2,6 @@ // vim: ts=8 sw=2 smarttab #include "FreelistManager.h" -#include "ExtentFreelistManager.h" #include "BitmapFreelistManager.h" FreelistManager *FreelistManager::create( @@ -16,8 +15,6 @@ FreelistManager *FreelistManager::create( // op is per prefix, has to done pre-db-open, and we don't know the // freelist type until after we open the db. assert(prefix == "B"); - if (type == "extent") - return new ExtentFreelistManager(cct, kvdb, "B"); if (type == "bitmap") return new BitmapFreelistManager(cct, kvdb, "B", "b"); return NULL; diff --git a/src/os/bluestore/FreelistManager.h b/src/os/bluestore/FreelistManager.h index 1d0bb5c2a5c..7f5ad4d79f9 100644 --- a/src/os/bluestore/FreelistManager.h +++ b/src/os/bluestore/FreelistManager.h @@ -40,10 +40,6 @@ public: virtual void release( uint64_t offset, uint64_t length, KeyValueDB::Transaction txn) = 0; - - virtual bool supports_parallel_transactions() { - return false; - } }; -- 2.39.5