]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
4 | #pragma once | |
5 | ||
11fdf7f2 | 6 | #include <seastar/core/future.hh> |
9f95a23c | 7 | #include <seastar/core/shared_future.hh> |
11fdf7f2 TL |
8 | #include <seastar/core/gate.hh> |
9 | #include <seastar/core/shared_ptr.hh> | |
9f95a23c | 10 | #include <seastar/core/shared_future.hh> |
11fdf7f2 TL |
11 | #include <seastar/core/timer.hh> |
12 | ||
20effc67 | 13 | #include "crimson/common/logclient.h" |
9f95a23c TL |
14 | #include "crimson/common/type_helpers.h" |
15 | #include "crimson/common/auth_handler.h" | |
f67539c2 | 16 | #include "crimson/common/gated.h" |
9f95a23c | 17 | #include "crimson/admin/admin_socket.h" |
11fdf7f2 TL |
18 | #include "crimson/common/simple_lru.h" |
19 | #include "crimson/common/shared_lru.h" | |
9f95a23c | 20 | #include "crimson/mgr/client.h" |
11fdf7f2 | 21 | #include "crimson/net/Dispatcher.h" |
11fdf7f2 TL |
22 | #include "crimson/osd/osdmap_service.h" |
23 | #include "crimson/osd/state.h" | |
9f95a23c TL |
24 | #include "crimson/osd/shard_services.h" |
25 | #include "crimson/osd/osdmap_gate.h" | |
26 | #include "crimson/osd/pg_map.h" | |
27 | #include "crimson/osd/osd_operations/peering_event.h" | |
11fdf7f2 | 28 | |
f67539c2 | 29 | #include "messages/MOSDOp.h" |
9f95a23c TL |
30 | #include "osd/PeeringState.h" |
31 | #include "osd/osd_types.h" | |
32 | #include "osd/osd_perf_counters.h" | |
33 | #include "osd/PGPeeringEvent.h" | |
11fdf7f2 | 34 | |
f67539c2 | 35 | class MCommand; |
11fdf7f2 | 36 | class MOSDMap; |
9f95a23c TL |
37 | class MOSDRepOpReply; |
38 | class MOSDRepOp; | |
f67539c2 | 39 | class MOSDScrub2; |
11fdf7f2 TL |
40 | class OSDMap; |
41 | class OSDMeta; | |
11fdf7f2 TL |
42 | class Heartbeat; |
43 | ||
9f95a23c TL |
44 | namespace ceph::os { |
45 | class Transaction; | |
46 | } | |
47 | ||
48 | namespace crimson::mon { | |
49 | class Client; | |
50 | } | |
51 | ||
52 | namespace crimson::net { | |
11fdf7f2 TL |
53 | class Messenger; |
54 | } | |
55 | ||
9f95a23c TL |
56 | namespace crimson::os { |
57 | class FuturizedStore; | |
11fdf7f2 TL |
58 | } |
59 | ||
9f95a23c TL |
60 | namespace crimson::osd { |
61 | class PG; | |
11fdf7f2 | 62 | |
9f95a23c TL |
63 | class OSD final : public crimson::net::Dispatcher, |
64 | private OSDMapService, | |
65 | private crimson::common::AuthHandler, | |
66 | private crimson::mgr::WithStats { | |
11fdf7f2 TL |
67 | const int whoami; |
68 | const uint32_t nonce; | |
69 | seastar::timer<seastar::lowres_clock> beacon_timer; | |
70 | // talk with osd | |
9f95a23c | 71 | crimson::net::MessengerRef cluster_msgr; |
11fdf7f2 | 72 | // talk with client/mon/mgr |
9f95a23c | 73 | crimson::net::MessengerRef public_msgr; |
9f95a23c TL |
74 | std::unique_ptr<crimson::mon::Client> monc; |
75 | std::unique_ptr<crimson::mgr::Client> mgrc; | |
11fdf7f2 TL |
76 | |
77 | SharedLRU<epoch_t, OSDMap> osdmaps; | |
78 | SimpleLRU<epoch_t, bufferlist, false> map_bl_cache; | |
79 | cached_map_t osdmap; | |
80 | // TODO: use a wrapper for ObjectStore | |
20effc67 | 81 | crimson::os::FuturizedStore& store; |
11fdf7f2 TL |
82 | std::unique_ptr<OSDMeta> meta_coll; |
83 | ||
11fdf7f2 TL |
84 | OSDState state; |
85 | ||
86 | /// _first_ epoch we were marked up (after this process started) | |
87 | epoch_t boot_epoch = 0; | |
88 | /// _most_recent_ epoch we were marked up | |
89 | epoch_t up_epoch = 0; | |
90 | //< epoch we last did a bind to new ip:ports | |
91 | epoch_t bind_epoch = 0; | |
92 | //< since when there is no more pending pg creates from mon | |
93 | epoch_t last_pg_create_epoch = 0; | |
94 | ||
9f95a23c TL |
95 | ceph::mono_time startup_time; |
96 | ||
11fdf7f2 TL |
97 | OSDSuperblock superblock; |
98 | ||
99 | // Dispatcher methods | |
f67539c2 TL |
100 | std::optional<seastar::future<>> ms_dispatch(crimson::net::ConnectionRef, MessageRef) final; |
101 | void ms_handle_reset(crimson::net::ConnectionRef conn, bool is_replace) final; | |
102 | void ms_handle_remote_reset(crimson::net::ConnectionRef conn) final; | |
9f95a23c TL |
103 | |
104 | // mgr::WithStats methods | |
f67539c2 TL |
105 | // pg statistics including osd ones |
106 | osd_stat_t osd_stat; | |
107 | uint32_t osd_stat_seq = 0; | |
108 | void update_stats(); | |
20effc67 | 109 | MessageURef get_stats() const final; |
9f95a23c TL |
110 | |
111 | // AuthHandler methods | |
112 | void handle_authentication(const EntityName& name, | |
113 | const AuthCapsInfo& caps) final; | |
114 | ||
115 | crimson::osd::ShardServices shard_services; | |
116 | ||
117 | std::unique_ptr<Heartbeat> heartbeat; | |
f67539c2 | 118 | seastar::timer<seastar::lowres_clock> tick_timer; |
9f95a23c TL |
119 | |
120 | // admin-socket | |
121 | seastar::lw_shared_ptr<crimson::admin::AdminSocket> asok; | |
11fdf7f2 TL |
122 | |
123 | public: | |
9f95a23c | 124 | OSD(int id, uint32_t nonce, |
20effc67 | 125 | crimson::os::FuturizedStore& store, |
9f95a23c TL |
126 | crimson::net::MessengerRef cluster_msgr, |
127 | crimson::net::MessengerRef client_msgr, | |
128 | crimson::net::MessengerRef hb_front_msgr, | |
129 | crimson::net::MessengerRef hb_back_msgr); | |
130 | ~OSD() final; | |
11fdf7f2 | 131 | |
9f95a23c | 132 | seastar::future<> mkfs(uuid_d osd_uuid, uuid_d cluster_fsid); |
11fdf7f2 TL |
133 | |
134 | seastar::future<> start(); | |
135 | seastar::future<> stop(); | |
136 | ||
9f95a23c | 137 | void dump_status(Formatter*) const; |
f67539c2 TL |
138 | void dump_pg_state_history(Formatter*) const; |
139 | void print(std::ostream&) const; | |
140 | ||
141 | seastar::future<> send_incremental_map(crimson::net::ConnectionRef conn, | |
142 | epoch_t first); | |
143 | ||
144 | /// @return the seq id of the pg stats being sent | |
145 | uint64_t send_pg_stats(); | |
9f95a23c | 146 | |
11fdf7f2 | 147 | private: |
20effc67 TL |
148 | seastar::future<> _write_superblock(); |
149 | seastar::future<> _write_key_meta(); | |
11fdf7f2 TL |
150 | seastar::future<> start_boot(); |
151 | seastar::future<> _preboot(version_t oldest_osdmap, version_t newest_osdmap); | |
152 | seastar::future<> _send_boot(); | |
9f95a23c | 153 | seastar::future<> _add_me_to_crush(); |
11fdf7f2 | 154 | |
9f95a23c TL |
155 | seastar::future<Ref<PG>> make_pg(cached_map_t create_map, |
156 | spg_t pgid, | |
157 | bool do_create); | |
11fdf7f2 TL |
158 | seastar::future<Ref<PG>> load_pg(spg_t pgid); |
159 | seastar::future<> load_pgs(); | |
160 | ||
9f95a23c TL |
161 | // OSDMapService methods |
162 | epoch_t get_up_epoch() const final { | |
163 | return up_epoch; | |
164 | } | |
165 | seastar::future<cached_map_t> get_map(epoch_t e) final; | |
166 | cached_map_t get_map() const final; | |
167 | seastar::future<std::unique_ptr<OSDMap>> load_map(epoch_t e); | |
11fdf7f2 | 168 | seastar::future<bufferlist> load_map_bl(epoch_t e); |
f67539c2 TL |
169 | seastar::future<std::map<epoch_t, bufferlist>> |
170 | load_map_bls(epoch_t first, epoch_t last); | |
11fdf7f2 TL |
171 | void store_map_bl(ceph::os::Transaction& t, |
172 | epoch_t e, bufferlist&& bl); | |
173 | seastar::future<> store_maps(ceph::os::Transaction& t, | |
174 | epoch_t start, Ref<MOSDMap> m); | |
175 | seastar::future<> osdmap_subscribe(version_t epoch, bool force_request); | |
176 | ||
177 | void write_superblock(ceph::os::Transaction& t); | |
178 | seastar::future<> read_superblock(); | |
179 | ||
9f95a23c TL |
180 | bool require_mon_peer(crimson::net::Connection *conn, Ref<Message> m); |
181 | ||
182 | seastar::future<Ref<PG>> handle_pg_create_info( | |
183 | std::unique_ptr<PGCreateInfo> info); | |
184 | ||
f67539c2 | 185 | seastar::future<> handle_osd_map(crimson::net::ConnectionRef conn, |
11fdf7f2 | 186 | Ref<MOSDMap> m); |
f67539c2 | 187 | seastar::future<> handle_osd_op(crimson::net::ConnectionRef conn, |
9f95a23c | 188 | Ref<MOSDOp> m); |
f67539c2 | 189 | seastar::future<> handle_rep_op(crimson::net::ConnectionRef conn, |
9f95a23c | 190 | Ref<MOSDRepOp> m); |
f67539c2 | 191 | seastar::future<> handle_rep_op_reply(crimson::net::ConnectionRef conn, |
9f95a23c | 192 | Ref<MOSDRepOpReply> m); |
f67539c2 | 193 | seastar::future<> handle_peering_op(crimson::net::ConnectionRef conn, |
9f95a23c | 194 | Ref<MOSDPeeringOp> m); |
f67539c2 TL |
195 | seastar::future<> handle_recovery_subreq(crimson::net::ConnectionRef conn, |
196 | Ref<MOSDFastDispatchOp> m); | |
197 | seastar::future<> handle_scrub(crimson::net::ConnectionRef conn, | |
198 | Ref<MOSDScrub2> m); | |
199 | seastar::future<> handle_mark_me_down(crimson::net::ConnectionRef conn, | |
200 | Ref<MOSDMarkMeDown> m); | |
9f95a23c | 201 | |
11fdf7f2 TL |
202 | seastar::future<> committed_osd_maps(version_t first, |
203 | version_t last, | |
204 | Ref<MOSDMap> m); | |
9f95a23c | 205 | |
20effc67 | 206 | seastar::future<> check_osdmap_features(); |
9f95a23c | 207 | |
f67539c2 TL |
208 | seastar::future<> handle_command(crimson::net::ConnectionRef conn, |
209 | Ref<MCommand> m); | |
9f95a23c TL |
210 | seastar::future<> start_asok_admin(); |
211 | ||
212 | public: | |
213 | OSDMapGate osdmap_gate; | |
214 | ||
215 | ShardServices &get_shard_services() { | |
216 | return shard_services; | |
217 | } | |
218 | ||
219 | seastar::future<> consume_map(epoch_t epoch); | |
220 | ||
221 | private: | |
222 | PGMap pg_map; | |
f67539c2 | 223 | crimson::common::Gated gate; |
9f95a23c | 224 | |
f67539c2 TL |
225 | seastar::promise<> stop_acked; |
226 | void got_stop_ack() { | |
227 | stop_acked.set_value(); | |
228 | } | |
229 | seastar::future<> prepare_to_stop(); | |
20effc67 TL |
230 | bool should_restart() const; |
231 | seastar::future<> restart(); | |
232 | seastar::future<> shutdown(); | |
233 | void update_heartbeat_peers(); | |
234 | friend class PGAdvanceMap; | |
235 | ||
236 | RemotePeeringEvent::OSDPipeline peering_request_osd_pipeline; | |
237 | friend class RemotePeeringEvent; | |
238 | ||
9f95a23c TL |
239 | public: |
240 | blocking_future<Ref<PG>> get_or_create_pg( | |
241 | spg_t pgid, | |
242 | epoch_t epoch, | |
243 | std::unique_ptr<PGCreateInfo> info); | |
244 | blocking_future<Ref<PG>> wait_for_pg( | |
245 | spg_t pgid); | |
f67539c2 | 246 | Ref<PG> get_pg(spg_t pgid); |
11fdf7f2 | 247 | seastar::future<> send_beacon(); |
9f95a23c | 248 | |
20effc67 TL |
249 | private: |
250 | LogClient log_client; | |
251 | LogChannelRef clog; | |
11fdf7f2 | 252 | }; |
9f95a23c | 253 | |
f67539c2 TL |
254 | inline std::ostream& operator<<(std::ostream& out, const OSD& osd) { |
255 | osd.print(out); | |
256 | return out; | |
257 | } | |
258 | ||
9f95a23c | 259 | } |