From 35d37e2bff7976b6a1d4cb2af8ad3abad0e2045f Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Wed, 23 Sep 2020 12:14:36 +0800 Subject: [PATCH] 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 --- src/crimson/osd/pg_recovery.cc | 1 + src/crimson/osd/replicated_recovery_backend.cc | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/crimson/osd/pg_recovery.cc b/src/crimson/osd/pg_recovery.cc index 36e51d4311140..cf892aa69b278 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 d62c771c50584..4b4e494226b2a 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) { -- 2.39.5