]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/crimson/osd/osd_operations/replicated_request.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / crimson / osd / osd_operations / replicated_request.h
index 17e9e537944761ec40da12c4e37f4dcba750b1d8..78d97ecf439fa0d85cd3f332ec39ed0fd64df109 100644 (file)
@@ -4,10 +4,12 @@
 #pragma once
 
 #include "crimson/net/Connection.h"
+#include "crimson/osd/osdmap_gate.h"
 #include "crimson/osd/osd_operation.h"
+#include "crimson/osd/pg_map.h"
+#include "crimson/osd/osd_operations/client_request.h"
 #include "crimson/common/type_helpers.h"
-
-class MOSDRepOp;
+#include "messages/MOSDRepOp.h"
 
 namespace ceph {
   class Formatter;
@@ -15,44 +17,64 @@ namespace ceph {
 
 namespace crimson::osd {
 
+class ShardServices;
+
 class OSD;
 class PG;
 
-class RepRequest final : public OperationT<RepRequest> {
+class RepRequest final : public PhasedOperationT<RepRequest> {
 public:
-  class ConnectionPipeline {
-    OrderedExclusivePhase await_map = {
-      "RepRequest::ConnectionPipeline::await_map"
-    };
-    OrderedExclusivePhase get_pg = {
-      "RepRequest::ConnectionPipeline::get_pg"
-    };
-    friend RepRequest;
-  };
-  class PGPipeline {
-    OrderedExclusivePhase await_map = {
-      "RepRequest::PGPipeline::await_map"
-    };
-    OrderedExclusivePhase process = {
-      "RepRequest::PGPipeline::process"
-    };
-    friend RepRequest;
-  };
   static constexpr OperationTypeCode type = OperationTypeCode::replicated_request;
-  RepRequest(OSD&, crimson::net::ConnectionRef&&, Ref<MOSDRepOp>&&);
+  RepRequest(crimson::net::ConnectionRef&&, Ref<MOSDRepOp>&&);
 
   void print(std::ostream &) const final;
   void dump_detail(ceph::Formatter* f) const final;
-  seastar::future<> start();
+
+  static constexpr bool can_create() { return false; }
+  spg_t get_pgid() const {
+    return req->get_spg();
+  }
+  PipelineHandle &get_handle() { return handle; }
+  epoch_t get_epoch() const { return req->get_min_epoch(); }
+
+  ConnectionPipeline &get_connection_pipeline();
+  seastar::future<crimson::net::ConnectionFRef> prepare_remote_submission() {
+    assert(conn);
+    return conn.get_foreign(
+    ).then([this](auto f_conn) {
+      conn.reset();
+      return f_conn;
+    });
+  }
+  void finish_remote_submission(crimson::net::ConnectionFRef _conn) {
+    assert(!conn);
+    conn = make_local_shared_foreign(std::move(_conn));
+  }
+
+  seastar::future<> with_pg(
+    ShardServices &shard_services, Ref<PG> pg);
+
+  std::tuple<
+    StartEvent,
+    ConnectionPipeline::AwaitActive::BlockingEvent,
+    ConnectionPipeline::AwaitMap::BlockingEvent,
+    ConnectionPipeline::GetPG::BlockingEvent,
+    ClientRequest::PGPipeline::AwaitMap::BlockingEvent,
+    PG_OSDMapGate::OSDMapBlocker::BlockingEvent,
+    PGMap::PGCreationBlockingEvent,
+    OSD_OSDMapGate::OSDMapBlocker::BlockingEvent
+  > tracking_events;
 
 private:
-  ConnectionPipeline &cp();
-  PGPipeline &pp(PG &pg);
+  ClientRequest::PGPipeline &pp(PG &pg);
 
-  OSD &osd;
   crimson::net::ConnectionRef conn;
-  Ref<MOSDRepOp> req;
   PipelineHandle handle;
+  Ref<MOSDRepOp> req;
 };
 
 }
+
+#if FMT_VERSION >= 90000
+template <> struct fmt::formatter<crimson::osd::RepRequest> : fmt::ostream_formatter {};
+#endif