]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd/heartbeat: share osdmap to peers when necessary
authorXuehan Xu <xxhdx1985126@gmail.com>
Thu, 23 Feb 2023 06:50:56 +0000 (06:50 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Thu, 27 Apr 2023 16:08:11 +0000 (16:08 +0000)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
src/crimson/osd/heartbeat.cc
src/crimson/osd/heartbeat.h
src/crimson/osd/shard_services.cc
src/crimson/osd/shard_services.h

index 94b3d688627bcefdea7f4c40d83595aebba4b112..eb476f715da7107db882b140b2a430e8cc78c1c0 100644 (file)
@@ -30,7 +30,7 @@ namespace {
 }
 
 Heartbeat::Heartbeat(osd_id_t whoami,
-                     const crimson::osd::ShardServices& service,
+                     crimson::osd::ShardServices& service,
                      crimson::mon::Client& monc,
                      crimson::net::Messenger &front_msgr,
                      crimson::net::Messenger &back_msgr)
@@ -292,7 +292,28 @@ seastar::future<> Heartbeat::handle_ping(crimson::net::ConnectionRef conn,
       service.get_mnow(),
       service.get_up_epoch(),
       min_message);
-  return conn->send(std::move(reply));
+  return conn->send(std::move(reply)
+  ).then([this, m, conn] {
+    return maybe_share_osdmap(conn, m);
+  });
+}
+
+seastar::future<> Heartbeat::maybe_share_osdmap(
+  crimson::net::ConnectionRef conn,
+  Ref<MOSDPing> m)
+{
+  const osd_id_t from = m->get_source().num();
+  const epoch_t osdmap_epoch = service.get_map()->get_epoch();
+  logger().info("{} peer id: {} epoch is {} while osdmap is {}",
+                __func__ , from, m->map_epoch, osdmap_epoch);
+  if (osdmap_epoch > m->map_epoch) {
+    logger().debug("{} sharing osdmap epoch of {} with peer id {}",
+                   __func__, osdmap_epoch, from);
+    // Peer's newest map is m->map_epoch. Therfore it misses
+    // the osdmaps in the range of `m->map_epoch` to `osdmap_epoch`.
+    return service.send_incremental_map_to_osd(from, m->map_epoch);
+  }
+  return seastar::now();
 }
 
 seastar::future<> Heartbeat::handle_reply(crimson::net::ConnectionRef conn,
@@ -305,7 +326,10 @@ seastar::future<> Heartbeat::handle_reply(crimson::net::ConnectionRef conn,
     return seastar::now();
   }
   auto& peer = found->second;
-  return peer.handle_reply(conn, m);
+  return peer.handle_reply(conn, m
+  ).then([this, conn, m] {
+    return maybe_share_osdmap(conn, m);
+  });
 }
 
 seastar::future<> Heartbeat::handle_you_died()
index 2d9cd8b2435f145d7cb2616e7087fc0854e013da..12c750b076231c22630008a044471ba11c6c6677 100644 (file)
@@ -27,7 +27,7 @@ public:
   using osd_id_t = int;
 
   Heartbeat(osd_id_t whoami,
-            const crimson::osd::ShardServices& service,
+           crimson::osd::ShardServices& service,
            crimson::mon::Client& monc,
            crimson::net::Messenger &front_msgr,
            crimson::net::Messenger &back_msgr);
@@ -73,9 +73,11 @@ private:
 
   seastar::future<> start_messenger(crimson::net::Messenger& msgr,
                                    const entity_addrvec_t& addrs);
+  seastar::future<> maybe_share_osdmap(crimson::net::ConnectionRef,
+                                       Ref<MOSDPing> m);
 private:
   const osd_id_t whoami;
-  const crimson::osd::ShardServices& service;
+  crimson::osd::ShardServices& service;
   crimson::mon::Client& monc;
   crimson::net::Messenger &front_msgr;
   crimson::net::Messenger &back_msgr;
index 31f9f9b1243506c629d81e50d62119006501b662..df5e4cf21cb6cacfcd6b03db27980e48977b795b 100644 (file)
@@ -730,6 +730,18 @@ seastar::future<> OSDSingletonState::send_incremental_map(
   }
 }
 
-
+seastar::future<> OSDSingletonState::send_incremental_map_to_osd(
+  int osd,
+  epoch_t first)
+{
+  if (osdmap->is_down(osd)) {
+    logger().info("{}: osd.{} is_down", __func__, osd);
+    return seastar::now();
+  } else {
+    auto conn = cluster_msgr.connect(
+      osdmap->get_cluster_addrs(osd).front(), CEPH_ENTITY_TYPE_OSD);
+    return send_incremental_map(*conn, first);
+  }
+}
 
 };
index 698f5ef0125e3e73ddf8dd62a6469c77a0f20d10..90a06bb90cc0cd43a7843d04a8468d17ed2f14de 100644 (file)
@@ -235,6 +235,8 @@ private:
     crimson::net::Connection &conn,
     epoch_t first);
 
+  seastar::future<> send_incremental_map_to_osd(int osd, epoch_t first);
+
   auto get_pool_info(int64_t poolid) {
     return get_meta_coll().load_final_pool_info(poolid);
   }
@@ -451,6 +453,7 @@ public:
   FORWARD(with_throttle_while, with_throttle_while, local_state.throttler)
 
   FORWARD_TO_OSD_SINGLETON(send_incremental_map)
+  FORWARD_TO_OSD_SINGLETON(send_incremental_map_to_osd)
 
   FORWARD_TO_OSD_SINGLETON(osdmap_subscribe)
   FORWARD_TO_OSD_SINGLETON(queue_want_pg_temp)