From 5a3010db3b988e98a5fa416af3df2de595ab54d9 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Thu, 29 Jun 2023 19:20:30 +0000 Subject: [PATCH] osd: decouple client and recovery reads in ECBackend, part 2 Signed-off-by: Radoslaw Zarzynski --- src/osd/ECBackend.cc | 23 ++++++++--------------- src/osd/ECBackend.h | 7 +++---- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 5f91d85ce90..378f77e4fd4 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -233,10 +233,8 @@ PGBackend::RecoveryHandle *ECBackend::open_recovery_op() return new ECRecoveryHandle; } -void ECBackend::_failed_push(const hobject_t &hoid, - pair &in) +void ECBackend::_failed_push(const hobject_t &hoid, ECBackend::read_result_t &res) { - ECBackend::read_result_t &res = in.second; dout(10) << __func__ << ": Read error " << hoid << " r=" << res.r << " errors=" << res.errors << dendl; dout(10) << __func__ << ": canceling recovery op for obj " << hoid @@ -253,17 +251,16 @@ void ECBackend::_failed_push(const hobject_t &hoid, } struct OnRecoveryReadComplete : - public GenContext &> { + public GenContext { struct RecoveryMessages* rm; ECBackend *backend; hobject_t hoid; OnRecoveryReadComplete(RecoveryMessages* rm, ECBackend *backend, const hobject_t &hoid) : rm(rm), backend(backend), hoid(hoid) {} - void finish(pair &in) override { - ECBackend::read_result_t &res = in.second; + void finish(ECBackend::read_result_t &res) override { if (!(res.r == 0 && res.errors.empty())) { - backend->_failed_push(hoid, in); + backend->_failed_push(hoid, res); return; } ceph_assert(res.returned.size() == 1); @@ -1360,9 +1357,7 @@ void ECBackend::complete_read_op(ReadOp &rop) ceph_assert(rop.to_read.size() == rop.complete.size()); for (; reqiter != rop.to_read.end(); ++reqiter, ++resiter) { if (reqiter->second.cb) { - pair arg( - m, resiter->second); - reqiter->second.cb->complete(arg); + reqiter->second.cb->complete(resiter->second); reqiter->second.cb = nullptr; } } @@ -2407,7 +2402,7 @@ void ECBackend::objects_read_async( } struct CallClientContexts : - public GenContext &> { + public GenContext { hobject_t hoid; ECBackend *ec; ECBackend::ClientAsyncReadStatus *status; @@ -2418,8 +2413,7 @@ struct CallClientContexts : ECBackend::ClientAsyncReadStatus *status, const list > &to_read) : hoid(hoid), ec(ec), status(status), to_read(to_read) {} - void finish(pair &in) override { - ECBackend::read_result_t &res = in.second; + void finish(ECBackend::read_result_t &res) override { extent_map result; if (res.r != 0) goto out; @@ -2536,8 +2530,7 @@ int ECBackend::send_all_remaining_reads( list > offsets = rop.to_read.find(hoid)->second.to_read; - GenContext &> *c = - rop.to_read.find(hoid)->second.cb; + GenContext *c = rop.to_read.find(hoid)->second.cb; // (Note cuixf) If we need to read attrs and we read failed, try to read again. bool want_attrs = diff --git a/src/osd/ECBackend.h b/src/osd/ECBackend.h index 0483fa19129..d604a176ac7 100644 --- a/src/osd/ECBackend.h +++ b/src/osd/ECBackend.h @@ -334,12 +334,12 @@ public: const std::list > to_read; std::map>> need; bool want_attrs; - GenContext &> *cb; + GenContext *cb; read_request_t( const std::list > &to_read, const std::map>> &need, bool want_attrs, - GenContext &> *cb) + GenContext *cb) : to_read(to_read), need(need), want_attrs(want_attrs), cb(cb) {} }; @@ -749,8 +749,7 @@ public: uint64_t be_get_ondisk_size(uint64_t logical_size) const final { return sinfo.logical_to_next_chunk_offset(logical_size); } - void _failed_push(const hobject_t &hoid, - std::pair &in); + void _failed_push(const hobject_t &hoid, ECBackend::read_result_t &res); }; ostream &operator<<(ostream &lhs, const ECBackend::RMWPipeline::pipeline_state_t &rhs); -- 2.39.5