From: Samuel Just Date: Tue, 15 Apr 2025 19:57:35 +0000 (-0700) Subject: crimson/osd/recovery_backend: correctly handle missing object in scan_for_backfill X-Git-Tag: v20.3.0~42^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=88432ebd7432c513ccd495e77425401beddb9953;p=ceph.git crimson/osd/recovery_backend: correctly handle missing object in scan_for_backfill load_and_lock can return enoent if object is missing. Fixes: https://tracker.ceph.com/issues/70936 Signed-off-by: Samuel Just --- diff --git a/src/crimson/osd/recovery_backend.cc b/src/crimson/osd/recovery_backend.cc index dc9659972410..f30d34195aa2 100644 --- a/src/crimson/osd/recovery_backend.cc +++ b/src/crimson/osd/recovery_backend.cc @@ -237,10 +237,23 @@ RecoveryBackend::scan_for_backfill( DEBUGDPP("querying obj:{}", pg, object); auto obc_manager = pg.obc_loader.get_obc_manager( object, /* resolve_clone = */ false); + + auto found = co_await pg.obc_loader.load_and_lock( obc_manager, RWState::RWREAD - ).handle_error_interruptible( + ).si_then([] { + return true; + }).handle_error_interruptible( + crimson::ct_error::enoent::handle([](auto) { + return false; + }), crimson::ct_error::assert_all("unexpected error") ); + if (!found) { + // if the object does not exist here, it must have been removed + // between the collection_list_partial and here. This can happen + // for the first item in the range, which is usually last_backfill. + co_return; + } if (obc_manager.get_obc()->obs.exists) { auto version = obc_manager.get_obc()->obs.oi.version;