@@ -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
282272RecoveryBackend::interruptible_future<>
0 commit comments