Skip to content

Commit 878f3bf

Browse files
committed
crimson/osd/recovery_backend: move scan_for_backfill to coroutine
Signed-off-by: Matan Breizman <[email protected]>
1 parent 9ef9c12 commit 878f3bf

File tree

1 file changed

+37
-47
lines changed

1 file changed

+37
-47
lines changed

src/crimson/osd/recovery_backend.cc

Lines changed: 37 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -229,54 +229,44 @@ RecoveryBackend::scan_for_backfill(
229229
LOG_PREFIX(RecoveryBackend::scan_for_backfill);
230230
DEBUGDPP("starting from {}", pg, start);
231231
auto version_map = seastar::make_lw_shared<std::map<hobject_t, eversion_t>>();
232-
return backend->list_objects(start, max).then_interruptible(
233-
[FNAME, this, start, version_map] (auto&& ret) {
234-
auto&& [objects, next] = std::move(ret);
235-
return seastar::do_with(
236-
std::move(objects),
237-
[FNAME, this, version_map](auto &objects) {
238-
return interruptor::parallel_for_each(objects,
239-
[FNAME, this, version_map] (const hobject_t& object)
240-
-> interruptible_future<> {
241-
crimson::osd::ObjectContextRef obc;
242-
if (pg.is_primary()) {
243-
obc = pg.obc_registry.maybe_get_cached_obc(object);
244-
}
245-
if (obc) {
246-
if (obc->obs.exists) {
247-
DEBUGDPP("found (primary): {} {}",
248-
pg, object, obc->obs.oi.version);
249-
version_map->emplace(object, obc->obs.oi.version);
250-
} else {
251-
// if the object does not exist here, it must have been removed
252-
// between the collection_list_partial and here. This can happen
253-
// for the first item in the range, which is usually last_backfill.
254-
}
255-
return seastar::now();
256-
} else {
257-
return backend->load_metadata(object).safe_then_interruptible(
258-
[FNAME, this, version_map, object] (auto md) {
259-
if (md->os.exists) {
260-
DEBUGDPP("found: {} {}", pg,
261-
object, md->os.oi.version);
262-
version_map->emplace(object, md->os.oi.version);
263-
}
264-
return seastar::now();
265-
}, PGBackend::load_metadata_ertr::assert_all{});
266-
}
267-
});
268-
}).then_interruptible([FNAME, version_map, start=std::move(start),
269-
next=std::move(next), this] {
270-
BackfillInterval bi;
271-
bi.begin = std::move(start);
272-
bi.end = std::move(next);
273-
bi.objects = std::move(*version_map);
274-
DEBUGDPP("{} BackfillInterval filled, leaving, {}",
275-
"scan_for_backfill",
276-
pg, bi);
277-
return seastar::make_ready_future<BackfillInterval>(std::move(bi));
278-
});
232+
auto&& [objects, next] = co_await backend->list_objects(start, max);
233+
co_await interruptor::parallel_for_each(objects, [FNAME, this, version_map]
234+
(const hobject_t& object) -> interruptible_future<> {
235+
crimson::osd::ObjectContextRef obc;
236+
if (pg.is_primary()) {
237+
obc = pg.obc_registry.maybe_get_cached_obc(object);
238+
}
239+
if (obc) {
240+
if (obc->obs.exists) {
241+
DEBUGDPP("found (primary): {} {}",
242+
pg, object, obc->obs.oi.version);
243+
version_map->emplace(object, obc->obs.oi.version);
244+
} else {
245+
// if the object does not exist here, it must have been removed
246+
// between the collection_list_partial and here. This can happen
247+
// for the first item in the range, which is usually last_backfill.
248+
}
249+
co_return;
250+
} else {
251+
auto md =
252+
co_await backend->load_metadata(object).handle_error_interruptible(
253+
PGBackend::load_metadata_ertr::assert_all{});
254+
if (md->os.exists) {
255+
DEBUGDPP("found: {} {}", pg,
256+
object, md->os.oi.version);
257+
version_map->emplace(object, md->os.oi.version);
258+
}
259+
co_return;
260+
}
279261
});
262+
BackfillInterval bi;
263+
bi.begin = std::move(start);
264+
bi.end = std::move(next);
265+
bi.objects = std::move(*version_map);
266+
DEBUGDPP("{} BackfillInterval filled, leaving, {}",
267+
"scan_for_backfill",
268+
pg, bi);
269+
co_return std::move(bi);
280270
}
281271

282272
RecoveryBackend::interruptible_future<>

0 commit comments

Comments
 (0)