]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/osd: mark down connections of the new down osds
authorXuehan Xu <xuxuehan@qianxin.com>
Wed, 3 Jul 2024 14:00:39 +0000 (22:00 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Thu, 15 Aug 2024 03:05:43 +0000 (11:05 +0800)
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/osd/osd.cc

index 591c1aca0e4936d7aa3426e48e6da8bc2820757a..18a3afd676fb1be437e74df70230b07556def6fa 100644 (file)
@@ -1118,14 +1118,33 @@ seastar::future<> OSD::committed_osd_maps(
   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) &&