From 7aff9cbc37cbc573611aa72c670ccf805ab86b38 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Wed, 26 Aug 2020 20:58:32 +0800 Subject: [PATCH] crimson/osd: extract maybe_pull_missing_obj() out extract ReplicatedRecoveryBackend::maybe_pull_missing_obj() from ReplicatedRecoveryBackend::recover_object() for better readability Signed-off-by: Kefu Chai --- .../osd/replicated_recovery_backend.cc | 65 +++++++++++-------- src/crimson/osd/replicated_recovery_backend.h | 6 ++ 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 6299957eea8..a308bed8548 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -25,34 +25,9 @@ seastar::future<> ReplicatedRecoveryBackend::recover_object( logger().debug("{}: {}, {}", __func__, soid, need); auto& recovery_waiter = recovering[soid]; return seastar::do_with(std::map(), get_shards_to_push(soid), - [this, soid, need, &recovery_waiter](auto& pops, auto& shards) { - return [this, soid, need, &recovery_waiter] { - pg_missing_tracker_t local_missing = pg.get_local_missing(); - if (local_missing.is_missing(soid)) { - PullOp po; - auto& pi = recovery_waiter.pi; - prepare_pull(po, pi, soid, need); - auto msg = make_message(); - msg->from = pg.get_pg_whoami(); - msg->set_priority(pg.get_recovery_op_priority()); - msg->pgid = pg.get_pgid(); - msg->map_epoch = pg.get_osdmap_epoch(); - msg->min_epoch = pg.get_last_peering_reset(); - std::vector pulls; - pulls.push_back(po); - msg->set_pulls(&pulls); - return shard_services.send_to_osd(pi.from.osd, - std::move(msg), - pg.get_osdmap_epoch()).then( - [&recovery_waiter] { - return recovery_waiter.wait_for_pull().then([] { - return seastar::make_ready_future(true); - }); - }); - } else { - return seastar::make_ready_future(false); - } - }().then([this, &pops, &shards, soid, need, &recovery_waiter](bool pulled) mutable { + [this, soid, need](auto& pops, auto& shards) { + return maybe_pull_missing_obj(soid, need).then( + [this, &pops, &shards, soid, need, &recovery_waiter](bool pulled) mutable { return [this, &recovery_waiter, soid, pulled] { if (!recovery_waiter.obc) { return pg.get_or_load_head_obc(soid).safe_then( @@ -138,6 +113,40 @@ seastar::future<> ReplicatedRecoveryBackend::recover_object( }); } +seastar::future +ReplicatedRecoveryBackend::maybe_pull_missing_obj( + const hobject_t& soid, + eversion_t need) +{ + pg_missing_tracker_t local_missing = pg.get_local_missing(); + if (!local_missing.is_missing(soid)) { + return seastar::make_ready_future(false); + } + PullOp po; + assert(recovering.count(soid)); + auto& recovery_waiter = recovering[soid]; + auto& pi = recovery_waiter.pi; + prepare_pull(po, pi, soid, need); + auto msg = make_message(); + msg->from = pg.get_pg_whoami(); + msg->set_priority(pg.get_recovery_op_priority()); + msg->pgid = pg.get_pgid(); + msg->map_epoch = pg.get_osdmap_epoch(); + msg->min_epoch = pg.get_last_peering_reset(); + std::vector pulls; + pulls.push_back(po); + msg->set_pulls(&pulls); + return shard_services.send_to_osd( + pi.from.osd, + std::move(msg), + pg.get_osdmap_epoch() + ).then([&recovery_waiter] { + return recovery_waiter.wait_for_pull(); + }).then([] { + return seastar::make_ready_future(true); + }); +} + seastar::future<> ReplicatedRecoveryBackend::push_delete( const hobject_t& soid, eversion_t need) diff --git a/src/crimson/osd/replicated_recovery_backend.h b/src/crimson/osd/replicated_recovery_backend.h index dd37cd42dfe..667cd987632 100644 --- a/src/crimson/osd/replicated_recovery_backend.h +++ b/src/crimson/osd/replicated_recovery_backend.h @@ -109,6 +109,12 @@ protected: return seastar::now(); } private: + /// pull missing object from peer + /// + /// @return true if the object is pulled, false otherwise + seastar::future maybe_pull_missing_obj( + const hobject_t& soid, + eversion_t need); /// read the remaining extents of object to be recovered and fill push_op /// with them /// -- 2.39.5