Skip to content

Commit 69fa301

Browse files
committed
crimson/admin/osd_admin: move to coroutines
Signed-off-by: Matan Breizman <[email protected]>
1 parent b90683d commit 69fa301

File tree

1 file changed

+82
-105
lines changed

1 file changed

+82
-105
lines changed

src/crimson/admin/osd_admin.cc

Lines changed: 82 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class OsdStatusHook : public AdminSocketHook {
6464
f->open_object_section("status");
6565
osd.dump_status(f.get());
6666
f->close_section();
67-
return seastar::make_ready_future<tell_result_t>(std::move(f));
67+
co_return std::move(f);
6868
}
6969
private:
7070
const crimson::osd::OSD& osd;
@@ -89,9 +89,8 @@ class SendBeaconHook : public AdminSocketHook {
8989
{
9090
LOG_PREFIX(AdminSocketHook::SendBeaconHook);
9191
DEBUG("");
92-
return osd.send_beacon().then([] {
93-
return seastar::make_ready_future<tell_result_t>();
94-
});
92+
co_await osd.send_beacon();
93+
co_return tell_result_t();
9594
}
9695
private:
9796
crimson::osd::OSD& osd;
@@ -137,7 +136,7 @@ class RunOSDBenchHook : public AdminSocketHook {
137136
INFO("block 'size' values are capped at {}. If you wish to use"
138137
" a higher value, please adjust 'osd_bench_max_block_size'",
139138
byte_u_t(max_block_size));
140-
return seastar::make_ready_future<tell_result_t>(-EINVAL, "block size too large");
139+
co_return tell_result_t(-EINVAL, "block size too large");
141140
} else if (bsize < (1LL << 20)) {
142141
// entering the realm of small block sizes.
143142
// limit the count to a sane value, assuming a configurable amount of
@@ -147,7 +146,7 @@ class RunOSDBenchHook : public AdminSocketHook {
147146
if (count > max_count) {
148147
INFO("bench count {} > osd_bench_small_size_max_iops {}",
149148
count, max_count);
150-
return seastar::make_ready_future<tell_result_t>(-EINVAL, "count too large");
149+
co_return tell_result_t(-EINVAL, "count too large");
151150
}
152151
} else {
153152
// 1MB block sizes are big enough so that we get more stuff done.
@@ -167,31 +166,28 @@ class RunOSDBenchHook : public AdminSocketHook {
167166
" with a higher value if you wish to use a higher 'count'.",
168167
max_count, byte_u_t(bsize), local_conf()->osd_bench_small_size_max_iops,
169168
duration);
170-
return seastar::make_ready_future<tell_result_t>(-EINVAL, "count too large");
169+
co_return tell_result_t(-EINVAL, "count too large");
171170
}
172171
}
173172
if (osize && bsize > osize) {
174173
bsize = osize;
175174
}
176175

177-
return osd.run_bench(count, bsize, osize, onum).then(
178-
[format, bsize, count](double elapsed) {
179-
if (elapsed < 0) {
180-
return seastar::make_ready_future<tell_result_t>
181-
(elapsed, "bench failed with error");
182-
}
176+
auto elapsed = co_await osd.run_bench(count, bsize, osize, onum);
177+
if (elapsed < 0) {
178+
co_return tell_result_t(elapsed, "bench failed with error");
179+
}
183180

184-
unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
185-
f->open_object_section("osd_bench_results");
186-
f->dump_int("bytes_written", count);
187-
f->dump_int("blocksize", bsize);
188-
f->dump_float("elapsed_sec", elapsed);
189-
f->dump_float("bytes_per_sec", (elapsed > 0) ? count / elapsed : 0);
190-
f->dump_float("iops", (elapsed > 0) ? (count / elapsed) / bsize : 0);
191-
f->close_section();
192-
193-
return seastar::make_ready_future<tell_result_t>(std::move(f));
194-
});
181+
unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
182+
f->open_object_section("osd_bench_results");
183+
f->dump_int("bytes_written", count);
184+
f->dump_int("blocksize", bsize);
185+
f->dump_float("elapsed_sec", elapsed);
186+
f->dump_float("bytes_per_sec", (elapsed > 0) ? count / elapsed : 0);
187+
f->dump_float("iops", (elapsed > 0) ? (count / elapsed) / bsize : 0);
188+
f->close_section();
189+
190+
co_return std::move(f);
195191
}
196192
private:
197193
crimson::osd::OSD& osd;
@@ -219,7 +215,7 @@ class FlushPgStatsHook : public AdminSocketHook {
219215
uint64_t seq = osd.send_pg_stats();
220216
unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
221217
f->dump_unsigned("stat_seq", seq);
222-
return seastar::make_ready_future<tell_result_t>(std::move(f));
218+
co_return std::move(f);
223219
}
224220

225221
private:
@@ -244,21 +240,19 @@ class DumpPGStateHistory final: public AdminSocketHook {
244240
DEBUG("");
245241
std::unique_ptr<Formatter> fref{
246242
Formatter::create(format, "json-pretty", "json-pretty")};
247-
Formatter *f = fref.get();
248-
f->open_object_section("pgstate_history");
249-
f->open_array_section("pgs");
250-
return pg_shard_manager.for_each_pg([f](auto &pgid, auto &pg) {
243+
fref->open_object_section("pgstate_history");
244+
fref->open_array_section("pgs");
245+
co_await pg_shard_manager.for_each_pg([f = fref.get()](auto &pgid, auto &pg) {
251246
f->open_object_section("pg");
252247
f->dump_stream("pg") << pgid;
253248
const auto& peering_state = pg->get_peering_state();
254249
f->dump_string("currently", peering_state.get_current_state());
255250
peering_state.dump_history(f);
256251
f->close_section();
257-
}).then([fref=std::move(fref)]() mutable {
258-
fref->close_section();
259-
fref->close_section();
260-
return seastar::make_ready_future<tell_result_t>(std::move(fref));
261252
});
253+
fref->close_section();
254+
fref->close_section();
255+
co_return std::move(fref);
262256
}
263257

264258
private:
@@ -292,7 +286,7 @@ class DumpPerfCountersHook final: public AdminSocketHook {
292286

293287
crimson::common::local_perf_coll().dump_formatted(f.get(), false,
294288
select_labeled_t::unlabeled, logger, counter);
295-
return seastar::make_ready_future<tell_result_t>(std::move(f));
289+
co_return std::move(f);
296290
}
297291
};
298292
template std::unique_ptr<AdminSocketHook> make_asok_hook<DumpPerfCountersHook>();
@@ -318,10 +312,9 @@ class AssertAlwaysHook : public AdminSocketHook {
318312
DEBUG("");
319313
if (local_conf().get_val<bool>("debug_asok_assert_abort")) {
320314
ceph_assert_always(0);
321-
return seastar::make_ready_future<tell_result_t>();
315+
co_return tell_result_t();
322316
} else {
323-
return seastar::make_ready_future<tell_result_t>(
324-
tell_result_t{-EPERM, "configuration set to disallow asok assert"});
317+
co_return tell_result_t{-EPERM, "configuration set to disallow asok assert"};
325318
}
326319
}
327320
};
@@ -344,31 +337,27 @@ class DumpMetricsHook : public AdminSocketHook {
344337
LOG_PREFIX(AdminSocketHook::DumpMetricsHook);
345338
DEBUG("");
346339
std::unique_ptr<Formatter> fref{Formatter::create(format, "json-pretty", "json-pretty")};
347-
auto *f = fref.get();
348340
std::string prefix;
349341
cmd_getval(cmdmap, "group", prefix);
350-
f->open_object_section("metrics");
351-
f->open_array_section("metrics");
352-
return seastar::do_with(std::move(prefix), [f](auto &prefix) {
353-
return crimson::reactor_map_seq([f, &prefix] {
354-
for (const auto& [full_name, metric_family]: seastar::scollectd::get_value_map()) {
355-
if (!prefix.empty() && full_name.compare(0, prefix.size(), prefix) != 0) {
356-
continue;
357-
}
358-
for (const auto& [labels, metric] : metric_family) {
359-
if (metric && metric->is_enabled()) {
360-
f->open_object_section(""); // enclosed by array
361-
DumpMetricsHook::dump_metric_value(f, full_name, *metric, labels.labels());
362-
f->close_section();
363-
}
342+
fref->open_object_section("metrics");
343+
fref->open_array_section("metrics");
344+
co_await crimson::reactor_map_seq([f = fref.get(), &prefix] {
345+
for (const auto& [full_name, metric_family]: seastar::scollectd::get_value_map()) {
346+
if (!prefix.empty() && full_name.compare(0, prefix.size(), prefix) != 0) {
347+
continue;
348+
}
349+
for (const auto& [labels, metric] : metric_family) {
350+
if (metric && metric->is_enabled()) {
351+
f->open_object_section(""); // enclosed by array
352+
DumpMetricsHook::dump_metric_value(f, full_name, *metric, labels.labels());
353+
f->close_section();
364354
}
365355
}
366-
});
367-
}).then([fref = std::move(fref)]() mutable {
368-
fref->close_section();
369-
fref->close_section();
370-
return seastar::make_ready_future<tell_result_t>(std::move(fref));
356+
}
371357
});
358+
fref->close_section();
359+
fref->close_section();
360+
co_return std::move(fref);
372361
}
373362
private:
374363
using registered_metric = seastar::metrics::impl::registered_metric;
@@ -515,17 +504,15 @@ class InjectDataErrorHook : public AdminSocketHook {
515504
obj = test_ops_get_object_name(*shard_services.get_map(), cmdmap);
516505
} catch (const std::invalid_argument& e) {
517506
logger().info("error during data error injection: {}", e.what());
518-
return seastar::make_ready_future<tell_result_t>(-EINVAL,
519-
e.what());
507+
co_return tell_result_t(-EINVAL, e.what());
520508
}
521-
return shard_services.get_store().inject_data_error(obj).then([=] {
522-
logger().info("successfully injected data error for obj={}", obj);
523-
ceph::bufferlist bl;
524-
bl.append("ok"sv);
525-
return seastar::make_ready_future<tell_result_t>(0,
526-
std::string{}, // no err
527-
std::move(bl));
528-
});
509+
co_await shard_services.get_store().inject_data_error(obj);
510+
logger().info("successfully injected data error for obj={}", obj);
511+
ceph::bufferlist bl;
512+
bl.append("ok"sv);
513+
co_return tell_result_t(0,
514+
std::string{}, // no err
515+
std::move(bl));
529516
}
530517

531518
private:
@@ -559,17 +546,15 @@ class InjectMDataErrorHook : public AdminSocketHook {
559546
obj = test_ops_get_object_name(*shard_services.get_map(), cmdmap);
560547
} catch (const std::invalid_argument& e) {
561548
logger().info("error during metadata error injection: {}", e.what());
562-
return seastar::make_ready_future<tell_result_t>(-EINVAL,
563-
e.what());
549+
co_return tell_result_t(-EINVAL, e.what());
564550
}
565-
return shard_services.get_store().inject_mdata_error(obj).then([=] {
566-
logger().info("successfully injected metadata error for obj={}", obj);
567-
ceph::bufferlist bl;
568-
bl.append("ok"sv);
569-
return seastar::make_ready_future<tell_result_t>(0,
570-
std::string{}, // no err
571-
std::move(bl));
572-
});
551+
co_await shard_services.get_store().inject_mdata_error(obj);
552+
logger().info("successfully injected metadata error for obj={}", obj);
553+
ceph::bufferlist bl;
554+
bl.append("ok"sv);
555+
co_return tell_result_t(0,
556+
std::string{}, // no err
557+
std::move(bl));
573558
}
574559

575560
private:
@@ -594,21 +579,17 @@ class DumpInFlightOpsHook : public AdminSocketHook {
594579
{
595580
LOG_PREFIX(AdminSocketHook::DumpInFlightOpsHook);
596581
DEBUG("");
597-
unique_ptr<Formatter> fref{
598-
Formatter::create(format, "json-pretty", "json-pretty")};
599-
auto *f = fref.get();
600-
f->open_object_section("ops_in_flight");
601-
f->open_array_section("ops_in_flight");
602-
return pg_shard_manager.when_active()
603-
.then([this, f, fref=std::move(fref)]() mutable {
604-
return pg_shard_manager.invoke_on_each_shard_seq([f](const auto &shard_services) {
582+
std::unique_ptr<Formatter> fref{Formatter::create(format, "json-pretty", "json-pretty")};
583+
fref->open_object_section("ops_in_flight");
584+
fref->open_array_section("ops_in_flight");
585+
co_await pg_shard_manager.when_active();
586+
co_await pg_shard_manager.invoke_on_each_shard_seq(
587+
[f = fref.get()](const auto &shard_services) {
605588
return shard_services.dump_ops_in_flight(f);
606-
}).then([fref=std::move(fref)]() mutable {
607-
fref->close_section();
608-
fref->close_section();
609-
return seastar::make_ready_future<tell_result_t>(std::move(fref));
610-
});
611589
});
590+
fref->close_section();
591+
fref->close_section();
592+
co_return std::move(fref);
612593
}
613594
private:
614595
const crimson::osd::PGShardManager &pg_shard_manager;
@@ -634,7 +615,7 @@ class DumpHistoricOpsHook : public AdminSocketHook {
634615
op_registry.dump_historic_client_requests(f.get());
635616
f->close_section();
636617
f->dump_int("num_ops", 0);
637-
return seastar::make_ready_future<tell_result_t>(std::move(f));
618+
co_return std::move(f);
638619
}
639620
private:
640621
const crimson::osd::OSDOperationRegistry& op_registry;
@@ -660,7 +641,7 @@ class DumpSlowestHistoricOpsHook : public AdminSocketHook {
660641
op_registry.dump_slowest_historic_client_requests(f.get());
661642
f->close_section();
662643
f->dump_int("num_ops", 0);
663-
return seastar::make_ready_future<tell_result_t>(std::move(f));
644+
co_return std::move(f);
664645
}
665646
private:
666647
const crimson::osd::OSDOperationRegistry& op_registry;
@@ -681,19 +662,15 @@ class DumpRecoveryReservationsHook : public AdminSocketHook {
681662
LOG_PREFIX(AdminSocketHook::DumpRecoveryReservationsHook);
682663
DEBUG("");
683664
unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
684-
return seastar::do_with(std::move(f), [this](auto&& f) {
685-
f->open_object_section("reservations");
686-
f->open_object_section("local_reservations");
687-
return shard_services.local_dump_reservations(f.get()).then([&f, this] {
688-
f->close_section();
689-
f->open_object_section("remote_reservations");
690-
return shard_services.remote_dump_reservations(f.get()).then([&f] {
691-
f->close_section();
692-
f->close_section();
693-
return seastar::make_ready_future<tell_result_t>(std::move(f));
694-
});
695-
});
696-
});
665+
f->open_object_section("reservations");
666+
f->open_object_section("local_reservations");
667+
co_await shard_services.local_dump_reservations(f.get());
668+
f->close_section();
669+
f->open_object_section("remote_reservations");
670+
co_await shard_services.remote_dump_reservations(f.get());
671+
f->close_section();
672+
f->close_section();
673+
co_return std::move(f);
697674
}
698675
private:
699676
crimson::osd::ShardServices& shard_services;

0 commit comments

Comments
 (0)