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: v12.2.14~3^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b011958c9f6146587c45bb1c9476e8c3abf46bb2;p=ceph.git ceph-kvstore-tool: use unique_ptr<> manage the lifecycle of bluestore and db Signed-off-by: Kefu Chai (cherry picked from commit 8dc100d3f334cc90f6ef879a33eea34807c0184f) Conflicts: src/tools/ceph_kvstore_tool.cc --- diff --git a/src/tools/ceph_kvstore_tool.cc b/src/tools/ceph_kvstore_tool.cc index 140a5087ffb..ee7a3b7439b 100644 --- a/src/tools/ceph_kvstore_tool.cc +++ b/src/tools/ceph_kvstore_tool.cc @@ -36,53 +36,54 @@ 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, bool need_open_db=true) : 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, need_open_db); 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); - if (need_open_db) { - 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; + 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.reset(db_ptr); } }