std::string_view format,
ceph::bufferlist&& input) const final
{
- std::unique_ptr<Formatter> f{Formatter::create(format,
- "json-pretty",
- "json-pretty")};
+ std::unique_ptr<Formatter> fref{Formatter::create(format,
+ "json-pretty",
+ "json-pretty")};
+ Formatter *f = fref.get();
f->open_object_section("pgstate_history");
- osd.dump_pg_state_history(f.get());
- f->close_section();
- return seastar::make_ready_future<tell_result_t>(std::move(f));
+ return osd.dump_pg_state_history(
+ f
+ ).then([fref=std::move(fref)]() mutable {
+ fref->close_section();
+ return seastar::make_ready_future<tell_result_t>(std::move(fref));
+ });
}
private:
const crimson::osd::OSD& osd;
*public_msgr, *monc, *mgrc, store},
shard_services{pg_shard_manager.get_shard_services()},
heartbeat{new Heartbeat{whoami, shard_services, *monc, hb_front_msgr, hb_back_msgr}},
- // do this in background
+ // do this in background -- continuation rearms timer when complete
tick_timer{[this] {
- update_heartbeat_peers();
- update_stats();
+ std::ignore = update_heartbeat_peers(
+ ).then([this] {
+ update_stats();
+ tick_timer.arm(
+ std::chrono::seconds(TICK_INTERVAL));
+ });
}},
asok{seastar::make_lw_shared<crimson::admin::AdminSocket>()},
log_client(cluster_msgr.get(), LogClient::NO_FLAGS),
f->dump_unsigned("num_pgs", pg_shard_manager.get_num_pgs());
}
-void OSD::dump_pg_state_history(Formatter* f) const
+seastar::future<> OSD::dump_pg_state_history(Formatter* f) const
{
f->open_array_section("pgs");
- pg_shard_manager.for_each_pg([f](auto &pgid, auto &pg) {
+ return pg_shard_manager.for_each_pg([f](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([f] {
+ f->close_section();
});
- f->close_section();
}
void OSD::print(std::ostream& out) const
});
}
-MessageURef OSD::get_stats() const
+seastar::future<MessageURef> OSD::get_stats() const
{
// MPGStats::had_map_for is not used since PGMonitor was removed
auto m = crimson::make_message<MPGStats>(monc->get_fsid(), osdmap->get_epoch());
m->osd_stat = osd_stat;
- m->pg_stat = pg_shard_manager.get_pg_stats();
- return m;
+ return pg_shard_manager.get_pg_stats(
+ ).then([m=std::move(m)](auto &&stats) mutable {
+ m->pg_stat = std::move(stats);
+ return seastar::make_ready_future<MessageURef>(std::move(m));
+ });
}
uint64_t OSD::send_pg_stats()
pg_shard_manager.set_active();
beacon_timer.arm_periodic(
std::chrono::seconds(local_conf()->osd_beacon_report_interval));
- tick_timer.arm_periodic(
+ // timer continuation rearms when complete
+ tick_timer.arm(
std::chrono::seconds(TICK_INTERVAL));
}
} else {
return monc->send_message(std::move(m));
}
-void OSD::update_heartbeat_peers()
+seastar::future<> OSD::update_heartbeat_peers()
{
if (!pg_shard_manager.is_active()) {
- return;
+ return seastar::now();;
}
- pg_shard_manager.for_each_pg([this](auto &pgid, auto &pg) {
+ return pg_shard_manager.for_each_pg([this](auto &pgid, auto &pg) {
vector<int> up, acting;
osdmap->pg_to_up_acting_osds(pgid.pgid,
&up, nullptr,
heartbeat->add_peer(osd, osdmap->get_epoch());
}
}
+ }).then([this] {
+ heartbeat->update_peers(whoami);
});
- heartbeat->update_peers(whoami);
}
seastar::future<> OSD::handle_peering_op(
osd_stat_t osd_stat;
uint32_t osd_stat_seq = 0;
void update_stats();
- MessageURef get_stats() const final;
+ seastar::future<MessageURef> get_stats() const final;
// AuthHandler methods
void handle_authentication(const EntityName& name,
seastar::future<> stop();
void dump_status(Formatter*) const;
- void dump_pg_state_history(Formatter*) const;
+ seastar::future<> dump_pg_state_history(Formatter*) const;
void print(std::ostream&) const;
seastar::future<> send_incremental_map(crimson::net::ConnectionRef conn,
bool should_restart() const;
seastar::future<> restart();
seastar::future<> shutdown();
- void update_heartbeat_peers();
+ seastar::future<> update_heartbeat_peers();
friend class PGAdvanceMap;
public: