]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
messages,osd,crimson: let MOSDPGPull::take_pulls() return pulls 38569/head
authorKefu Chai <kchai@redhat.com>
Mon, 14 Dec 2020 17:45:02 +0000 (01:45 +0800)
committerKefu Chai <kchai@redhat.com>
Tue, 15 Dec 2020 01:01:44 +0000 (09:01 +0800)
so the caller can grab the pulls without creating a pull vector first.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/replicated_recovery_backend.cc
src/messages/MOSDPGPull.h
src/osd/ReplicatedBackend.cc

index 9a1fdc16fcb019bbc189d6b83fbead9904f51441..4ff56a026804ea222bbd895fd9d64f0174f21bf1 100644 (file)
@@ -580,41 +580,37 @@ ReplicatedRecoveryBackend::get_shards_to_push(const hobject_t& soid) const
 seastar::future<> ReplicatedRecoveryBackend::handle_pull(Ref<MOSDPGPull> m)
 {
   logger().debug("{}: {}", __func__, *m);
-  vector<PullOp> 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<uint64_t> 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<uint64_t> 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<MOSDPGPush>();
-        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<MOSDPGPush>();
+      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());
     });
   });
 }
index 877f199ed2bbc8ed516135f71c02540453dd84b0..eb5c94516d46b0d1d3b657eb0afb8a5984c9fed6 100644 (file)
@@ -40,8 +40,8 @@ public:
     return pgid;
   }
 
-  void take_pulls(std::vector<PullOp> *outpulls) {
-    outpulls->swap(pulls);
+  std::vector<PullOp> take_pulls() {
+    return std::move(pulls);
   }
   void set_pulls(std::vector<PullOp>&& pull_ops) {
     pulls = std::move(pull_ops);
index d7ffc0533958da8ce657a664ef308c019d3de370..5e78c281a429f65244d1a7ebba29354bd9de45c8 100644 (file)
@@ -899,9 +899,7 @@ void ReplicatedBackend::do_pull(OpRequestRef op)
   pg_shard_t from = m->from;
 
   map<pg_shard_t, vector<PushOp> > replies;
-  vector<PullOp> 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()));
   }