1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
7 #include <seastar/core/future.hh>
9 #include "crimson/osd/osd_operation.h"
10 #include "osd/osd_types.h"
11 #include "osd/PGPeeringEvent.h"
12 #include "osd/PeeringState.h"
18 namespace crimson::osd
{
24 class PeeringEvent
: public OperationT
<PeeringEvent
> {
26 static constexpr OperationTypeCode type
= OperationTypeCode::peering_event
;
29 OrderedExclusivePhase await_map
= {
30 "PeeringEvent::PGPipeline::await_map"
32 OrderedExclusivePhase process
= {
33 "PeeringEvent::PGPipeline::process"
35 friend class PeeringEvent
;
36 friend class PGAdvanceMap
;
40 PipelineHandle handle
;
41 PGPipeline
&pp(PG
&pg
);
43 ShardServices
&shard_services
;
50 const pg_shard_t
get_from() const {
54 const spg_t
get_pgid() const {
58 const PGPeeringEvent
&get_event() const {
62 virtual void on_pg_absent();
63 virtual PeeringEvent::interruptible_future
<> complete_rctx(Ref
<PG
>);
64 virtual seastar::future
<> complete_rctx_no_pg() { return seastar::now();}
65 virtual seastar::future
<Ref
<PG
>> get_pg() = 0;
68 template <typename
... Args
>
70 ShardServices
&shard_services
, const pg_shard_t
&from
, const spg_t
&pgid
,
72 shard_services(shard_services
),
75 evt(std::forward
<Args
>(args
)...)
77 template <typename
... Args
>
79 ShardServices
&shard_services
, const pg_shard_t
&from
, const spg_t
&pgid
,
80 float delay
, Args
&&... args
) :
81 shard_services(shard_services
),
85 evt(std::forward
<Args
>(args
)...)
88 void print(std::ostream
&) const final
;
89 void dump_detail(ceph::Formatter
* f
) const final
;
90 seastar::future
<> start();
93 class RemotePeeringEvent
: public PeeringEvent
{
96 crimson::net::ConnectionRef conn
;
98 void on_pg_absent() final
;
99 PeeringEvent::interruptible_future
<> complete_rctx(Ref
<PG
> pg
) override
;
100 seastar::future
<> complete_rctx_no_pg() override
;
101 seastar::future
<Ref
<PG
>> get_pg() final
;
105 OrderedExclusivePhase await_active
= {
106 "PeeringRequest::OSDPipeline::await_active"
108 friend class RemotePeeringEvent
;
110 class ConnectionPipeline
{
111 OrderedExclusivePhase await_map
= {
112 "PeeringRequest::ConnectionPipeline::await_map"
114 OrderedExclusivePhase get_pg
= {
115 "PeeringRequest::ConnectionPipeline::get_pg"
117 friend class RemotePeeringEvent
;
120 template <typename
... Args
>
121 RemotePeeringEvent(OSD
&osd
, crimson::net::ConnectionRef conn
, Args
&&... args
) :
122 PeeringEvent(std::forward
<Args
>(args
)...),
128 ConnectionPipeline
&cp();
132 class LocalPeeringEvent final
: public PeeringEvent
{
134 seastar::future
<Ref
<PG
>> get_pg() final
;
139 template <typename
... Args
>
140 LocalPeeringEvent(Ref
<PG
> pg
, Args
&&... args
) :
141 PeeringEvent(std::forward
<Args
>(args
)...),
145 virtual ~LocalPeeringEvent();