From: Kefu Chai Date: Mon, 14 Dec 2020 17:45:02 +0000 (+0800) Subject: messages,osd,crimson: let MOSDPGPull::take_pulls() return pulls X-Git-Tag: v17.0.0~295^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=de92b800844ab3ceb3f8c022ee1ce0eb69c7a17e;p=ceph.git messages,osd,crimson: let MOSDPGPull::take_pulls() return pulls so the caller can grab the pulls without creating a pull vector first. Signed-off-by: Kefu Chai --- diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 9a1fdc16fcb01..4ff56a026804e 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -580,41 +580,37 @@ ReplicatedRecoveryBackend::get_shards_to_push(const hobject_t& soid) const seastar::future<> ReplicatedRecoveryBackend::handle_pull(Ref m) { logger().debug("{}: {}", __func__, *m); - vector pulls; - m->take_pulls(&pulls); - return seastar::do_with(std::move(pulls), - [this, m, from = m->from](auto& pulls) { - return seastar::parallel_for_each(pulls, [this, 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(); - } - assert(recovery_info.clone_subset.empty()); + 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 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()); - }); + 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()); }); }); } diff --git a/src/messages/MOSDPGPull.h b/src/messages/MOSDPGPull.h index 877f199ed2bbc..eb5c94516d46b 100644 --- a/src/messages/MOSDPGPull.h +++ b/src/messages/MOSDPGPull.h @@ -40,8 +40,8 @@ public: return pgid; } - void take_pulls(std::vector *outpulls) { - outpulls->swap(pulls); + std::vector take_pulls() { + return std::move(pulls); } void set_pulls(std::vector&& pull_ops) { pulls = std::move(pull_ops); diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index d7ffc0533958d..5e78c281a429f 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -899,9 +899,7 @@ void ReplicatedBackend::do_pull(OpRequestRef op) pg_shard_t from = m->from; map > replies; - vector pulls; - m->take_pulls(&pulls); - for (auto& i : pulls) { + for (auto& i : m->take_pulls()) { replies[from].push_back(PushOp()); handle_pull(from, i, &(replies[from].back())); }