]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: make OSD::osd_stat compliant with multi-core
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 9 May 2024 09:44:56 +0000 (09:44 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Jan 2026 14:47:44 +0000 (14:47 +0000)
The EC recovery backend needs `inc_osd_stat_repaired()`.

Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/admin/osd_admin.cc
src/crimson/osd/osd.cc
src/crimson/osd/osd.h
src/crimson/osd/pg_shard_manager.h
src/crimson/osd/shard_services.cc
src/crimson/osd/shard_services.h

index 8e73180edb07bdead58a252f9aaf4f9b4cc0db5e..19b1891ffe861c5630137f404a0f7b34c4c59e94 100644 (file)
@@ -209,14 +209,15 @@ public:
   {}
   seastar::future<tell_result_t> call(const cmdmap_t&,
                                      std::string_view format,
-                                     ceph::bufferlist&& input) const final
+                                     ceph::bufferlist&&) const final
   {
     LOG_PREFIX(AdminSocketHook::FlushPgStatsHook);
     DEBUG("");
-    uint64_t seq = osd.send_pg_stats();
-    unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
-    f->dump_unsigned("stat_seq", seq);
-    co_return std::move(f);
+    return osd.send_pg_stats().then([format](uint64_t seq) {
+      unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
+      f->dump_unsigned("stat_seq", seq);
+      return seastar::make_ready_future<tell_result_t>(std::move(f));
+    });
   }
 
 private:
index 749b98bd59d9baf9dd4eab3d93e7e29a7de05272..8002e9db8e28ec8b3e62b87d4e3e279f8cf431bb 100644 (file)
@@ -1083,26 +1083,25 @@ void OSD::handle_conf_change(
 
 void OSD::update_stats()
 {
-  osd_stat_seq++;
-  osd_stat.up_from = get_shard_services().get_up_epoch();
-  osd_stat.hb_peers = heartbeat->get_peers();
-  osd_stat.seq = (
-    static_cast<uint64_t>(get_shard_services().get_up_epoch()) << 32
-  ) | osd_stat_seq;
   gate.dispatch_in_background("statfs", *this, [this] {
-    (void) store.stat().then([this](store_statfs_t&& st) {
-      osd_stat.statfs = st;
+    return store.stat().then([this](store_statfs_t&& st) {
+      return get_shard_services().update_osd_stat(
+        get_shard_services().get_up_epoch(),
+        heartbeat->get_peers(),
+        st);
     });
   });
+
 }
 
 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([this, m=std::move(m)](auto &&stats) mutable {
+  return get_shard_services().get_osd_stat().then([this, m=m.get()](auto&& osd_stat) {
+    m->osd_stat = std::move(osd_stat);
+    return pg_shard_manager.get_pg_stats();
+  }).then([this, m=std::move(m)](auto &&stats) mutable {
     min_last_epoch_clean = osdmap->get_epoch();
     min_last_epoch_clean_pgs.clear();
     std::set<int64_t> pool_set;
@@ -1138,11 +1137,13 @@ seastar::future<MessageURef> OSD::get_stats()
   });
 }
 
-uint64_t OSD::send_pg_stats()
+seastar::future<uint64_t> OSD::send_pg_stats()
 {
-  // mgr client sends the report message in background
-  mgrc->report();
-  return osd_stat.seq;
+  return get_shard_services().get_osd_stat().then([this](auto&& osd_stat) {
+    // mgr client sends the report message in background
+    mgrc->report();
+    return osd_stat.seq;
+  });
 }
 
 seastar::future<> OSD::handle_osd_map(Ref<MOSDMap> m)
index e26af63b170139955c5bbbd6ae2741b37a76d5c1..730336e6bff99bad5ad2acb2f25dd42b538c3c3a 100644 (file)
@@ -106,8 +106,6 @@ class OSD final : public crimson::net::Dispatcher,
 
   // mgr::WithStats methods
   // 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;
@@ -172,7 +170,7 @@ public:
   void print(std::ostream&) const;
 
   /// @return the seq id of the pg stats being sent
-  uint64_t send_pg_stats();
+  seastar::future<uint64_t> send_pg_stats();
 
   auto &get_shard_services() {
     return shard_services.local();
index f0f4cbc9b25420019a7b9badfe5d9b9d32e2374c..01b0cde75c41bf271763cafe19320c260d87311d 100644 (file)
@@ -138,6 +138,9 @@ public:
   FORWARD_TO_OSD_SINGLETON(store_maps)
   FORWARD_TO_OSD_SINGLETON(trim_maps)
 
+  // osd stats
+  FORWARD_TO_OSD_SINGLETON(get_osd_stat)
+
   seastar::future<> set_up_epoch(epoch_t e);
 
   seastar::future<> set_superblock(OSDSuperblock superblock);
index 9f54d657ae81a49d8aaef1fdb6343a843fb520c7..ae73c2c9f13ac1a8519ef665e96ec04861e53034 100644 (file)
@@ -928,4 +928,17 @@ seastar::future<> OSDSingletonState::send_incremental_map_to_osd(
   }
 }
 
+void OSDSingletonState::update_osd_stat(
+  epoch_t up_epoch,
+  const Heartbeat::osds_t& peers,
+  const store_statfs_t& st)
+{
+  osd_stat_seq++;
+  osd_stat.up_from = up_epoch;
+  osd_stat.hb_peers = peers;
+  osd_stat.statfs = st;
+  osd_stat.seq = (static_cast<uint64_t>(up_epoch) << 32
+  ) | osd_stat_seq;
+}
+
 };
index 8689a7da49a58dc89fa5de56a526cd44f82a9a09..2df9b47e4947c376a38ec5db24b008741279167e 100644 (file)
@@ -17,6 +17,7 @@
 #include "crimson/os/futurized_collection.h"
 #include "osd/PeeringState.h"
 #include "crimson/common/log.h"
+#include "crimson/osd/heartbeat.h"
 #include "crimson/osd/osdmap_service.h"
 #include "crimson/osd/osdmap_gate.h"
 #include "crimson/osd/osd_meta.h"
@@ -272,6 +273,19 @@ private:
 
   crimson::mgr::Client &mgrc;
 
+  osd_stat_t osd_stat;
+  uint32_t osd_stat_seq = 0;
+  osd_stat_t get_osd_stat() {
+    return osd_stat;
+  }
+  void update_osd_stat(
+    epoch_t up_epoch,
+    const Heartbeat::osds_t& peers,
+    const store_statfs_t& st);
+  void inc_osd_stat_repaired() {
+    osd_stat.num_shards_repaired++;
+  }
+
   std::unique_ptr<OSDMeta> meta_coll;
   template <typename... Args>
   void init_meta_coll(Args&&... args) {
@@ -626,6 +640,9 @@ public:
   QUEUE_FOR_OSD_SINGLETON(send_pg_created)
   QUEUE_FOR_OSD_SINGLETON(send_alive)
   QUEUE_FOR_OSD_SINGLETON(send_pg_temp)
+  FORWARD_TO_OSD_SINGLETON(get_osd_stat)
+  FORWARD_TO_OSD_SINGLETON(update_osd_stat)
+  FORWARD_TO_OSD_SINGLETON(inc_osd_stat_repaired)
   FORWARD_TO_LOCAL_CONST(get_mnow)
   FORWARD_TO_LOCAL(get_hb_stamps)
   FORWARD_TO_LOCAL(update_shard_superblock)