]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: set up merge operators for freelist
authorSage Weil <sage@redhat.com>
Fri, 29 Apr 2016 13:59:47 +0000 (09:59 -0400)
committerSage Weil <sage@redhat.com>
Sat, 30 Apr 2016 02:17:20 +0000 (22:17 -0400)
This is a bit kludgey, unfortunately, because we have to set up merge
operators before we open the db.. and we don't know which freelist mgmt
to use until we read the super metadata.  So, hard-code different
prefixes for different freelist schemes.

Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BitmapFreelistManager.cc
src/os/bluestore/BlueStore.cc
src/os/bluestore/FreelistManager.cc
src/os/bluestore/FreelistManager.h

index e510357f3879d46902f894c52d667701eefb2075..0baea71928c8d18e22061af7502e26f9d38a12ee 100644 (file)
@@ -218,7 +218,7 @@ bool BitmapFreelistManager::enumerate_next(uint64_t *offset, uint64_t *length)
     // and it simplifies our lives a bit.
     assert(enumerate_p->valid());
     string k = enumerate_p->key();
-    const char *p = k.c_str() + 1;
+    const char *p = k.c_str();
     _key_decode_u64(p, &enumerate_offset);
     enumerate_bl = enumerate_p->value();
     enumerate_bl_pos = 0;
@@ -252,7 +252,7 @@ bool BitmapFreelistManager::enumerate_next(uint64_t *offset, uint64_t *length)
       break;
     }
     string k = enumerate_p->key();
-    const char *p = k.c_str() + 1;
+    const char *p = k.c_str();
     uint64_t next = enumerate_offset + bytes_per_block * blocks_per_key;
     _key_decode_u64(p, &enumerate_offset);
     enumerate_bl = enumerate_p->value();
@@ -287,7 +287,7 @@ bool BitmapFreelistManager::enumerate_next(uint64_t *offset, uint64_t *length)
        break;
       }
       string k = enumerate_p->key();
-      const char *p = k.c_str() + 1;
+      const char *p = k.c_str();
       _key_decode_u64(p, &enumerate_offset);
       enumerate_bl = enumerate_p->value();
     }
index 094a4dd3a8a9d1b7e492d6abf548e3bb5ef6c8c8..196fb0cb5a5b827f42b93467f27907f74b935ad7 100644 (file)
@@ -1400,6 +1400,8 @@ int BlueStore::_open_db(bool create)
     return -EIO;
   }
   
+  FreelistManager::setup_merge_operators(db);
+
   if (kv_backend == "rocksdb")
     options = g_conf->bluestore_rocksdb_options;
   db->init(options);
index bf46f66c337abfbecb595cae99720815b3107808..e51be106978a8d36f2f7bd1365850ca4eb4a1b94 100644 (file)
@@ -21,3 +21,8 @@ FreelistManager *FreelistManager::create(
     return new BitmapFreelistManager(kvdb, "B", "b");
   return NULL;
 }
+
+void FreelistManager::setup_merge_operators(KeyValueDB *db)
+{
+  BitmapFreelistManager::setup_merge_operator(db, "b");
+}
index aa58cc40731fb913316492f65500bf43e8b3adeb..e037c0901cfc6f75b70b65aa1d206e3f4f517b69 100644 (file)
@@ -20,6 +20,8 @@ public:
     KeyValueDB *db,
     string prefix);
 
+  static void setup_merge_operators(KeyValueDB *db);
+
   virtual int create(uint64_t size, KeyValueDB::Transaction txn) {
     release(0, size, txn);
     return 0;