]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/recovery_backend: scan_for_backfill_primary correctly handle 63035/head
authorMatan Breizman <mbreizma@redhat.com>
Tue, 29 Apr 2025 10:10:07 +0000 (10:10 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Tue, 29 Apr 2025 10:10:07 +0000 (10:10 +0000)
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 <mbreizma@redhat.com>
src/crimson/osd/recovery_backend.cc

index 1b022d19a73525de4ab5b729d938a6c9b0b66553..5c25409a80a4cc42027cdff2b7939765f4484ea5 100644 (file)
@@ -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;