]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/BitmapFreelistManager: keep meta and bitmap prefixes distinct
authorSage Weil <sage@redhat.com>
Fri, 29 Apr 2016 13:31:38 +0000 (09:31 -0400)
committerSage Weil <sage@redhat.com>
Sat, 30 Apr 2016 02:17:20 +0000 (22:17 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BitmapFreelistManager.cc
src/os/bluestore/BitmapFreelistManager.h
src/os/bluestore/FreelistManager.cc

index 1c9e510d276c371c9aad5cfcffa351d4bbb46baf..e510357f3879d46902f894c52d667701eefb2075 100644 (file)
@@ -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);
     }
   }
 }
index ff7d4859090160f6266f61cf68cabdf132859ef2..95e79bbbabf05aaef3efdeb15395b6cfa67ee44c 100644 (file)
@@ -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<KeyValueDB::MergeOperator> 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);
 
index 644c78fcb48b3f74e10b8a85a24f7e574d8999ab..bf46f66c337abfbecb595cae99720815b3107808 100644 (file)
@@ -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;
 }