]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: OSDBeacon to report lec
authorMatan Breizman <mbreizma@redhat.com>
Sun, 12 Nov 2023 13:31:40 +0000 (13:31 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Wed, 29 Nov 2023 09:24:06 +0000 (09:24 +0000)
See: https://github.com/ceph/ceph/pull/14504

Signed-off-by: Matan Breizman <mbreizma@redhat.com>
src/crimson/mgr/client.h
src/crimson/osd/osd.cc
src/crimson/osd/osd.h
src/crimson/osd/shard_services.cc
src/crimson/osd/shard_services.h

index 501949768dddf89172a01f02443f3f09ead92919..b88c60c5e4a47aa156d559f40e83e810694785bc 100644 (file)
@@ -24,7 +24,7 @@ namespace crimson::mgr
 // implement WithStats if you want to report stats to mgr periodically
 class WithStats {
 public:
-  virtual seastar::future<MessageURef> get_stats() const = 0;
+  virtual seastar::future<MessageURef> get_stats() = 0;
   virtual ~WithStats() {}
 };
 
index 2ff907a79362ca4183fde8a17a94f1936d7b029d..1b574abd8fa386239a9ee4a369aa3baa5d90e753 100644 (file)
@@ -883,13 +883,20 @@ void OSD::update_stats()
   });
 }
 
-seastar::future<MessageURef> OSD::get_stats() const
+seastar::future<MessageURef> OSD::get_stats()
 {
   // 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;
   return pg_shard_manager.get_pg_stats(
-  ).then([m=std::move(m)](auto &&stats) mutable {
+  ).then([this, m=std::move(m)](auto &&stats) mutable {
+    min_last_epoch_clean = osdmap->get_epoch();
+    min_last_epoch_clean_pgs.clear();
+    for (auto [pgid, stat] : stats) {
+      min_last_epoch_clean = std::min(min_last_epoch_clean,
+                                      stat.get_effective_last_epoch_clean());
+      min_last_epoch_clean_pgs.push_back(pgid);
+    }
     m->pg_stat = std::move(stats);
     return seastar::make_ready_future<MessageURef>(std::move(m));
   });
@@ -1283,14 +1290,13 @@ seastar::future<> OSD::send_beacon()
   if (!pg_shard_manager.is_active()) {
     return seastar::now();
   }
-  // FIXME: min lec should be calculated from pg_stat
-  //        and should set m->pgs
-  epoch_t min_last_epoch_clean = osdmap->get_epoch();
-  auto m = crimson::make_message<MOSDBeacon>(osdmap->get_epoch(),
+  auto beacon = crimson::make_message<MOSDBeacon>(osdmap->get_epoch(),
                                     min_last_epoch_clean,
                                     superblock.last_purged_snaps_scrub,
                                     local_conf()->osd_beacon_report_interval);
-  return monc->send_message(std::move(m));
+  beacon->pgs = min_last_epoch_clean_pgs;
+  logger().debug("{} {}", __func__, *beacon);
+  return monc->send_message(std::move(beacon));
 }
 
 seastar::future<> OSD::update_heartbeat_peers()
index 10ff60d47017fa0ac3d5969387f2e44582905393..8125e89fbaf1c6468413cf50b4541f4bf44709c8 100644 (file)
@@ -106,8 +106,11 @@ class OSD final : public crimson::net::Dispatcher,
   // pg statistics including osd ones
   osd_stat_t osd_stat;
   uint32_t osd_stat_seq = 0;
+  epoch_t min_last_epoch_clean = 0;
+  // which pgs were scanned for min_lec
+  std::vector<pg_t> min_last_epoch_clean_pgs;
   void update_stats();
-  seastar::future<MessageURef> get_stats() const final;
+  seastar::future<MessageURef> get_stats() final;
 
   // AuthHandler methods
   void handle_authentication(const EntityName& name,
index c73613dd98880faaba4e6eab876d5543cc22635e..e81c96562ca6e13c9c5cb312825c5215ed9a86a6 100644 (file)
@@ -72,7 +72,7 @@ seastar::future<> PerShardState::stop_pgs()
     });
 }
 
-std::map<pg_t, pg_stat_t> PerShardState::get_pg_stats() const
+std::map<pg_t, pg_stat_t> PerShardState::get_pg_stats()
 {
   assert_core();
   std::map<pg_t, pg_stat_t> ret;
index 51720d706ebe79034b92af277ddbbb444ae97067..37993a4f67950fd1244435a8435e9a563f7dc858 100644 (file)
@@ -119,7 +119,7 @@ class PerShardState {
   PGMap pg_map;
 
   seastar::future<> stop_pgs();
-  std::map<pg_t, pg_stat_t> get_pg_stats() const;
+  std::map<pg_t, pg_stat_t> get_pg_stats();
   seastar::future<> broadcast_map_to_pgs(
     ShardServices &shard_services,
     epoch_t epoch);