]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
Merge pull request #53078 from xxhdx1985126/wip-crimson-pg-recovery
authorSamuel Just <sjust@redhat.com>
Mon, 11 Dec 2023 04:00:31 +0000 (20:00 -0800)
committerGitHub <noreply@github.com>
Mon, 11 Dec 2023 04:00:31 +0000 (20:00 -0800)
crimson/osd/pg_recovery: avoiding duplicated object recovering

Reviewed-by: Samuel Just <sjust@redhat.com>
Reviewed-by: Matan Breizman <mbreizma@redhat.com>
1  2 
src/crimson/osd/pg_recovery.cc

index f74525b736e00e07ed491a45d0cdc7691b2a1971,efbbf7e4f3ee19a5a3d12209f5ffba04547e659a..13ac069c63d4166eaae66c4eb2aacf99792635f5
@@@ -314,19 -319,25 +328,26 @@@ RecoveryBackend::interruptible_future<
    const hobject_t& soid,
    eversion_t need)
  {
-   return pg->get_recovery_backend()->add_recovering(soid).wait_track_blocking(
-     trigger,
-     pg->get_recovery_backend()->recover_object(soid, need)
-     .handle_exception_interruptible(
-       [=, this, soid = std::move(soid)] (auto e) {
-       on_failed_recover({ pg->get_pg_whoami() }, soid, need);
-       return seastar::make_ready_future<>();
-     })
-   );
+   logger().info("{} {} v {}", __func__, soid, need);
+   auto [recovering, added] = pg->get_recovery_backend()->add_recovering(soid);
+   if (added) {
+     logger().info("{} {} v {}, new recovery", __func__, soid, need);
+     return recovering.wait_track_blocking(
+       trigger,
+       pg->get_recovery_backend()->recover_object(soid, need)
+       .handle_exception_interruptible(
+       [=, this, soid = std::move(soid)] (auto e) {
+       on_failed_recover({ pg->get_pg_whoami() }, soid, need);
+       return seastar::make_ready_future<>();
+       })
+     );
+   } else {
+     return recovering.wait_for_recovered();
+   }
  }
  
 -void PGRecovery::on_local_recover(
 +RecoveryBackend::interruptible_future<>
 +PGRecovery::on_local_recover(
    const hobject_t& soid,
    const ObjectRecoveryInfo& recovery_info,
    const bool is_delete,