From: Kefu Chai Date: Wed, 23 Sep 2020 04:14:36 +0000 (+0800) Subject: crimson/osd: add_recovery(oid) before recover_object(oid) X-Git-Tag: v16.1.0~1007^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=35d37e2bff7976b6a1d4cb2af8ad3abad0e2045f;p=ceph.git crimson/osd: add_recovery(oid) before recover_object(oid) in 7736bddc534e5df2daf704c4bbc92a0927b0db4d, we assumed that the object to be recovered did not exist in `recovering` before `recover_object(oid)` was called. but this turns out not true. so, in this change, `add_object(oid)` is called before `recover_object(oid)` gets called. Fixes: https://tracker.ceph.com/issues/47593 Signed-off-by: Kefu Chai --- diff --git a/src/crimson/osd/pg_recovery.cc b/src/crimson/osd/pg_recovery.cc index 36e51d431114..cf892aa69b27 100644 --- a/src/crimson/osd/pg_recovery.cc +++ b/src/crimson/osd/pg_recovery.cc @@ -433,6 +433,7 @@ void PGRecovery::enqueue_push( { logger().debug("{}: target={} obj={} v={}", __func__, target, obj, v); + pg->get_recovery_backend()->add_recovering(obj); std::ignore = pg->get_recovery_backend()->recover_object(obj, v).\ handle_exception([] (auto) { ceph_abort_msg("got exception on backfill's push"); diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index d62c771c5058..4b4e494226b2 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -23,10 +23,9 @@ seastar::future<> ReplicatedRecoveryBackend::recover_object( eversion_t need) { logger().debug("{}: {}, {}", __func__, soid, need); - [[maybe_unused]] auto [r, added] = - recovering.emplace(soid, WaitForObjectRecovery{}); + // always add_recovering(soid) before recover_object(soid) + assert(is_recovering(soid)); // start tracking the recovery of soid - assert(added); return seastar::do_with(std::map(), get_shards_to_push(soid), [this, soid, need](auto& pops, auto& shards) { return maybe_pull_missing_obj(soid, need).then([this, soid](bool pulled) {