]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-kvstore-tool: use unique_ptr<> manage the lifecycle of bluestore and db 18221/head
authorKefu Chai <kchai@redhat.com>
Tue, 10 Oct 2017 14:28:14 +0000 (22:28 +0800)
committerKefu Chai <kchai@redhat.com>
Tue, 10 Oct 2017 14:28:42 +0000 (22:28 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/tools/ceph_kvstore_tool.cc

index cb4a5e7afcca5b3311cb5f16466f96dc11b65e03..c3c9c52e4b6d02d0d437a2e62bd3d70b05d7e462 100644 (file)
@@ -36,51 +36,52 @@ using namespace std;
 
 class StoreTool
 {
-  boost::scoped_ptr<BlueStore> 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<KeyValueDB, Deleter> db;
+#else
+  std::unique_ptr<KeyValueDB> 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);
     }
   }