From bb142b2182419301b7ac79ade81ecb0ab86a8157 Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Fri, 5 Apr 2019 19:09:19 +0300 Subject: [PATCH] tools/ceph-objectstore-tool: add --no-superblock option. This allows to use the tool to inspect 'incomplete' object stores. E.g. ones created by ceph_test_objectstore. Signed-off-by: Igor Fedotov --- src/tools/ceph_objectstore_tool.cc | 84 ++++++++++++++++++------------ 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/src/tools/ceph_objectstore_tool.cc b/src/tools/ceph_objectstore_tool.cc index f6b585ab3ed94..52de997b42ce3 100644 --- a/src/tools/ceph_objectstore_tool.cc +++ b/src/tools/ceph_objectstore_tool.cc @@ -289,6 +289,8 @@ struct lookup_ghobject : public action_on_object_t { int file_fd = fd_none; bool debug; bool force = false; +bool no_superblock = false; + super_header sh; static int get_fd_data(int fd, bufferlist &bl) @@ -2436,6 +2438,7 @@ int print_obj_info(ObjectStore *store, coll_t coll, ghobject_t &ghobj, Formatter << cpp_strerror(r) << std::endl; } } + formatter->close_section(); formatter->flush(cout); cout << std::endl; @@ -3091,6 +3094,7 @@ int main(int argc, char **argv) "Output format which may be json, json-pretty, xml, xml-pretty") ("debug", "Enable diagnostic output to stderr") ("no-mon-config", "Do not contact mons for config") + ("no-superblock", "Do not read superblock") ("force", "Ignore some types of errors and proceed with operation - USE WITH CAUTION: CORRUPTION POSSIBLE NOW OR IN THE FUTURE") ("skip-journal-replay", "Disable journal replay") ("skip-mount-omap", "Disable mounting of omap") @@ -3142,6 +3146,8 @@ int main(int argc, char **argv) force = (vm.count("force") > 0); + no_superblock = (vm.count("no-superblock") > 0); + if (vm.count("namespace")) nspace = argnspace; @@ -3475,32 +3481,35 @@ int main(int argc, char **argv) #endif bufferlist bl; - OSDSuperblock superblock; auto ch = fs->open_collection(coll_t::meta()); - bufferlist::const_iterator p; - ret = fs->read(ch, OSD_SUPERBLOCK_GOBJECT, 0, 0, bl); - if (ret < 0) { - cerr << "Failure to read OSD superblock: " << cpp_strerror(ret) << std::endl; - goto out; - } + std::unique_ptr superblock; + if (!no_superblock) { + superblock.reset(new OSDSuperblock); + bufferlist::const_iterator p; + ret = fs->read(ch, OSD_SUPERBLOCK_GOBJECT, 0, 0, bl); + if (ret < 0) { + cerr << "Failure to read OSD superblock: " << cpp_strerror(ret) << std::endl; + goto out; + } - p = bl.cbegin(); - decode(superblock, p); + p = bl.cbegin(); + decode(*superblock, p); - if (debug) { - cerr << "Cluster fsid=" << superblock.cluster_fsid << std::endl; - } + if (debug) { + cerr << "Cluster fsid=" << superblock->cluster_fsid << std::endl; + } - if (debug) { - cerr << "Supported features: " << supported << std::endl; - cerr << "On-disk features: " << superblock.compat_features << std::endl; - } - if (supported.compare(superblock.compat_features) == -1) { - CompatSet unsupported = supported.unsupported(superblock.compat_features); - cerr << "On-disk OSD incompatible features set " - << unsupported << std::endl; - ret = -EINVAL; - goto out; + if (debug) { + cerr << "Supported features: " << supported << std::endl; + cerr << "On-disk features: " << superblock->compat_features << std::endl; + } + if (supported.compare(superblock->compat_features) == -1) { + CompatSet unsupported = supported.unsupported(superblock->compat_features); + cerr << "On-disk OSD incompatible features set " + << unsupported << std::endl; + ret = -EINVAL; + goto out; + } } if (op == "apply-layout-settings") { @@ -3515,7 +3524,8 @@ int main(int argc, char **argv) } else if (vm.count("arg1") && isdigit(arg1[0])) { target_level = atoi(arg1.c_str()); } - ret = apply_layout_settings(fs, superblock, pool, pgid, dry_run, target_level); + ceph_assert(superblock != nullptr); + ret = apply_layout_settings(fs, *superblock, pool, pgid, dry_run, target_level); goto out; } @@ -3630,9 +3640,9 @@ int main(int argc, char **argv) } if (op == "import") { - + ceph_assert(superblock != nullptr); try { - ret = tool.do_import(fs, superblock, force, pgidstr); + ret = tool.do_import(fs, *superblock, force, pgidstr); } catch (const buffer::error &e) { cerr << "do_import threw exception error " << e.what() << std::endl; @@ -3661,7 +3671,8 @@ int main(int argc, char **argv) bufferlist bl; OSDMap osdmap; if (epoch == 0) { - epoch = superblock.current_epoch; + ceph_assert(superblock != nullptr); + epoch = superblock->current_epoch; } ret = get_osdmap(fs, epoch, osdmap, bl); if (ret) { @@ -3688,7 +3699,8 @@ int main(int argc, char **argv) } else if (op == "get-inc-osdmap") { bufferlist bl; if (epoch == 0) { - epoch = superblock.current_epoch; + ceph_assert(superblock != nullptr); + epoch = superblock->current_epoch; } ret = get_inc_osdmap(fs, epoch, bl); if (ret < 0) { @@ -3718,7 +3730,8 @@ int main(int argc, char **argv) cerr << "Please specify the path to monitor db to update" << std::endl; ret = -EINVAL; } else { - ret = update_mon_db(*fs, superblock, dpath + "/keyring", mon_store_path); + ceph_assert(superblock != nullptr); + ret = update_mon_db(*fs, *superblock, dpath + "/keyring", mon_store_path); } goto out; } @@ -3758,8 +3771,9 @@ int main(int argc, char **argv) } if (op == "dump-super") { + ceph_assert(superblock != nullptr); formatter->open_object_section("superblock"); - superblock.dump(formatter); + superblock->dump(formatter); formatter->close_section(); formatter->flush(cout); cout << std::endl; @@ -4112,7 +4126,8 @@ int main(int argc, char **argv) cerr << "struct_v " << (int)struct_ver << std::endl; if (op == "export" || op == "export-remove") { - ret = tool.do_export(fs, coll, pgid, info, map_epoch, struct_ver, superblock, past_intervals); + ceph_assert(superblock != nullptr); + ret = tool.do_export(fs, coll, pgid, info, map_epoch, struct_ver, *superblock, past_intervals); if (ret == 0) { cerr << "Export successful" << std::endl; if (op == "export-remove") { @@ -4150,11 +4165,12 @@ int main(int argc, char **argv) cout << "Marking complete " << std::endl; - info.last_update = eversion_t(superblock.current_epoch, info.last_update.version + 1); + ceph_assert(superblock != nullptr); + info.last_update = eversion_t(superblock->current_epoch, info.last_update.version + 1); info.last_backfill = hobject_t::get_max(); - info.last_epoch_started = superblock.current_epoch; - info.history.last_epoch_started = superblock.current_epoch; - info.history.last_epoch_clean = superblock.current_epoch; + info.last_epoch_started = superblock->current_epoch; + info.history.last_epoch_started = superblock->current_epoch; + info.history.last_epoch_clean = superblock->current_epoch; past_intervals.clear(); if (!dry_run) { -- 2.39.5