]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: implement the injectmdataerr admin command. 41401/head
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 19 May 2021 12:38:22 +0000 (12:38 +0000)
committerKefu Chai <kchai@redhat.com>
Wed, 26 May 2021 00:14:59 +0000 (08:14 +0800)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/admin/osd_admin.cc
src/crimson/admin/osd_admin.h
src/crimson/osd/osd.cc

index cbca5fead7ec5af2ec66da3c954be59d0e12061b..9f8ef248e423ead09b72397218dae5430fadb215 100644 (file)
@@ -373,4 +373,46 @@ private:
 template std::unique_ptr<AdminSocketHook> make_asok_hook<InjectDataErrorHook>(
   crimson::osd::ShardServices&);
 
+
+// Usage:
+//   injectmdataerr <pool> [namespace/]<obj-name> [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<tell_result_t> 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<tell_result_t>(-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<tell_result_t>(0,
+                                                      std::string{}, // no err
+                                                      std::move(bl));
+    });
+  }
+
+private:
+  crimson::osd::ShardServices& shard_services;
+};
+template std::unique_ptr<AdminSocketHook> make_asok_hook<InjectMDataErrorHook>(
+  crimson::osd::ShardServices&);
+
 } // namespace crimson::admin
index dccbca38d255af94263758a9ff35ed7edb6ed0f0..4b0da7330e41a20e136cd5572716f3f8a4dc0bb8 100644 (file)
@@ -16,6 +16,7 @@ class DumpPGStateHistory;
 class SeastarMetricsHook;
 class DumpPerfCountersHook;
 class InjectDataErrorHook;
+class InjectMDataErrorHook;
 
 template<class Hook, class... Args>
 std::unique_ptr<AdminSocketHook> make_asok_hook(Args&&... args);
index 9303c6bcf9e4267c738462da5ae9aaac425e5d48..c900dd6010c1161e4f073a7f3d30b149ada144c2 100644 (file)
@@ -444,6 +444,7 @@ seastar::future<> OSD::start_asok_admin()
       asok->register_command(make_asok_hook<SeastarMetricsHook>()),
       asok->register_command(make_asok_hook<DumpPerfCountersHook>()),
       asok->register_command(make_asok_hook<InjectDataErrorHook>(get_shard_services())),
+      asok->register_command(make_asok_hook<InjectMDataErrorHook>(get_shard_services())),
       // PG commands
       asok->register_command(make_asok_hook<pg::QueryCommand>(*this)),
       asok->register_command(make_asok_hook<pg::MarkUnfoundLostCommand>(*this)));