From: Sage Weil Date: Fri, 21 Apr 2017 15:47:21 +0000 (-0400) Subject: ceph-kvstore-tool: 'bluestore-kv' to open bluestore's embedded kv X-Git-Tag: v12.0.3~259^2~5 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4ed5ab97b2b3dd83bbd3aef3351f2084c8c72558;p=ceph-ci.git ceph-kvstore-tool: 'bluestore-kv' to open bluestore's embedded kv This is usually rocksdb on bluefs, but it should work with whatever kv backend bluestore is configured to use. Signed-off-by: Sage Weil --- diff --git a/src/kv/KeyValueDB.cc b/src/kv/KeyValueDB.cc index 7a917b7a183..42036e3c593 100644 --- a/src/kv/KeyValueDB.cc +++ b/src/kv/KeyValueDB.cc @@ -12,6 +12,9 @@ #ifdef HAVE_KINETIC #include "KineticStore.h" #endif +#ifdef HAVE_LIBAIO +#include "os/bluestore/BlueStore.h" +#endif KeyValueDB *KeyValueDB::create(CephContext *cct, const string& type, const string& dir, @@ -34,6 +37,18 @@ KeyValueDB *KeyValueDB::create(CephContext *cct, const string& type, } #endif +#ifdef HAVE_LIBAIO + if (type == "bluestore-kv") { + // note: we'll leak this! the only user is ceph-kvstore-tool and + // we don't care. + BlueStore *bluestore = new BlueStore(cct, dir); + KeyValueDB *db = nullptr; + int r = bluestore->start_kv_only(&db); + if (r < 0) + return nullptr; // yes, we leak. + return db; + } +#endif if ((type == "memdb") && cct->check_experimental_feature_enabled("memdb")) { return new MemDB(cct, dir, p); diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 2c4121f2f1b..9eeb86dc7c5 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -4023,7 +4023,7 @@ bool BlueStore::test_mount_in_use() return ret; } -int BlueStore::_open_db(bool create) +int BlueStore::_open_db(bool create, bool kv_no_open) { int r; assert(!db); @@ -4262,6 +4262,9 @@ int BlueStore::_open_db(bool create) if (kv_backend == "rocksdb") options = cct->_conf->bluestore_rocksdb_options; db->init(options); + if (kv_no_open) { + return 0; + } if (create) r = db->create_and_open(err); else @@ -4810,7 +4813,7 @@ void BlueStore::set_cache_shards(unsigned num) } } -int BlueStore::mount() +int BlueStore::_mount(bool kv_only) { dout(1) << __func__ << " path " << path << dendl; @@ -4858,10 +4861,13 @@ int BlueStore::mount() if (r < 0) goto out_fsid; - r = _open_db(false); + r = _open_db(false, kv_only); if (r < 0) goto out_bdev; + if (kv_only) + return 0; + r = _open_super_meta(); if (r < 0) goto out_db; diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 6a55512f160..f2a32b8b2df 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1870,7 +1870,7 @@ private: int _open_bdev(bool create); void _close_bdev(); - int _open_db(bool create); + int _open_db(bool create, bool kv_no_open=false); void _close_db(); int _open_fm(bool create); void _close_fm(); @@ -2031,9 +2031,22 @@ public: bool test_mount_in_use() override; - int mount() override; +private: + int _mount(bool kv_only); +public: + int mount() override { + return _mount(false); + } int umount() override; + int start_kv_only(KeyValueDB **pdb) { + int r = _mount(true); + if (r < 0) + return r; + *pdb = db; + return 0; + } + int fsck(bool deep) override; void set_cache_shards(unsigned num) override;