]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/admin/osd_admin: move to coroutines
authorMatan Breizman <mbreizma@redhat.com>
Tue, 17 Jun 2025 13:23:26 +0000 (13:23 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Mon, 23 Jun 2025 10:38:48 +0000 (10:38 +0000)
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
src/crimson/admin/osd_admin.cc

index ff92f6af4d4dd144c8fd3d3c7020d1fa77ad50c9..b19791c021c9b70585434c750832909e88fbaf7b 100644 (file)
@@ -64,7 +64,7 @@ public:
     f->open_object_section("status");
     osd.dump_status(f.get());
     f->close_section();
-    return seastar::make_ready_future<tell_result_t>(std::move(f));
+    co_return std::move(f);
   }
 private:
   const crimson::osd::OSD& osd;
@@ -89,9 +89,8 @@ public:
   {
     LOG_PREFIX(AdminSocketHook::SendBeaconHook);
     DEBUG("");
-    return osd.send_beacon().then([] {
-      return seastar::make_ready_future<tell_result_t>();
-    });
+    co_await osd.send_beacon();
+    co_return tell_result_t();
   }
 private:
   crimson::osd::OSD& osd;
@@ -137,7 +136,7 @@ public:
       INFO("block 'size' values are capped at {}. If you wish to use"
         " a higher value, please adjust 'osd_bench_max_block_size'",
         byte_u_t(max_block_size));
-      return seastar::make_ready_future<tell_result_t>(-EINVAL, "block size too large");
+      co_return tell_result_t(-EINVAL, "block size too large");
     } else if (bsize < (1LL << 20)) {
       // entering the realm of small block sizes.
       // limit the count to a sane value, assuming a configurable amount of
@@ -147,7 +146,7 @@ public:
       if (count > max_count) {
         INFO("bench count {} > osd_bench_small_size_max_iops {}",
           count, max_count);
-        return seastar::make_ready_future<tell_result_t>(-EINVAL, "count too large");
+        co_return tell_result_t(-EINVAL, "count too large");
       }
     } else {
       // 1MB block sizes are big enough so that we get more stuff done.
@@ -167,31 +166,28 @@ public:
           " with a higher value if you wish to use a higher 'count'.",
           max_count, byte_u_t(bsize), local_conf()->osd_bench_small_size_max_iops,
           duration);
-        return seastar::make_ready_future<tell_result_t>(-EINVAL, "count too large");
+        co_return tell_result_t(-EINVAL, "count too large");
       }
     }
     if (osize && bsize > osize) {
       bsize = osize;
     }
 
-    return osd.run_bench(count, bsize, osize, onum).then(
-      [format, bsize, count](double elapsed) {
-      if (elapsed < 0) {
-        return seastar::make_ready_future<tell_result_t>
-          (elapsed, "bench failed with error");
-      }
+    auto elapsed = co_await osd.run_bench(count, bsize, osize, onum);
+    if (elapsed < 0) {
+      co_return tell_result_t(elapsed, "bench failed with error");
+    }
 
-      unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
-      f->open_object_section("osd_bench_results");
-      f->dump_int("bytes_written", count);
-      f->dump_int("blocksize", bsize);
-      f->dump_float("elapsed_sec", elapsed);
-      f->dump_float("bytes_per_sec", (elapsed > 0) ? count / elapsed : 0);
-      f->dump_float("iops", (elapsed > 0) ? (count / elapsed) / bsize : 0);
-      f->close_section();
-      
-      return seastar::make_ready_future<tell_result_t>(std::move(f));
-    });
+    unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
+    f->open_object_section("osd_bench_results");
+    f->dump_int("bytes_written", count);
+    f->dump_int("blocksize", bsize);
+    f->dump_float("elapsed_sec", elapsed);
+    f->dump_float("bytes_per_sec", (elapsed > 0) ? count / elapsed : 0);
+    f->dump_float("iops", (elapsed > 0) ? (count / elapsed) / bsize : 0);
+    f->close_section();
+
+    co_return std::move(f);
   }
 private:
   crimson::osd::OSD& osd;
@@ -219,7 +215,7 @@ public:
     uint64_t seq = osd.send_pg_stats();
     unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
     f->dump_unsigned("stat_seq", seq);
-    return seastar::make_ready_future<tell_result_t>(std::move(f));
+    co_return std::move(f);
   }
 
 private:
@@ -244,21 +240,19 @@ public:
     DEBUG("");
     std::unique_ptr<Formatter> fref{
       Formatter::create(format, "json-pretty", "json-pretty")};
-    Formatter *f = fref.get();
-    f->open_object_section("pgstate_history");
-    f->open_array_section("pgs");
-    return pg_shard_manager.for_each_pg([f](auto &pgid, auto &pg) {
+    fref->open_object_section("pgstate_history");
+    fref->open_array_section("pgs");
+    co_await pg_shard_manager.for_each_pg([f = fref.get()](auto &pgid, auto &pg) {
       f->open_object_section("pg");
       f->dump_stream("pg") << pgid;
       const auto& peering_state = pg->get_peering_state();
       f->dump_string("currently", peering_state.get_current_state());
       peering_state.dump_history(f);
       f->close_section();
-    }).then([fref=std::move(fref)]() mutable {
-      fref->close_section();
-      fref->close_section();
-      return seastar::make_ready_future<tell_result_t>(std::move(fref));
     });
+    fref->close_section();
+    fref->close_section();
+    co_return std::move(fref);
   }
 
 private:
@@ -292,7 +286,7 @@ public:
 
     crimson::common::local_perf_coll().dump_formatted(f.get(), false,
       select_labeled_t::unlabeled, logger, counter);
-    return seastar::make_ready_future<tell_result_t>(std::move(f));
+    co_return std::move(f);
   }
 };
 template std::unique_ptr<AdminSocketHook> make_asok_hook<DumpPerfCountersHook>();
@@ -318,10 +312,9 @@ public:
     DEBUG("");
     if (local_conf().get_val<bool>("debug_asok_assert_abort")) {
       ceph_assert_always(0);
-      return seastar::make_ready_future<tell_result_t>();
+      co_return tell_result_t();
     } else {
-      return seastar::make_ready_future<tell_result_t>(
-        tell_result_t{-EPERM, "configuration set to disallow asok assert"});
+      co_return tell_result_t{-EPERM, "configuration set to disallow asok assert"};
     }
   }
 };
@@ -344,31 +337,27 @@ public:
     LOG_PREFIX(AdminSocketHook::DumpMetricsHook);
     DEBUG("");
     std::unique_ptr<Formatter> fref{Formatter::create(format, "json-pretty", "json-pretty")};
-    auto *f = fref.get();
     std::string prefix;
     cmd_getval(cmdmap, "group", prefix);
-    f->open_object_section("metrics");
-    f->open_array_section("metrics");
-    return seastar::do_with(std::move(prefix), [f](auto &prefix) {
-      return crimson::reactor_map_seq([f, &prefix] {
-        for (const auto& [full_name, metric_family]: seastar::scollectd::get_value_map()) {
-          if (!prefix.empty() && full_name.compare(0, prefix.size(), prefix) != 0) {
-            continue;
-          }
-          for (const auto& [labels, metric] : metric_family) {
-            if (metric && metric->is_enabled()) {
-             f->open_object_section(""); // enclosed by array
-              DumpMetricsHook::dump_metric_value(f, full_name, *metric, labels.labels());
-             f->close_section();
-            }
+    fref->open_object_section("metrics");
+    fref->open_array_section("metrics");
+    co_await crimson::reactor_map_seq([f = fref.get(), &prefix] {
+      for (const auto& [full_name, metric_family]: seastar::scollectd::get_value_map()) {
+        if (!prefix.empty() && full_name.compare(0, prefix.size(), prefix) != 0) {
+          continue;
+        }
+        for (const auto& [labels, metric] : metric_family) {
+          if (metric && metric->is_enabled()) {
+           f->open_object_section(""); // enclosed by array
+            DumpMetricsHook::dump_metric_value(f, full_name, *metric, labels.labels());
+           f->close_section();
           }
         }
-      });
-    }).then([fref = std::move(fref)]() mutable {
-      fref->close_section();
-      fref->close_section();
-      return seastar::make_ready_future<tell_result_t>(std::move(fref));
+      }
     });
+    fref->close_section();
+    fref->close_section();
+    co_return std::move(fref);
   }
 private:
   using registered_metric = seastar::metrics::impl::registered_metric;
@@ -515,17 +504,15 @@ public:
       obj = test_ops_get_object_name(*shard_services.get_map(), cmdmap);
     } catch (const std::invalid_argument& e) {
       logger().info("error during data error injection: {}", e.what());
-      return seastar::make_ready_future<tell_result_t>(-EINVAL,
-                                                      e.what());
+      co_return tell_result_t(-EINVAL, e.what());
     }
-    return shard_services.get_store().inject_data_error(obj).then([=] {
-      logger().info("successfully injected data error for obj={}", obj);
-      ceph::bufferlist bl;
-      bl.append("ok"sv);
-      return seastar::make_ready_future<tell_result_t>(0,
-                                                      std::string{}, // no err
-                                                      std::move(bl));
-    });
+    co_await shard_services.get_store().inject_data_error(obj);
+    logger().info("successfully injected data error for obj={}", obj);
+    ceph::bufferlist bl;
+    bl.append("ok"sv);
+    co_return tell_result_t(0,
+                            std::string{}, // no err
+                            std::move(bl));
   }
 
 private:
@@ -559,17 +546,15 @@ public:
       obj = test_ops_get_object_name(*shard_services.get_map(), cmdmap);
     } catch (const std::invalid_argument& e) {
       logger().info("error during metadata error injection: {}", e.what());
-      return seastar::make_ready_future<tell_result_t>(-EINVAL,
-                                                      e.what());
+      co_return tell_result_t(-EINVAL, e.what());
     }
-    return shard_services.get_store().inject_mdata_error(obj).then([=] {
-      logger().info("successfully injected metadata error for obj={}", obj);
-      ceph::bufferlist bl;
-      bl.append("ok"sv);
-      return seastar::make_ready_future<tell_result_t>(0,
-                                                      std::string{}, // no err
-                                                      std::move(bl));
-    });
+    co_await shard_services.get_store().inject_mdata_error(obj);
+    logger().info("successfully injected metadata error for obj={}", obj);
+    ceph::bufferlist bl;
+    bl.append("ok"sv);
+    co_return tell_result_t(0,
+                            std::string{}, // no err
+                            std::move(bl));
   }
 
 private:
@@ -594,21 +579,17 @@ public:
   {
     LOG_PREFIX(AdminSocketHook::DumpInFlightOpsHook);
     DEBUG("");
-    unique_ptr<Formatter> fref{
-      Formatter::create(format, "json-pretty", "json-pretty")};
-    auto *f = fref.get();
-    f->open_object_section("ops_in_flight");
-    f->open_array_section("ops_in_flight");
-    return pg_shard_manager.when_active()
-    .then([this, f, fref=std::move(fref)]() mutable {
-      return pg_shard_manager.invoke_on_each_shard_seq([f](const auto &shard_services) {
+    std::unique_ptr<Formatter> fref{Formatter::create(format, "json-pretty", "json-pretty")};
+    fref->open_object_section("ops_in_flight");
+    fref->open_array_section("ops_in_flight");
+    co_await pg_shard_manager.when_active();
+    co_await pg_shard_manager.invoke_on_each_shard_seq(
+      [f = fref.get()](const auto &shard_services) {
         return shard_services.dump_ops_in_flight(f);
-      }).then([fref=std::move(fref)]() mutable {
-        fref->close_section();
-        fref->close_section();
-        return seastar::make_ready_future<tell_result_t>(std::move(fref));
-      });
     });
+    fref->close_section();
+    fref->close_section();
+    co_return std::move(fref);
   }
 private:
   const crimson::osd::PGShardManager &pg_shard_manager;
@@ -634,7 +615,7 @@ public:
     op_registry.dump_historic_client_requests(f.get());
     f->close_section();
     f->dump_int("num_ops", 0);
-    return seastar::make_ready_future<tell_result_t>(std::move(f));
+    co_return std::move(f);
   }
 private:
   const crimson::osd::OSDOperationRegistry& op_registry;
@@ -660,7 +641,7 @@ public:
     op_registry.dump_slowest_historic_client_requests(f.get());
     f->close_section();
     f->dump_int("num_ops", 0);
-    return seastar::make_ready_future<tell_result_t>(std::move(f));
+    co_return std::move(f);
   }
 private:
   const crimson::osd::OSDOperationRegistry& op_registry;
@@ -681,19 +662,15 @@ public:
     LOG_PREFIX(AdminSocketHook::DumpRecoveryReservationsHook);
     DEBUG("");
     unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
-    return seastar::do_with(std::move(f), [this](auto&& f) {
-      f->open_object_section("reservations");
-      f->open_object_section("local_reservations");
-      return shard_services.local_dump_reservations(f.get()).then([&f, this] {
-        f->close_section();
-        f->open_object_section("remote_reservations");
-        return shard_services.remote_dump_reservations(f.get()).then([&f] {
-          f->close_section();
-          f->close_section();
-          return seastar::make_ready_future<tell_result_t>(std::move(f));
-        });
-      });
-    });
+    f->open_object_section("reservations");
+    f->open_object_section("local_reservations");
+    co_await shard_services.local_dump_reservations(f.get());
+    f->close_section();
+    f->open_object_section("remote_reservations");
+    co_await shard_services.remote_dump_reservations(f.get());
+    f->close_section();
+    f->close_section();
+    co_return std::move(f);
   }
 private:
   crimson::osd::ShardServices& shard_services;