#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;
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