From: Laura Flores Date: Wed, 23 Apr 2025 15:06:56 +0000 (-0500) Subject: Merge pull request #62710 from bill-scales/ec_backfill X-Git-Tag: v20.3.0~30 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4fe79d9aa60dd6119f2e9267eab9f636375b499f;p=ceph.git Merge pull request #62710 from bill-scales/ec_backfill osd: EC Optimizations: Backfill changes for partial writes --- 4fe79d9aa60dd6119f2e9267eab9f636375b499f diff --cc src/crimson/osd/recovery_backend.cc index f30d34195aa2,81174e2ba471..67b998338e3f --- a/src/crimson/osd/recovery_backend.cc +++ b/src/crimson/osd/recovery_backend.cc @@@ -228,32 -290,21 +290,34 @@@ RecoveryBackend::scan_for_backfill_repl [[maybe_unused]] const std::int64_t min, const std::int64_t max) { - LOG_PREFIX(RecoveryBackend::scan_for_backfill); + LOG_PREFIX(RecoveryBackend::scan_for_backfill_replica); DEBUGDPP("starting from {}", pg, start); - auto version_map = seastar::make_lw_shared>(); + auto version_map = seastar::make_lw_shared>(); auto&& [objects, next] = co_await backend->list_objects(start, max); - co_await interruptor::parallel_for_each(objects, seastar::coroutine::lambda([FNAME, this, version_map] + co_await interruptor::parallel_for_each(objects, + seastar::coroutine::lambda([FNAME, this, version_map] (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( + ).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;