]> git.proxmox.com Git - ceph.git/blame - ceph/src/crimson/osd/osd.h
import quincy beta 17.1.0
[ceph.git] / ceph / src / crimson / osd / osd.h
CommitLineData
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 35class MCommand;
11fdf7f2 36class MOSDMap;
9f95a23c
TL
37class MOSDRepOpReply;
38class MOSDRepOp;
f67539c2 39class MOSDScrub2;
11fdf7f2
TL
40class OSDMap;
41class OSDMeta;
11fdf7f2
TL
42class Heartbeat;
43
9f95a23c
TL
44namespace ceph::os {
45 class Transaction;
46}
47
48namespace crimson::mon {
49 class Client;
50}
51
52namespace crimson::net {
11fdf7f2
TL
53 class Messenger;
54}
55
9f95a23c
TL
56namespace crimson::os {
57 class FuturizedStore;
11fdf7f2
TL
58}
59
9f95a23c
TL
60namespace crimson::osd {
61class PG;
11fdf7f2 62
9f95a23c
TL
63class 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
123public:
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 147private:
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
212public:
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
221private:
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
239public:
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
249private:
250 LogClient log_client;
251 LogChannelRef clog;
11fdf7f2 252};
9f95a23c 253
f67539c2
TL
254inline std::ostream& operator<<(std::ostream& out, const OSD& osd) {
255 osd.print(out);
256 return out;
257}
258
9f95a23c 259}