]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: make PglogBasedRecovery op take recovering objs triggered elsewhere...
authorXuehan Xu <xxhdx1985126@gmail.com>
Sat, 31 Oct 2020 11:53:12 +0000 (19:53 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Tue, 10 Nov 2020 07:18:01 +0000 (15:18 +0800)
PGRecovery::start_recovery_ops() should wait for all inflight recovery ops, whether they are
started by BackgroundRecovery or not, otherwise there may be circumstances in which BackgroundRecovery
keep recursively invoking its do_recovery when start_recovery_ops returns recovery done while there are
still missing objects.

Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/osd/pg_recovery.cc
src/crimson/osd/recovery_backend.h

index 3315feed6eb3a531808ab41077c1def63bb28667..f73bcec4609455776c189cd151cbf5b651b1c018 100644 (file)
@@ -218,6 +218,9 @@ size_t PGRecovery::start_replica_recovery_ops(
 
       if (pg->get_recovery_backend()->is_recovering(soid)) {
        logger().debug("{}: already recovering object {}", __func__, soid);
+       auto& recovery_waiter = pg->get_recovery_backend()->get_recovering(soid);
+       out->push_back(recovery_waiter.wait_for_recovered_blocking());
+       started++;
        continue;
       }
 
index 21eb53fa7713b4fd795eb5dbaff8b99a3b51b185..89f242b2b0c3918fc0464cde0f9ddfd3c5ecd332 100644 (file)
@@ -143,6 +143,11 @@ protected:
     seastar::future<> wait_for_recovered() {
       return recovered.get_shared_future();
     }
+    crimson::osd::blocking_future<>
+    wait_for_recovered_blocking() {
+      return make_blocking_future(
+         recovered.get_shared_future());
+    }
     seastar::future<> wait_for_pull() {
       return pulled.get_shared_future();
     }