]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: add_recovery(oid) before recover_object(oid)
authorKefu Chai <kchai@redhat.com>
Wed, 23 Sep 2020 04:14:36 +0000 (12:14 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 23 Sep 2020 04:20:16 +0000 (12:20 +0800)
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 <kchai@redhat.com>
src/crimson/osd/pg_recovery.cc
src/crimson/osd/replicated_recovery_backend.cc

index 36e51d4311140f3e9a626e3d7ce4dfcca895bd47..cf892aa69b278881c545305777528430152e47ca 100644 (file)
@@ -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");
index d62c771c5058404191b5481cd4349b4b9e08127e..4b4e494226b2a1abf6404d39a802744e65403f6c 100644 (file)
@@ -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<pg_shard_t, PushOp>(), get_shards_to_push(soid),
     [this, soid, need](auto& pops, auto& shards) {
     return maybe_pull_missing_obj(soid, need).then([this, soid](bool pulled) {