From: Xuehan Xu Date: Sat, 31 Oct 2020 11:53:12 +0000 (+0800) Subject: crimson/osd: make PglogBasedRecovery op take recovering objs triggered elsewhere... X-Git-Tag: v16.1.0~642^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cf07974c895d4c0d50f77f921cf10846d1cc274f;p=ceph.git crimson/osd: make PglogBasedRecovery op take recovering objs triggered elsewhere into account 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 --- diff --git a/src/crimson/osd/pg_recovery.cc b/src/crimson/osd/pg_recovery.cc index 3315feed6eb3..f73bcec46094 100644 --- a/src/crimson/osd/pg_recovery.cc +++ b/src/crimson/osd/pg_recovery.cc @@ -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; } diff --git a/src/crimson/osd/recovery_backend.h b/src/crimson/osd/recovery_backend.h index 21eb53fa7713..89f242b2b0c3 100644 --- a/src/crimson/osd/recovery_backend.h +++ b/src/crimson/osd/recovery_backend.h @@ -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(); }