From: Sage Weil Date: Fri, 29 Apr 2016 13:31:38 +0000 (-0400) Subject: os/bluestore/BitmapFreelistManager: keep meta and bitmap prefixes distinct X-Git-Tag: v11.0.0~643^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6304ec4f437ff3933c0edc284f72ba3c33676c2b;p=ceph.git os/bluestore/BitmapFreelistManager: keep meta and bitmap prefixes distinct Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/BitmapFreelistManager.cc b/src/os/bluestore/BitmapFreelistManager.cc index 1c9e510d276..e510357f387 100644 --- a/src/os/bluestore/BitmapFreelistManager.cc +++ b/src/os/bluestore/BitmapFreelistManager.cc @@ -45,8 +45,12 @@ void BitmapFreelistManager::setup_merge_operator(KeyValueDB *db, string prefix) db->set_merge_operator(prefix, merge_op); } -BitmapFreelistManager::BitmapFreelistManager(KeyValueDB *db, string prefix) - : prefix(prefix), kvdb(db) +BitmapFreelistManager::BitmapFreelistManager(KeyValueDB *db, + string meta_prefix, + string bitmap_prefix) + : meta_prefix(meta_prefix), + bitmap_prefix(bitmap_prefix), + kvdb(db) { } @@ -76,22 +80,22 @@ int BitmapFreelistManager::create(uint64_t new_size, KeyValueDB::Transaction txn { bufferlist bl; ::encode(bytes_per_block, bl); - txn->set(prefix, "bytes_per_block", bl); + txn->set(meta_prefix, "bytes_per_block", bl); } { bufferlist bl; ::encode(blocks_per_key, bl); - txn->set(prefix, "blocks_per_key", bl); + txn->set(meta_prefix, "blocks_per_key", bl); } { bufferlist bl; ::encode(blocks, bl); - txn->set(prefix, "blocks", bl); + txn->set(meta_prefix, "blocks", bl); } { bufferlist bl; ::encode(size, bl); - txn->set(prefix, "size", bl); + txn->set(meta_prefix, "size", bl); } return 0; } @@ -100,7 +104,7 @@ int BitmapFreelistManager::init() { dout(1) << __func__ << dendl; - KeyValueDB::Iterator it = kvdb->get_iterator(prefix); + KeyValueDB::Iterator it = kvdb->get_iterator(meta_prefix); it->lower_bound(string()); // load meta @@ -208,7 +212,7 @@ bool BitmapFreelistManager::enumerate_next(uint64_t *offset, uint64_t *length) // initial base case is a bit awkward if (enumerate_offset == 0) { dout(10) << __func__ << " start" << dendl; - enumerate_p = kvdb->get_iterator(prefix); + enumerate_p = kvdb->get_iterator(bitmap_prefix); enumerate_p->lower_bound(string()); // we assert that the first block is always allocated; it's true, // and it simplifies our lives a bit. @@ -354,7 +358,7 @@ void BitmapFreelistManager::_xor( dout(30) << __func__ << " " << first_key << ": "; bl.hexdump(*_dout); *_dout << dendl; - txn->merge(prefix, k, bl); + txn->merge(bitmap_prefix, k, bl); } else { // first key { @@ -372,7 +376,7 @@ void BitmapFreelistManager::_xor( dout(30) << __func__ << " " << first_key << ": "; bl.hexdump(*_dout); *_dout << dendl; - txn->merge(prefix, k, bl); + txn->merge(bitmap_prefix, k, bl); first_key += bytes_per_block * blocks_per_key; } // middle keys @@ -383,7 +387,7 @@ void BitmapFreelistManager::_xor( dout(30) << __func__ << " " << first_key << ": "; all_set_bl.hexdump(*_dout); *_dout << dendl; - txn->merge(prefix, k, all_set_bl); + txn->merge(bitmap_prefix, k, all_set_bl); first_key += bytes_per_block * blocks_per_key; } } @@ -402,7 +406,7 @@ void BitmapFreelistManager::_xor( dout(30) << __func__ << " " << first_key << ": "; bl.hexdump(*_dout); *_dout << dendl; - txn->merge(prefix, k, bl); + txn->merge(bitmap_prefix, k, bl); } } } diff --git a/src/os/bluestore/BitmapFreelistManager.h b/src/os/bluestore/BitmapFreelistManager.h index ff7d4859090..95e79bbbabf 100644 --- a/src/os/bluestore/BitmapFreelistManager.h +++ b/src/os/bluestore/BitmapFreelistManager.h @@ -13,7 +13,7 @@ #include "kv/KeyValueDB.h" class BitmapFreelistManager : public FreelistManager { - std::string prefix; + std::string meta_prefix, bitmap_prefix; KeyValueDB *kvdb; ceph::shared_ptr merge_op; std::mutex lock; @@ -44,7 +44,8 @@ class BitmapFreelistManager : public FreelistManager { KeyValueDB::Transaction txn); public: - BitmapFreelistManager(KeyValueDB *db, string prefix); + BitmapFreelistManager(KeyValueDB *db, string meta_prefix, + string bitmap_prefix); static void setup_merge_operator(KeyValueDB *db, string prefix); diff --git a/src/os/bluestore/FreelistManager.cc b/src/os/bluestore/FreelistManager.cc index 644c78fcb48..bf46f66c337 100644 --- a/src/os/bluestore/FreelistManager.cc +++ b/src/os/bluestore/FreelistManager.cc @@ -10,9 +10,14 @@ FreelistManager *FreelistManager::create( KeyValueDB *kvdb, string prefix) { + // a bit of a hack... we hard-code the prefixes here. we need to + // put the freelistmanagers in different prefixes because the merge + // 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(kvdb, prefix); + return new ExtentFreelistManager(kvdb, "B"); if (type == "bitmap") - return new BitmapFreelistManager(kvdb, prefix); + return new BitmapFreelistManager(kvdb, "B", "b"); return NULL; }