From: Kefu Chai Date: Tue, 10 Oct 2017 14:28:14 +0000 (+0800) Subject: ceph-kvstore-tool: use unique_ptr<> manage the lifecycle of bluestore and db X-Git-Tag: v13.0.1~580^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F18221%2Fhead;p=ceph.git ceph-kvstore-tool: use unique_ptr<> manage the lifecycle of bluestore and db Signed-off-by: Kefu Chai --- diff --git a/src/tools/ceph_kvstore_tool.cc b/src/tools/ceph_kvstore_tool.cc index cb4a5e7afcca..c3c9c52e4b6d 100644 --- a/src/tools/ceph_kvstore_tool.cc +++ b/src/tools/ceph_kvstore_tool.cc @@ -36,51 +36,52 @@ using namespace std; class StoreTool { - boost::scoped_ptr bluestore; - - // TODO: make KeyValueDB enable_shared_from_this - // bluestore will hold *db* also, use unique_ptr/shared_ptr will - // double free. - KeyValueDB* db; +#ifdef HAVE_LIBAIO + struct Deleter { + BlueStore *bluestore; + Deleter(BlueStore *store = nullptr) + : bluestore(store) + {} + void operator()(KeyValueDB *db) { + if (bluestore) { + bluestore->umount(); + delete bluestore; + } else { + delete db; + } + } + }; + std::unique_ptr db; +#else + std::unique_ptr db; +#endif string store_path; public: StoreTool(string type, const string &path) : store_path(path) { - KeyValueDB *db_ptr; if (type == "bluestore-kv") { #ifdef HAVE_LIBAIO - // note: we'll leak this! the only user is ceph-kvstore-tool and - // we don't care. - bluestore.reset(new BlueStore(g_ceph_context, path)); + auto bluestore = new BlueStore(g_ceph_context, path); + KeyValueDB *db_ptr; int r = bluestore->start_kv_only(&db_ptr); if (r < 0) { exit(1); } + db = decltype(db){db_ptr, Deleter(bluestore)}; #else cerr << "bluestore not compiled in" << std::endl; exit(1); #endif } else { - db_ptr = KeyValueDB::create(g_ceph_context, type, path); + auto db_ptr = KeyValueDB::create(g_ceph_context, type, path); int r = db_ptr->open(std::cerr); if (r < 0) { cerr << "failed to open type " << type << " path " << path << ": " << cpp_strerror(r) << std::endl; exit(1); } - } - db = db_ptr; - } - - ~StoreTool() { - if (bluestore) { - bluestore->umount(); - } - else { - if (db) { - delete db; - } + db.reset(db_ptr); } }