From da502e7127654ccb647b560e22ae69247f059f5e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rados=C5=82aw=20Zarzy=C5=84ski?= Date: Fri, 15 Dec 2023 22:59:03 +0100 Subject: [PATCH] osd: abstract EC read pipeline's check_recovery_sources() from IO MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit For the sake of crimson. Signed-off-by: Radosław Zarzyński --- src/osd/ECBackend.cc | 27 ++++++++++++++++++++++----- src/osd/ECCommon.cc | 25 ------------------------- src/osd/ECCommon.h | 26 ++++++++++++++++---------- 3 files changed, 38 insertions(+), 40 deletions(-) diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index ecc5d5c8237..8ae0fe8c5c5 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -1316,11 +1316,28 @@ void ECBackend::handle_sub_read_reply( void ECBackend::check_recovery_sources(const OSDMapRef& osdmap) { -#if 0 - read_pipeline.check_recovery_sources(osdmap, [this] (const hobject_t& obj) { - recovery_ops.erase(obj); - }); -#endif + struct FinishReadOp : public GenContext { + ECCommon::ReadPipeline& read_pipeline; + ceph_tid_t tid; + FinishReadOp(ECCommon::ReadPipeline& read_pipeline, ceph_tid_t tid) + : read_pipeline(read_pipeline), tid(tid) {} + void finish(ThreadPool::TPHandle&) override { + auto ropiter = read_pipeline.tid_to_read_map.find(tid); + ceph_assert(ropiter != read_pipeline.tid_to_read_map.end()); + read_pipeline.complete_read_op(ropiter->second); + } + }; + read_pipeline.check_recovery_sources( + osdmap, + [this] (const hobject_t& obj) { + recovery_backend.recovery_ops.erase(obj); + }, + [this] (const ReadOp& op) { + get_parent()->schedule_recovery_work( + get_parent()->bless_unlocked_gencontext( + new FinishReadOp(read_pipeline, op.tid)), + 1); + }); } void ECBackend::on_change() diff --git a/src/osd/ECCommon.cc b/src/osd/ECCommon.cc index 5d7c7a48cb2..2d7acf15d18 100644 --- a/src/osd/ECCommon.cc +++ b/src/osd/ECCommon.cc @@ -182,31 +182,6 @@ void ECCommon::ReadPipeline::complete_read_op(ReadOp &rop) tid_to_read_map.erase(rop.tid); } -struct FinishReadOp : public GenContext { - ECCommon::ReadPipeline& read_pipeline; - ceph_tid_t tid; - FinishReadOp(ECCommon::ReadPipeline& read_pipeline, ceph_tid_t tid) - : read_pipeline(read_pipeline), tid(tid) {} - void finish(ThreadPool::TPHandle&) override { - auto ropiter = read_pipeline.tid_to_read_map.find(tid); - ceph_assert(ropiter != read_pipeline.tid_to_read_map.end()); - read_pipeline.complete_read_op(ropiter->second); - } -}; - -void ECCommon::ReadPipeline::schedule_recovery_work() -{ -#ifndef WITH_SEASTAR - get_parent()->schedule_recovery_work( - get_parent()->bless_unlocked_gencontext( - nullptr), //new struct FinishReadOp(*this, op.tid)), - 1); -#else - // TODO - ceph_abort_msg("not yet implemented"); -#endif -} - void ECCommon::ReadPipeline::on_change() { for (map::iterator i = tid_to_read_map.begin(); diff --git a/src/osd/ECCommon.h b/src/osd/ECCommon.h index 1e30b6d80ff..3ceb3d295b2 100644 --- a/src/osd/ECCommon.h +++ b/src/osd/ECCommon.h @@ -370,14 +370,18 @@ struct ECCommon { bool fast_read, GenContextURef > &&> &&func); - template + template void filter_read_op( const OSDMapRef& osdmap, ReadOp &op, - F&& on_erase); + F&& on_erase, + G&& on_schedule_recovery); - template - void check_recovery_sources(const OSDMapRef& osdmap, F&& on_erase); + template + void check_recovery_sources( + const OSDMapRef& osdmap, + F&& on_erase, + G&& on_schedule_recovery); void complete_read_op(ReadOp &rop); @@ -698,10 +702,11 @@ template <> struct fmt::formatter : fmt::ostream_format template <> struct fmt::formatter : fmt::ostream_formatter {}; template <> struct fmt::formatter : fmt::ostream_formatter {}; -template +template void ECCommon::ReadPipeline::check_recovery_sources( const OSDMapRef& osdmap, - F&& on_erase) + F&& on_erase, + G&& on_schedule_recovery) { std::set tids_to_filter; for (std::map >::iterator @@ -720,15 +725,16 @@ void ECCommon::ReadPipeline::check_recovery_sources( ++i) { std::map::iterator j = tid_to_read_map.find(*i); ceph_assert(j != tid_to_read_map.end()); - filter_read_op(osdmap, j->second, on_erase); + filter_read_op(osdmap, j->second, on_erase, on_schedule_recovery); } } -template +template void ECCommon::ReadPipeline::filter_read_op( const OSDMapRef& osdmap, ReadOp &op, - F&& on_erase) + F&& on_erase, + G&& on_schedule_recovery) { std::set to_cancel; for (std::map >::iterator i = op.source_to_obj.begin(); @@ -790,6 +796,6 @@ void ECCommon::ReadPipeline::filter_read_op( * the pull on the affected objects and pushes from in-memory buffers * on any now complete unaffected objects. */ - schedule_recovery_work(); + on_schedule_recovery(op); } } -- 2.39.5