From 88432ebd7432c513ccd495e77425401beddb9953 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 15 Apr 2025 12:57:35 -0700 Subject: [PATCH] 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 --- src/crimson/osd/recovery_backend.cc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/crimson/osd/recovery_backend.cc b/src/crimson/osd/recovery_backend.cc index dc965997241..f30d34195aa 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; -- 2.39.5