From 33a3bc25e4c46a158f87d6f5ac9a3b678d9dee77 Mon Sep 17 00:00:00 2001 From: Matan Breizman Date: Tue, 29 Apr 2025 10:10:07 +0000 Subject: [PATCH] crimson/osd/recovery_backend: scan_for_backfill_primary correctly handle missing object scan_for_backfill was seperated to scan_for_backfill_primary and scan_for_backfill_replica. The fix from: https://github.com/ceph/ceph/pull/62837/commits/88432ebd7432c513ccd495e77425401beddb9953 was only copied to the replica version. Fixes: https://tracker.ceph.com/issues/71124 Signed-off-by: Matan Breizman (cherry picked from commit 2848bc8ce33bb786e4be3ea52559660282544881) --- src/crimson/osd/recovery_backend.cc | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/crimson/osd/recovery_backend.cc b/src/crimson/osd/recovery_backend.cc index 1b022d19a73..5c25409a80a 100644 --- a/src/crimson/osd/recovery_backend.cc +++ b/src/crimson/osd/recovery_backend.cc @@ -238,12 +238,25 @@ RecoveryBackend::scan_for_backfill_primary( seastar::coroutine::lambda([FNAME, this, version_map, backfill_targets] (const hobject_t& object) -> interruptible_future<> { DEBUGDPP("querying obj:{}", pg, object); - auto obc_manager = pg.obc_loader.get_obc_manager(object); - co_await pg.obc_loader.load_and_lock( + 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( - crimson::ct_error::assert_all("unexpected error") + ).si_then([] { + return true; + }).handle_error_interruptible( + crimson::ct_error::enoent::handle([](auto) { + return false; + }), + crimson::ct_error::assert_all(fmt::format("{} {} error when loading obc", pg, FNAME).c_str()) ); + 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