From: Radosław Zarzyński Date: Thu, 6 Jul 2023 13:39:19 +0000 (+0200) Subject: osd: decouple reads and recovery in ECBackend::check_recovery_sources() X-Git-Tag: v19.3.0~13^2~38 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d609bbe960ce1662d7a2e30e6cefaea1cb5c66e2;p=ceph.git osd: decouple reads and recovery in ECBackend::check_recovery_sources() Signed-off-by: Radosław Zarzyński --- diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 4bc7695ebb16..3982c0441435 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -1391,9 +1391,11 @@ struct FinishReadOp : public GenContext { } }; +template void ECBackend::ReadPipeline::filter_read_op( const OSDMapRef& osdmap, - ReadOp &op) + ReadOp &op, + F&& on_erase) { set to_cancel; for (map >::iterator i = op.source_to_obj.begin(); @@ -1443,8 +1445,7 @@ void ECBackend::ReadPipeline::filter_read_op( op.to_read.erase(*i); op.complete.erase(*i); - // TODO: meh, this doesn't look like a part of the read pipeline - //recovery_ops.erase(*i); + on_erase(*i); } if (op.in_progress.empty()) { @@ -1470,17 +1471,19 @@ void ECBackend::ReadPipeline::filter_read_op( } } -void ECBackend::check_recovery_sources(const OSDMapRef& osdmap) +template +void ECBackend::ReadPipeline::check_recovery_sources( + const OSDMapRef& osdmap, + F&& on_erase) { - // TODO: dissect into ReadPipeline set tids_to_filter; for (map >::iterator - i = read_pipeline.shard_to_read_map.begin(); - i != read_pipeline.shard_to_read_map.end(); + i = shard_to_read_map.begin(); + i != shard_to_read_map.end(); ) { if (osdmap->is_down(i->first.osd)) { tids_to_filter.insert(i->second.begin(), i->second.end()); - read_pipeline.shard_to_read_map.erase(i++); + shard_to_read_map.erase(i++); } else { ++i; } @@ -1488,12 +1491,19 @@ void ECBackend::check_recovery_sources(const OSDMapRef& osdmap) for (set::iterator i = tids_to_filter.begin(); i != tids_to_filter.end(); ++i) { - map::iterator j = read_pipeline.tid_to_read_map.find(*i); - ceph_assert(j != read_pipeline.tid_to_read_map.end()); - read_pipeline.filter_read_op(osdmap, j->second); + 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); } } +void ECBackend::check_recovery_sources(const OSDMapRef& osdmap) +{ + read_pipeline.check_recovery_sources(osdmap, [this] (const hobject_t& obj) { + recovery_ops.erase(obj); + }); +} + void ECBackend::ReadPipeline::on_change() { for (map::iterator i = tid_to_read_map.begin(); diff --git a/src/osd/ECBackend.h b/src/osd/ECBackend.h index b3951f664a8f..94267144ba4c 100644 --- a/src/osd/ECBackend.h +++ b/src/osd/ECBackend.h @@ -399,9 +399,14 @@ public: bool fast_read, GenContextURef > &&> &&func); + template void filter_read_op( const OSDMapRef& osdmap, - ReadOp &op); + ReadOp &op, + F&& on_erase); + + template + void check_recovery_sources(const OSDMapRef& osdmap, F&& on_erase); void complete_read_op(ReadOp &rop);