]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/.../scrub_events: convert ScrubScan::run to coroutine
authorSamuel Just <sjust@redhat.com>
Tue, 26 Mar 2024 04:20:48 +0000 (21:20 -0700)
committerMatan Breizman <mbreizma@redhat.com>
Wed, 15 May 2024 15:01:06 +0000 (18:01 +0300)
Signed-off-by: Samuel Just <sjust@redhat.com>
(cherry picked from commit 0d042f9d18fb191c3c8d6dbbf7c5bae54b8ed0fb)

src/crimson/osd/osd_operations/scrub_events.cc

index e62cdde0fbab2bfa371e216c8f4626477d9709f3..1d109db4851cbe3a65c3664232d14528c021c124 100644 (file)
@@ -2,6 +2,7 @@
 // vim: ts=8 sw=2 smarttab
 
 #include "crimson/common/log.h"
+#include "crimson/common/coroutine.h"
 #include "crimson/osd/pg.h"
 #include "crimson/osd/osd_connection_priv.h"
 #include "messages/MOSDRepScrubMap.h"
@@ -144,50 +145,40 @@ ScrubScan::ifut<> ScrubScan::run(PG &pg)
   ret.valid_through = pg.get_info().last_update;
 
   DEBUGDPP("begin: {}, end: {}", pg, begin, end);
-  return interruptor::make_interruptible(
+  auto [objects, _] = co_await interruptor::make_interruptible(
     pg.shard_services.get_store().list_objects(
       pg.get_collection_ref(),
       ghobject_t(begin, ghobject_t::NO_GEN, pg.get_pgid().shard),
       ghobject_t(end, ghobject_t::NO_GEN, pg.get_pgid().shard),
       std::numeric_limits<uint64_t>::max())
-  ).then_interruptible([FNAME, this, &pg](auto &&result) {
-    DEBUGDPP("listed {} objects", pg, std::get<0>(result).size());
-    return seastar::do_with(
-      std::move(std::get<0>(result)),
-      [this, &pg](auto &objects) {
-       return interruptor::do_for_each(
-         objects,
-         [this, &pg](auto &obj) {
-           if (obj.is_pgmeta() || obj.hobj.is_temp()) {
-             return interruptor::now();
-           } else {
-             return scan_object(pg, obj);
-           }
-         });
-      });
-  }).then_interruptible([FNAME, this, &pg] {
-    if (local) {
-      DEBUGDPP("complete, submitting local event", pg);
-      pg.scrubber.handle_event(
-       scrub::ScrubContext::scan_range_complete_t(
-         pg.get_pg_whoami(),
-         std::move(ret)));
-      return seastar::now();
-    } else {
-      DEBUGDPP("complete, sending response to primary", pg);
-      auto m = crimson::make_message<MOSDRepScrubMap>(
-       spg_t(pg.get_pgid().pgid, pg.get_primary().shard),
-       pg.get_osdmap_epoch(),
-       pg.get_pg_whoami());
-      encode(ret, m->get_data());
-      pg.scrubber.handle_event(
-       scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{});
-      return pg.shard_services.send_to_osd(
+  );
+
+  DEBUGDPP("listed {} objects", pg, objects);
+  for (const auto &object: objects) {
+    co_await scan_object(pg, object);
+  }
+
+  if (local) {
+    DEBUGDPP("complete, submitting local event", pg);
+    pg.scrubber.handle_event(
+      scrub::ScrubContext::scan_range_complete_t(
+       pg.get_pg_whoami(),
+       std::move(ret)));
+  } else {
+    DEBUGDPP("complete, sending response to primary", pg);
+    auto m = crimson::make_message<MOSDRepScrubMap>(
+      spg_t(pg.get_pgid().pgid, pg.get_primary().shard),
+      pg.get_osdmap_epoch(),
+      pg.get_pg_whoami());
+    encode(ret, m->get_data());
+    pg.scrubber.handle_event(
+      scrub::ScrubContext::generate_and_submit_chunk_result_complete_t{});
+    co_await interruptor::make_interruptible(
+      pg.shard_services.send_to_osd(
        pg.get_primary().osd,
        std::move(m),
-       pg.get_osdmap_epoch());
-    }
-  });
+       pg.get_osdmap_epoch()));
+  }
 }
 
 ScrubScan::ifut<> ScrubScan::scan_object(