From b00a475fb9b1a3b911f362e428af5c63c25ef5af Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Wed, 15 Dec 2021 11:04:13 +0000 Subject: [PATCH] os/bluestore/ceph-bluestore-tool: Fix bluefs-import command Modify bluefs-import command so it can properly initialize allocators. Without allocators initialized, importing file to bluefs did overwrite some random data, including first block on device. Signed-off-by: Adam Kupczyk --- src/os/bluestore/BlueStore.cc | 5 +++++ src/os/bluestore/BlueStore.h | 1 + src/os/bluestore/bluestore_tool.cc | 12 +++++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index fae749da817..2b77891b646 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -6370,6 +6370,11 @@ int BlueStore::close_db_environment() return 0; } +/* gets access to bluefs supporting RocksDB */ +BlueFS* BlueStore::get_bluefs() { + return bluefs; +} + int BlueStore::_prepare_db_environment(bool create, bool read_only, std::string* _fn, std::string* _kv_backend) { diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 5416244e413..2d15d3e2fa6 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -2681,6 +2681,7 @@ public: int open_db_environment(KeyValueDB **pdb, bool to_repair); int close_db_environment(); + BlueFS* get_bluefs(); int write_meta(const std::string& key, const std::string& value) override; int read_meta(const std::string& key, std::string *value) override; diff --git a/src/os/bluestore/bluestore_tool.cc b/src/os/bluestore/bluestore_tool.cc index b215d3e9ed1..6cf5d3dd1a4 100644 --- a/src/os/bluestore/bluestore_tool.cc +++ b/src/os/bluestore/bluestore_tool.cc @@ -240,8 +240,14 @@ static void bluefs_import( cerr << "open " << input_file.c_str() << " failed: " << cpp_strerror(r) << std::endl; exit(EXIT_FAILURE); } - - std::unique_ptr bs{open_bluefs_readonly(cct, path, devs)}; + BlueStore bluestore(cct, path); + KeyValueDB *db_ptr; + r = bluestore.open_db_environment(&db_ptr, false); + if (r < 0) { + cerr << "error preparing db environment: " << cpp_strerror(r) << std::endl; + exit(EXIT_FAILURE); + } + BlueFS* bs = bluestore.get_bluefs(); BlueFS::FileWriter *h; fs::path file_path(dest_file); @@ -261,7 +267,7 @@ static void bluefs_import( f.close(); bs->fsync(h); bs->close_writer(h); - bs->umount(); + bluestore.close_db_environment(); return; } -- 2.39.5