From 0d042f9d18fb191c3c8d6dbbf7c5bae54b8ed0fb Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 25 Mar 2024 21:20:48 -0700 Subject: [PATCH] crimson/.../scrub_events: convert ScrubScan::run to coroutine Signed-off-by: Samuel Just --- .../osd/osd_operations/scrub_events.cc | 65 ++++++++----------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/src/crimson/osd/osd_operations/scrub_events.cc b/src/crimson/osd/osd_operations/scrub_events.cc index e62cdde0fba..1d109db4851 100644 --- a/src/crimson/osd/osd_operations/scrub_events.cc +++ b/src/crimson/osd/osd_operations/scrub_events.cc @@ -2,6 +2,7 @@ // vim: ts=8 sw=2 smarttab #include "crimson/common/log.h" +#include "crimson/common/coroutine.h" #include "crimson/osd/pg.h" #include "crimson/osd/osd_connection_priv.h" #include "messages/MOSDRepScrubMap.h" @@ -144,50 +145,40 @@ ScrubScan::ifut<> ScrubScan::run(PG &pg) ret.valid_through = pg.get_info().last_update; DEBUGDPP("begin: {}, end: {}", pg, begin, end); - return interruptor::make_interruptible( + auto [objects, _] = co_await interruptor::make_interruptible( pg.shard_services.get_store().list_objects( pg.get_collection_ref(), ghobject_t(begin, ghobject_t::NO_GEN, pg.get_pgid().shard), ghobject_t(end, ghobject_t::NO_GEN, pg.get_pgid().shard), std::numeric_limits::max()) - ).then_interruptible([FNAME, this, &pg](auto &&result) { - DEBUGDPP("listed {} objects", pg, std::get<0>(result).size()); - return seastar::do_with( - std::move(std::get<0>(result)), - [this, &pg](auto &objects) { - return interruptor::do_for_each( - objects, - [this, &pg](auto &obj) { - if (obj.is_pgmeta() || obj.hobj.is_temp()) { - return interruptor::now(); - } else { - return scan_object(pg, obj); - } - }); - }); - }).then_interruptible([FNAME, this, &pg] { - if (local) { - DEBUGDPP("complete, submitting local event", pg); - pg.scrubber.handle_event( - scrub::ScrubContext::scan_range_complete_t( - pg.get_pg_whoami(), - std::move(ret))); - return seastar::now(); - } else { - DEBUGDPP("complete, sending response to primary", pg); - auto m = crimson::make_message( - spg_t(pg.get_pgid().pgid, pg.get_primary().shard), - pg.get_osdmap_epoch(), - pg.get_pg_whoami()); - encode(ret, m->get_data()); - pg.scrubber.handle_event( - scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{}); - return pg.shard_services.send_to_osd( + ); + + DEBUGDPP("listed {} objects", pg, objects); + for (const auto &object: objects) { + co_await scan_object(pg, object); + } + + if (local) { + DEBUGDPP("complete, submitting local event", pg); + pg.scrubber.handle_event( + scrub::ScrubContext::scan_range_complete_t( + pg.get_pg_whoami(), + std::move(ret))); + } else { + DEBUGDPP("complete, sending response to primary", pg); + auto m = crimson::make_message( + spg_t(pg.get_pgid().pgid, pg.get_primary().shard), + pg.get_osdmap_epoch(), + pg.get_pg_whoami()); + encode(ret, m->get_data()); + pg.scrubber.handle_event( + scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{}); + co_await interruptor::make_interruptible( + pg.shard_services.send_to_osd( pg.get_primary().osd, std::move(m), - pg.get_osdmap_epoch()); - } - }); + pg.get_osdmap_epoch())); + } } ScrubScan::ifut<> ScrubScan::scan_object( -- 2.39.5