From 50bf0bdce0d4199ffad7a3887a55b308d0ee74f6 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Wed, 27 Jan 2021 19:07:58 +0800 Subject: [PATCH] crimson/osd: use do_with to capture MOSDPGPull::take_pulls()'s return MOSDPGPull::take_pulls() returns a temporary object, so we need to use seastar::do_with to create an object whose lives until seastar::do_with's inner continuation chain ends Signed-off-by: Xuehan Xu --- .../osd/replicated_recovery_backend.cc | 66 ++++++++++--------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 218550fa73219..d956e96a0fef2 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -1,5 +1,5 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*- +// vim: ts=8 sw=2 smarttab expandtab #include #include @@ -569,37 +569,39 @@ ReplicatedRecoveryBackend::get_shards_to_push(const hobject_t& soid) const seastar::future<> ReplicatedRecoveryBackend::handle_pull(Ref m) { logger().debug("{}: {}", __func__, *m); - return seastar::parallel_for_each(m->take_pulls(), - [this, from=m->from](auto& pull_op) { - const hobject_t& soid = pull_op.soid; - logger().debug("handle_pull: {}", soid); - return backend->stat(coll, ghobject_t(soid)).then( - [this, &pull_op](auto st) { - ObjectRecoveryInfo &recovery_info = pull_op.recovery_info; - ObjectRecoveryProgress &progress = pull_op.recovery_progress; - if (progress.first && recovery_info.size == ((uint64_t) -1)) { - // Adjust size and copy_subset - recovery_info.size = st.st_size; - if (st.st_size) { - interval_set object_range; - object_range.insert(0, st.st_size); - recovery_info.copy_subset.intersection_of(object_range); - } else { - recovery_info.copy_subset.clear(); + return seastar::do_with(m->take_pulls(), [this, from=m->from](auto& pulls) { + return seastar::parallel_for_each(pulls, + [this, from](auto& pull_op) { + const hobject_t& soid = pull_op.soid; + logger().debug("handle_pull: {}", soid); + return backend->stat(coll, ghobject_t(soid)).then( + [this, &pull_op](auto st) { + ObjectRecoveryInfo &recovery_info = pull_op.recovery_info; + ObjectRecoveryProgress &progress = pull_op.recovery_progress; + if (progress.first && recovery_info.size == ((uint64_t) -1)) { + // Adjust size and copy_subset + recovery_info.size = st.st_size; + if (st.st_size) { + interval_set object_range; + object_range.insert(0, st.st_size); + recovery_info.copy_subset.intersection_of(object_range); + } else { + recovery_info.copy_subset.clear(); + } + assert(recovery_info.clone_subset.empty()); } - assert(recovery_info.clone_subset.empty()); - } - return build_push_op(recovery_info, progress, 0); - }).then([this, from](auto pop) { - auto msg = make_message(); - msg->from = pg.get_pg_whoami(); - msg->pgid = pg.get_pgid(); - msg->map_epoch = pg.get_osdmap_epoch(); - msg->min_epoch = pg.get_last_peering_reset(); - msg->set_priority(pg.get_recovery_op_priority()); - msg->pushes.push_back(std::move(pop)); - return shard_services.send_to_osd(from.osd, std::move(msg), - pg.get_osdmap_epoch()); + return build_push_op(recovery_info, progress, 0); + }).then([this, from](auto pop) { + auto msg = make_message(); + msg->from = pg.get_pg_whoami(); + msg->pgid = pg.get_pgid(); + msg->map_epoch = pg.get_osdmap_epoch(); + msg->min_epoch = pg.get_last_peering_reset(); + msg->set_priority(pg.get_recovery_op_priority()); + msg->pushes.push_back(std::move(pop)); + return shard_services.send_to_osd(from.osd, std::move(msg), + pg.get_osdmap_epoch()); + }); }); }); } -- 2.39.5