]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: add RecoveryBackend:add_recovering()
authorKefu Chai <kchai@redhat.com>
Wed, 23 Sep 2020 04:07:32 +0000 (12:07 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 23 Sep 2020 04:20:16 +0000 (12:20 +0800)
before this change, get_recovery() can also be used for adding a
recovery instance to `recovering`. this behavior is error-prone and
confusing.

after this change, add_recovery() is used in the place where we
want to add a new instance of recovery instance.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/pg_recovery.cc
src/crimson/osd/recovery_backend.h

index 95121f292f6931fa712decf94fab8fb97211d789..36e51d4311140f3e9a626e3d7ce4dfcca895bd47 100644 (file)
@@ -258,10 +258,10 @@ std::optional<crimson::osd::blocking_future<>> PGRecovery::recover_missing(
   const hobject_t &soid, eversion_t need)
 {
   if (pg->get_peering_state().get_missing_loc().is_deleted(soid)) {
-    return pg->get_recovery_backend()->get_recovering(soid).make_blocking_future(
+    return pg->get_recovery_backend()->add_recovering(soid).make_blocking_future(
        pg->get_recovery_backend()->recover_delete(soid, need));
   } else {
-    return pg->get_recovery_backend()->get_recovering(soid).make_blocking_future(
+    return pg->get_recovery_backend()->add_recovering(soid).make_blocking_future(
       pg->get_recovery_backend()->recover_object(soid, need).handle_exception(
        [=, soid = std::move(soid)] (auto e) {
        on_failed_recover({ pg->get_pg_whoami() }, soid, need);
@@ -277,7 +277,7 @@ size_t PGRecovery::prep_object_replica_deletes(
   std::vector<crimson::osd::blocking_future<>> *in_progress)
 {
   in_progress->push_back(
-    pg->get_recovery_backend()->get_recovering(soid).make_blocking_future(
+    pg->get_recovery_backend()->add_recovering(soid).make_blocking_future(
       pg->get_recovery_backend()->push_delete(soid, need).then([=] {
        object_stat_sum_t stat_diff;
        stat_diff.num_objects_recovered = 1;
@@ -295,7 +295,7 @@ size_t PGRecovery::prep_object_replica_pushes(
   std::vector<crimson::osd::blocking_future<>> *in_progress)
 {
   in_progress->push_back(
-    pg->get_recovery_backend()->get_recovering(soid).make_blocking_future(
+    pg->get_recovery_backend()->add_recovering(soid).make_blocking_future(
       pg->get_recovery_backend()->recover_object(soid, need).handle_exception(
        [=, soid = std::move(soid)] (auto e) {
        on_failed_recover({ pg->get_pg_whoami() }, soid, need);
index b529fda5a15c81d6a4bbb296a831950d6374481c..748ec5ab0e17eedee2cf3533751b28eb47696486 100644 (file)
@@ -50,8 +50,14 @@ public:
       coll{coll},
       backend{backend} {}
   virtual ~RecoveryBackend() {}
+  WaitForObjectRecovery& add_recovering(const hobject_t& soid) {
+    auto [it, added] = recovering.emplace(soid, WaitForObjectRecovery{});
+    assert(added);
+    return it->second;
+  }
   WaitForObjectRecovery& get_recovering(const hobject_t& soid) {
-    return recovering[soid];
+    assert(is_recovering(soid));
+    return recovering.at(soid);
   }
   void remove_recovering(const hobject_t& soid) {
     recovering.erase(soid);