]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: make OSDOperationRegistry responsible for historic ops
authorRadosław Zarzyński <rzarzyns@redhat.com>
Fri, 27 May 2022 17:24:45 +0000 (19:24 +0200)
committerRadosław Zarzyński <rzarzyns@redhat.com>
Mon, 30 May 2022 14:37:19 +0000 (16:37 +0200)
Signed-off-by: Radosław Zarzyński <rzarzyns@redhat.com>
src/crimson/osd/osd_operation.cc
src/crimson/osd/osd_operation.h
src/crimson/osd/osd_operation_external_tracking.cc
src/crimson/osd/osd_operation_external_tracking.h

index 17f5d34478b24f44be6668c2f2117b71234cf27f..afc06ae3798489f6046ae10fb0fdae488891d845 100644 (file)
@@ -35,6 +35,36 @@ void OSDOperationRegistry::do_stop()
   // to_ref_down is going off
 }
 
+void OSDOperationRegistry::put_historic(const ClientRequest& op) {
+  // unlink the op from the client request registry. this is a part of
+  // the re-link procedure. finally it will be in historic registry.
+  constexpr auto client_reg_index =
+    static_cast<size_t>(OperationTypeCode::client_request);
+  constexpr auto historic_reg_index =
+    static_cast<size_t>(OperationTypeCode::historic_client_request);
+  auto& client_registry = get_registry<client_reg_index>();
+  auto& historic_registry = get_registry<historic_reg_index>();
+
+  historic_registry.splice(std::end(historic_registry),
+                          client_registry,
+                          client_registry.iterator_to(op));
+  ClientRequest::ICRef(
+    &op, /* add_ref= */true
+  ).detach(); // yes, "leak" it for now!
+
+  // check whether the history size limit is not exceeded; if so, then
+  // purge the oldest op.
+  // NOTE: Operation uses the auto-unlink feature of boost::intrusive.
+  // NOTE: the cleaning happens in OSDOperationRegistry::do_stop()
+  using crimson::common::local_conf;
+  if (historic_registry.size() > local_conf()->osd_op_history_size) {
+    const auto& oldest_historic_op =
+      static_cast<const ClientRequest&>(historic_registry.front());
+    // clear a previously "leaked" op
+    ClientRequest::ICRef(&oldest_historic_op, /* add_ref= */false);
+  }
+}
+
 size_t OSDOperationRegistry::dump_client_requests(ceph::Formatter* f) const
 {
   const auto& client_registry =
index acee7af3c7b2b49f66559897320e992b89407236..a9cd48cae124ddda51674cc9bf2cd40b9ea890de 100644 (file)
@@ -171,6 +171,9 @@ struct OSDOperationRegistry : OperationRegistryT<
   static_cast<size_t>(OperationTypeCode::last_op)
 > {
   void do_stop() override;
+
+  void put_historic(const class ClientRequest& op);
+
   size_t dump_client_requests(ceph::Formatter* f) const;
   size_t dump_historic_client_requests(ceph::Formatter* f) const;
 
index 520276832c1cecd1a281dbe768d73170a7d77b1c..287ae0cb435d85fdff8c7e0c3288307135798d67 100644 (file)
@@ -13,48 +13,4 @@ namespace {
 
 namespace crimson::osd {
 
-void HistoricBackend::handle(ClientRequest::CompletionEvent&,
-                             const Operation& op)
-{
-  // early exit if the history is disabled
-  using crimson::common::local_conf;
-  if (!local_conf()->osd_op_history_size) {
-    return;
-  }
-
-#ifdef NDEBUG
-  const auto& client_request = static_cast<const ClientRequest&>(op);
-#else
-  const auto& client_request = dynamic_cast<const ClientRequest&>(op);
-#endif
-  auto& main_registry = client_request.osd.get_shard_services().registry;
-
-  // unlink the op from the client request registry. this is a part of
-  // the re-link procedure. finally it will be in historic registry.
-  constexpr auto client_reg_index =
-    static_cast<size_t>(OperationTypeCode::client_request);
-  constexpr auto historic_reg_index =
-    static_cast<size_t>(OperationTypeCode::historic_client_request);
-  auto& client_registry = main_registry.get_registry<client_reg_index>();
-  auto& historic_registry = main_registry.get_registry<historic_reg_index>();
-
-  historic_registry.splice(std::end(historic_registry),
-                          client_registry,
-                          client_registry.iterator_to(client_request));
-  ClientRequest::ICRef(
-    &client_request, /* add_ref= */true
-  ).detach(); // yes, "leak" it for now!
-
-  // check whether the history size limit is not exceeded; if so, then
-  // purge the oldest op.
-  // NOTE: Operation uses the auto-unlink feature of boost::intrusive.
-  // NOTE: the cleaning happens in OSDOperationRegistry::do_stop()
-  if (historic_registry.size() > local_conf()->osd_op_history_size) {
-    const auto& oldest_historic_op =
-      static_cast<const ClientRequest&>(historic_registry.front());
-    // clear a previously "leaked" op
-    ClientRequest::ICRef(&oldest_historic_op, /* add_ref= */false);
-  }
-}
-
 } // namespace crimson::osd
index 0bf2dbdd3f1db4f29ed194d803bb4688f32ce53c..bfe0b41f676eb4b3486541a43d60d2995b55953b 100644 (file)
@@ -3,6 +3,7 @@
 
 #pragma once
 
+#include "crimson/osd/osd.h"
 #include "crimson/osd/osdmap_gate.h"
 #include "crimson/osd/osd_operations/background_recovery.h"
 #include "crimson/osd/osd_operations/client_request.h"
@@ -230,8 +231,20 @@ struct HistoricBackend
               const ClientRequest::PGPipeline::SendReply& blocker) override {
   }
 
-  void handle(ClientRequest::CompletionEvent&,
-              const Operation&) override;
+  static const ClientRequest& to_client_request(const Operation& op) {
+#ifdef NDEBUG
+    return static_cast<const ClientRequest&>(op);
+#else
+    return dynamic_cast<const ClientRequest&>(op);
+#endif
+  }
+
+  void handle(ClientRequest::CompletionEvent&, const Operation& op) override {
+    if (crimson::common::local_conf()->osd_op_history_size) {
+      const auto& client_op = to_client_request(op);
+      client_op.osd.get_shard_services().registry.put_historic(client_op);
+    }
+  }
 };
 
 } // namespace crimson::osd