]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
tools/ceph-kvstore-tool: fix crash on db close. 67069/head
authorIgor Fedotov <igor.fedotov@croit.io>
Fri, 23 Jan 2026 19:15:30 +0000 (22:15 +0300)
committerIgor Fedotov <igor.fedotov@croit.io>
Fri, 23 Jan 2026 19:15:30 +0000 (22:15 +0300)
Fixes: https://tracker.ceph.com/issues/74332
Signed-off-by: Igor Fedotov <igor.fedotov@croit.io>
src/tools/kvstore_tool.cc
src/tools/kvstore_tool.h

index f9f684091f04993fa15bb9a282e032f697d7eccb..7d9a9fb3f8ece52ede36a4a920df5203a84c4a9c 100644 (file)
@@ -51,22 +51,34 @@ StoreTool::StoreTool(const string& type,
 }
 
 
+#ifdef WITH_BLUESTORE
+void close_delete_bluestore(ObjectStore* store)
+{
+  auto bluestore = dynamic_cast<BlueStore*>(store);
+  ceph_assert(bluestore);
+  bluestore->close_db_environment();
+  delete bluestore;
+}
+
 int StoreTool::load_bluestore(const string& path, bool read_only, bool to_repair)
 {
-#ifdef WITH_BLUESTORE
-    auto bluestore = new BlueStore(g_ceph_context, path);
-    KeyValueDB *db_ptr;
-    int r = bluestore->open_db_environment(&db_ptr, read_only, to_repair);
-    if (r < 0) {
+  auto bluestore = new BlueStore(g_ceph_context, path);
+  KeyValueDB *db_ptr;
+  int r = bluestore->open_db_environment(&db_ptr, read_only, to_repair);
+  if (r < 0) {
      return -EINVAL;
-    }
-    db = decltype(db){db_ptr, Deleter((ObjectStore*)bluestore)};
-    return 0;
+  }
+  db = decltype(db){db_ptr, Deleter(bluestore, close_delete_bluestore)};
+  return 0;
+}
 #else
+
+int StoreTool::load_bluestore(const string& path, bool read_only, bool to_repair)
+{
     cerr << "bluestore not compiled in" << std::endl;
     return -1;
-#endif // WITH_BLUESTORE
 }
+#endif // WITH_BLUESTORE
 
 
 uint32_t StoreTool::traverse(const string& prefix,
index 0cc6a7efbc3be8da329d2733271b766d0a90a239..11ad30b5f1fda98a028f416d29b94781d690a746 100644 (file)
@@ -17,14 +17,14 @@ class KeyValueDB;
 class StoreTool
 {
   struct Deleter {
-    ObjectStore *store = nullptr;
+    ObjectStore* store = nullptr;
+    std::function<void(ObjectStore*)> cb;
     Deleter() {}
-    Deleter(ObjectStore *_store)
-      : store(_store) {}
+    Deleter(ObjectStore* _store, std::function<void(ObjectStore*)> _cb)
+      : store(_store), cb(_cb) {}
     void operator()(KeyValueDB *db) {
-      if (store) {
-       store->umount();
-       delete store;
+      if (cb) {
+        cb(store);
       } else {
        delete db;
       }