From ff5757c7d193583afee773758d707bfe2812bb61 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rados=C5=82aw=20Zarzy=C5=84ski?= Date: Fri, 27 May 2022 19:24:45 +0200 Subject: [PATCH] crimson/osd: make OSDOperationRegistry responsible for historic ops MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Radosław Zarzyński --- src/crimson/osd/osd_operation.cc | 30 +++++++++++++ src/crimson/osd/osd_operation.h | 3 ++ .../osd/osd_operation_external_tracking.cc | 44 ------------------- .../osd/osd_operation_external_tracking.h | 17 ++++++- 4 files changed, 48 insertions(+), 46 deletions(-) diff --git a/src/crimson/osd/osd_operation.cc b/src/crimson/osd/osd_operation.cc index 17f5d34478b..afc06ae3798 100644 --- a/src/crimson/osd/osd_operation.cc +++ b/src/crimson/osd/osd_operation.cc @@ -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(OperationTypeCode::client_request); + constexpr auto historic_reg_index = + static_cast(OperationTypeCode::historic_client_request); + auto& client_registry = get_registry(); + auto& historic_registry = get_registry(); + + 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(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 = diff --git a/src/crimson/osd/osd_operation.h b/src/crimson/osd/osd_operation.h index acee7af3c7b..a9cd48cae12 100644 --- a/src/crimson/osd/osd_operation.h +++ b/src/crimson/osd/osd_operation.h @@ -171,6 +171,9 @@ struct OSDOperationRegistry : OperationRegistryT< static_cast(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; diff --git a/src/crimson/osd/osd_operation_external_tracking.cc b/src/crimson/osd/osd_operation_external_tracking.cc index 520276832c1..287ae0cb435 100644 --- a/src/crimson/osd/osd_operation_external_tracking.cc +++ b/src/crimson/osd/osd_operation_external_tracking.cc @@ -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(op); -#else - const auto& client_request = dynamic_cast(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(OperationTypeCode::client_request); - constexpr auto historic_reg_index = - static_cast(OperationTypeCode::historic_client_request); - auto& client_registry = main_registry.get_registry(); - auto& historic_registry = main_registry.get_registry(); - - 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(historic_registry.front()); - // clear a previously "leaked" op - ClientRequest::ICRef(&oldest_historic_op, /* add_ref= */false); - } -} - } // namespace crimson::osd diff --git a/src/crimson/osd/osd_operation_external_tracking.h b/src/crimson/osd/osd_operation_external_tracking.h index 0bf2dbdd3f1..bfe0b41f676 100644 --- a/src/crimson/osd/osd_operation_external_tracking.h +++ b/src/crimson/osd/osd_operation_external_tracking.h @@ -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(op); +#else + return dynamic_cast(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 -- 2.39.5