#include <fmt/format.h>
#include <fmt/ostream.h>
#include "common/pick_address.h"
+
+#include "messages/MOSDAlive.h"
#include "messages/MOSDBeacon.h"
#include "messages/MOSDBoot.h"
#include "messages/MOSDMap.h"
return monc->send_message(m);
}
+seastar::future<> OSD::_send_alive(epoch_t want)
+{
+ if (!osdmap->exists(whoami)) {
+ return seastar::now();
+ } else if (want <= up_thru_wanted){
+ return seastar::now();
+ } else {
+ up_thru_wanted = want;
+ auto m = make_message<MOSDAlive>(osdmap->get_epoch(), want);
+ return monc->send_message(std::move(m));
+ }
+}
+
seastar::future<> OSD::stop()
{
logger().info("stop");
return advance_pg_to(pg->second, osdmap->get_epoch()).then(
[pg, evt=std::move(evt)]() mutable {
return pg->second->do_peering_event(std::move(evt));
- });
+ }).then([pg=pg->second, this] {
+ return _send_alive(pg->get_need_up_thru());
+ });
} else {
// todo: handle_pg_query_nopg()
return seastar::now();
seastar::future<Ref<PG>> load_pg(spg_t pgid);
seastar::future<> load_pgs();
+ epoch_t up_thru_wanted = 0;
+ seastar::future<> _send_alive(epoch_t want);
+
// OSDMapService methods
seastar::future<cached_map_t> get_map(epoch_t e) override;
cached_map_t get_map() const override;
#include "crimson/os/cyan_store.h"
#include "crimson/osd/pg_meta.h"
+namespace {
+ seastar::logger& logger() {
+ return ceph::get_logger(ceph_subsys_osd);
+ }
+}
PG::PG(spg_t pgid,
pg_shard_t pg_shard,
last_peering_reset = get_osdmap_epoch();
}
+epoch_t PG::get_need_up_thru() const
+{
+ return need_up_thru;
+}
+
+void PG::update_need_up_thru(const OSDMap* o)
+{
+ if (!o) {
+ o = osdmap.get();
+ }
+ if (auto up_thru = o->get_up_thru(whoami.osd);
+ up_thru < info.history.same_interval_since) {
+ logger().info("up_thru {} < same_since {}, must notify monitor",
+ up_thru, info.history.same_interval_since);
+ need_up_thru = info.history.same_interval_since;
+ } else {
+ logger().info("up_thru {} >= same_since {}, all is well",
+ up_thru, info.history.same_interval_since);
+ need_up_thru = 0;
+ }
+}
+
seastar::future<> PG::do_peering_event(std::unique_ptr<PGPeeringEvent> evt)
{
// todo
pg_shard_t get_whoami() const;
epoch_t get_last_peering_reset() const;
void update_last_peering_reset();
+ epoch_t get_need_up_thru() const;
+ void update_need_up_thru(const OSDMap* o = nullptr);
seastar::future<> read_state(ceph::os::CyanStore* store);
pg_pool_t pool;
epoch_t last_peering_reset = 0;
+ epoch_t need_up_thru = 0;
+
//< pg state
pg_info_t info;
//< last written info, for fast info persistence