]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/.../pg_shard_manager: add start_pg_operation_active
authorSamuel Just <sjust@redhat.com>
Tue, 25 Mar 2025 21:02:03 +0000 (21:02 +0000)
committerSamuel Just <sjust@redhat.com>
Mon, 28 Apr 2025 21:19:15 +0000 (21:19 +0000)
Messages between OSDs for PGs that have already completed peering
require fewer checks than otherwise.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/osd/pg_shard_manager.h

index f7bd7a6c08e30f6cb4c861ebcd70e9acb83da515..d492b0184afa475f94eaa4f5d564496913508037 100644 (file)
@@ -7,6 +7,8 @@
 #include <seastar/core/shared_future.hh>
 #include <seastar/core/sharded.hh>
 
+#include "crimson/common/log.h"
+
 #include "crimson/osd/osd_connection_priv.h"
 #include "crimson/osd/shard_services.h"
 #include "crimson/osd/pg_map.h"
@@ -432,6 +434,48 @@ public:
     return std::make_pair(id, std::move(fut));
   }
 
+  template <typename T, typename... Args>
+  auto start_pg_operation_active(Args&&... args) {
+    LOG_PREFIX(PGShardManager::start_pg_operation_active);
+    auto op = get_local_state().registry.create_operation<T>(
+      std::forward<Args>(args)...);
+    SUBDEBUG(osd, "{} starting", *op);
+
+    auto &opref = *op;
+    if constexpr (T::is_trackable) {
+      op->template track_event<typename T::StartEvent>();
+    }
+
+    auto core = get_pg_to_shard_mapping().get_pg_mapping(opref.get_pgid());
+    if (core == NULL_CORE) {
+      // PG target has been removed, there *must* have been an interval change
+      SUBDEBUG(
+       osd,
+       "{} no core mapping for pg {} found, must be from a prior interval",
+       opref, opref.get_pgid());
+      return seastar::now();
+    }
+
+    return this->template with_remote_shard_state_and_op<T>(
+      core, std::move(op),
+      [FNAME](ShardServices &target_shard_services,
+                   typename T::IRef op) {
+        auto &opref = *op;
+       auto pg = target_shard_services.get_pg(
+         opref.get_pgid());
+       if (!pg) {
+         SUBDEBUG(
+           osd,
+           "{} pg {} not present, must be from prior interval",
+           opref, opref.get_pgid());
+         return seastar::now();
+       }
+       return op->with_pg(
+         target_shard_services, pg
+       ).finally([op] {});
+      });
+  }
+
 #undef FORWARD
 #undef FORWARD_CONST
 #undef FORWARD_TO_OSD_SINGLETON