Skip to content

Commit 0d042f9

Browse files
committed
crimson/.../scrub_events: convert ScrubScan::run to coroutine
Signed-off-by: Samuel Just <[email protected]>
1 parent 9f39124 commit 0d042f9

File tree

1 file changed

+28
-37
lines changed

1 file changed

+28
-37
lines changed

src/crimson/osd/osd_operations/scrub_events.cc

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// vim: ts=8 sw=2 smarttab
33

44
#include "crimson/common/log.h"
5+
#include "crimson/common/coroutine.h"
56
#include "crimson/osd/pg.h"
67
#include "crimson/osd/osd_connection_priv.h"
78
#include "messages/MOSDRepScrubMap.h"
@@ -144,50 +145,40 @@ ScrubScan::ifut<> ScrubScan::run(PG &pg)
144145
ret.valid_through = pg.get_info().last_update;
145146

146147
DEBUGDPP("begin: {}, end: {}", pg, begin, end);
147-
return interruptor::make_interruptible(
148+
auto [objects, _] = co_await interruptor::make_interruptible(
148149
pg.shard_services.get_store().list_objects(
149150
pg.get_collection_ref(),
150151
ghobject_t(begin, ghobject_t::NO_GEN, pg.get_pgid().shard),
151152
ghobject_t(end, ghobject_t::NO_GEN, pg.get_pgid().shard),
152153
std::numeric_limits<uint64_t>::max())
153-
).then_interruptible([FNAME, this, &pg](auto &&result) {
154-
DEBUGDPP("listed {} objects", pg, std::get<0>(result).size());
155-
return seastar::do_with(
156-
std::move(std::get<0>(result)),
157-
[this, &pg](auto &objects) {
158-
return interruptor::do_for_each(
159-
objects,
160-
[this, &pg](auto &obj) {
161-
if (obj.is_pgmeta() || obj.hobj.is_temp()) {
162-
return interruptor::now();
163-
} else {
164-
return scan_object(pg, obj);
165-
}
166-
});
167-
});
168-
}).then_interruptible([FNAME, this, &pg] {
169-
if (local) {
170-
DEBUGDPP("complete, submitting local event", pg);
171-
pg.scrubber.handle_event(
172-
scrub::ScrubContext::scan_range_complete_t(
173-
pg.get_pg_whoami(),
174-
std::move(ret)));
175-
return seastar::now();
176-
} else {
177-
DEBUGDPP("complete, sending response to primary", pg);
178-
auto m = crimson::make_message<MOSDRepScrubMap>(
179-
spg_t(pg.get_pgid().pgid, pg.get_primary().shard),
180-
pg.get_osdmap_epoch(),
181-
pg.get_pg_whoami());
182-
encode(ret, m->get_data());
183-
pg.scrubber.handle_event(
184-
scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{});
185-
return pg.shard_services.send_to_osd(
154+
);
155+
156+
DEBUGDPP("listed {} objects", pg, objects);
157+
for (const auto &object: objects) {
158+
co_await scan_object(pg, object);
159+
}
160+
161+
if (local) {
162+
DEBUGDPP("complete, submitting local event", pg);
163+
pg.scrubber.handle_event(
164+
scrub::ScrubContext::scan_range_complete_t(
165+
pg.get_pg_whoami(),
166+
std::move(ret)));
167+
} else {
168+
DEBUGDPP("complete, sending response to primary", pg);
169+
auto m = crimson::make_message<MOSDRepScrubMap>(
170+
spg_t(pg.get_pgid().pgid, pg.get_primary().shard),
171+
pg.get_osdmap_epoch(),
172+
pg.get_pg_whoami());
173+
encode(ret, m->get_data());
174+
pg.scrubber.handle_event(
175+
scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{});
176+
co_await interruptor::make_interruptible(
177+
pg.shard_services.send_to_osd(
186178
pg.get_primary().osd,
187179
std::move(m),
188-
pg.get_osdmap_epoch());
189-
}
190-
});
180+
pg.get_osdmap_epoch()));
181+
}
191182
}
192183

193184
ScrubScan::ifut<> ScrubScan::scan_object(

0 commit comments

Comments
 (0)