From: Sage Weil Date: Fri, 29 Apr 2016 13:59:47 +0000 (-0400) Subject: os/bluestore: set up merge operators for freelist X-Git-Tag: v11.0.0~643^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=59eef695b13077ba2091d340cb7879d80d0f2e88;p=ceph.git os/bluestore: set up merge operators for freelist 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 --- diff --git a/src/os/bluestore/BitmapFreelistManager.cc b/src/os/bluestore/BitmapFreelistManager.cc index e510357f387..0baea71928c 100644 --- a/src/os/bluestore/BitmapFreelistManager.cc +++ b/src/os/bluestore/BitmapFreelistManager.cc @@ -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(); } diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 094a4dd3a8a..196fb0cb5a5 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -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); diff --git a/src/os/bluestore/FreelistManager.cc b/src/os/bluestore/FreelistManager.cc index bf46f66c337..e51be106978 100644 --- a/src/os/bluestore/FreelistManager.cc +++ b/src/os/bluestore/FreelistManager.cc @@ -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"); +} diff --git a/src/os/bluestore/FreelistManager.h b/src/os/bluestore/FreelistManager.h index aa58cc40731..e037c0901cf 100644 --- a/src/os/bluestore/FreelistManager.h +++ b/src/os/bluestore/FreelistManager.h @@ -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;