ceph_assert(seastar::this_shard_id() == PRIMARY_CORE);
INFO("osd.{} ({}, {})", whoami, first, last);
// advance through the new maps
+ auto old_map = osdmap;
return seastar::do_for_each(boost::make_counting_iterator(first),
boost::make_counting_iterator(last + 1),
- [this](epoch_t cur) {
+ [this, old_map, FNAME](epoch_t cur) {
return pg_shard_manager.get_local_map(
cur
- ).then([this](OSDMapService::local_cached_map_t&& o) {
+ ).then([this, old_map, FNAME](OSDMapService::local_cached_map_t&& o) {
osdmap = make_local_shared_foreign(OSDMapService::local_cached_map_t(o));
- return pg_shard_manager.update_map(std::move(o));
+ std::set<int> old_osds;
+ old_map->get_all_osds(old_osds);
+ return seastar::parallel_for_each(
+ old_osds,
+ [this, FNAME, old_map](auto &osd_id) {
+ DEBUG("osd.{}: whoami ? {}, old up ? {} , now down ? {}",
+ osd_id, osd_id != whoami,
+ old_map->is_up(osd_id), osdmap->is_down(osd_id));
+ if (osd_id != whoami &&
+ old_map->is_up(osd_id) &&
+ osdmap->is_down(osd_id)) {
+ DEBUG("osd.{}: mark osd.{} down", whoami, osd_id);
+ return cluster_msgr->mark_down(
+ osdmap->get_cluster_addrs(osd_id).front());
+ }
+ return seastar::now();
+ }).then([this, o=std::move(o)]() mutable {
+ return pg_shard_manager.update_map(std::move(o));
+ });
}).then([this] {
if (get_shard_services().get_up_epoch() == 0 &&
osdmap->is_up(whoami) &&