From 87effa76fdd1b8c0a3c43347622efae7eedcca88 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Wed, 19 May 2021 12:38:22 +0000 Subject: [PATCH] crimson/osd: implement the injectmdataerr admin command. Signed-off-by: Radoslaw Zarzynski --- src/crimson/admin/osd_admin.cc | 42 ++++++++++++++++++++++++++++++++++ src/crimson/admin/osd_admin.h | 1 + src/crimson/osd/osd.cc | 1 + 3 files changed, 44 insertions(+) diff --git a/src/crimson/admin/osd_admin.cc b/src/crimson/admin/osd_admin.cc index cbca5fead7ec5..9f8ef248e423e 100644 --- a/src/crimson/admin/osd_admin.cc +++ b/src/crimson/admin/osd_admin.cc @@ -373,4 +373,46 @@ private: template std::unique_ptr make_asok_hook( crimson::osd::ShardServices&); + +// Usage: +// injectmdataerr [namespace/] [shardid] +class InjectMDataErrorHook : public AdminSocketHook { +public: + InjectMDataErrorHook(crimson::osd::ShardServices& shard_services) : + AdminSocketHook("injectmdataerr", + "name=pool,type=CephString " \ + "name=objname,type=CephObjectname " \ + "name=shardid,type=CephInt,req=false,range=0|255", + "inject data error to an object"), + shard_services(shard_services) { + } + + seastar::future call(const cmdmap_t& cmdmap, + std::string_view format, + ceph::bufferlist&& input) const final + { + ghobject_t obj; + try { + obj = test_ops_get_object_name(*shard_services.get_osdmap(), cmdmap); + } catch (const std::invalid_argument& e) { + logger().info("error during metadata error injection: {}", e.what()); + return seastar::make_ready_future(-EINVAL, + e.what()); + } + return shard_services.get_store().inject_mdata_error(obj).then([=] { + logger().info("successfully injected metadata error for obj={}", obj); + ceph::bufferlist bl; + bl.append("ok"sv); + return seastar::make_ready_future(0, + std::string{}, // no err + std::move(bl)); + }); + } + +private: + crimson::osd::ShardServices& shard_services; +}; +template std::unique_ptr make_asok_hook( + crimson::osd::ShardServices&); + } // namespace crimson::admin diff --git a/src/crimson/admin/osd_admin.h b/src/crimson/admin/osd_admin.h index dccbca38d255a..4b0da7330e41a 100644 --- a/src/crimson/admin/osd_admin.h +++ b/src/crimson/admin/osd_admin.h @@ -16,6 +16,7 @@ class DumpPGStateHistory; class SeastarMetricsHook; class DumpPerfCountersHook; class InjectDataErrorHook; +class InjectMDataErrorHook; template std::unique_ptr make_asok_hook(Args&&... args); diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index 9303c6bcf9e42..c900dd6010c11 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -444,6 +444,7 @@ seastar::future<> OSD::start_asok_admin() asok->register_command(make_asok_hook()), asok->register_command(make_asok_hook()), asok->register_command(make_asok_hook(get_shard_services())), + asok->register_command(make_asok_hook(get_shard_services())), // PG commands asok->register_command(make_asok_hook(*this)), asok->register_command(make_asok_hook(*this))); -- 2.39.5