// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #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" #include "messages/MOSDRepOp.h" namespace ceph { class Formatter; } namespace crimson::osd { class ShardServices; class OSD; class PG; class RepRequest final : public PhasedOperationT { public: static constexpr OperationTypeCode type = OperationTypeCode::replicated_request; RepRequest(crimson::net::ConnectionRef&&, Ref&&); void print(std::ostream &) const final; void dump_detail(ceph::Formatter* f) const final; 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 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); 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: ClientRequest::PGPipeline &client_pp(PG &pg); crimson::net::ConnectionRef conn; PipelineHandle handle; Ref req; }; } #if FMT_VERSION >= 90000 template <> struct fmt::formatter : fmt::ostream_formatter {}; #endif