]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/osd/pg_backend.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / crimson / osd / pg_backend.h
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
6 #include <map>
7 #include <memory>
8 #include <string>
9 #include <boost/container/flat_set.hpp>
10
11 #include "include/rados.h"
12
13 #include "crimson/os/futurized_store.h"
14 #include "crimson/os/futurized_collection.h"
15 #include "crimson/osd/acked_peers.h"
16 #include "crimson/common/shared_lru.h"
17 #include "messages/MOSDOp.h"
18 #include "messages/MOSDOpReply.h"
19 #include "os/Transaction.h"
20 #include "osd/osd_types.h"
21 #include "crimson/osd/object_context.h"
22 #include "crimson/osd/osd_operation.h"
23 #include "crimson/osd/osd_operations/osdop_params.h"
24
25 struct hobject_t;
26
27 namespace ceph::os {
28 class Transaction;
29 }
30
31 namespace crimson::osd {
32 class ShardServices;
33 class PG;
34 class ObjectContextLoader;
35 }
36
37 class PGBackend
38 {
39 protected:
40 using CollectionRef = crimson::os::CollectionRef;
41 using ec_profile_t = std::map<std::string, std::string>;
42 // low-level read errorator
43 using ll_read_errorator = crimson::os::FuturizedStore::Shard::read_errorator;
44 using ll_read_ierrorator =
45 ::crimson::interruptible::interruptible_errorator<
46 ::crimson::osd::IOInterruptCondition,
47 ll_read_errorator>;
48
49 public:
50 using load_metadata_ertr = crimson::errorator<
51 crimson::ct_error::object_corrupted>;
52 using load_metadata_iertr =
53 ::crimson::interruptible::interruptible_errorator<
54 ::crimson::osd::IOInterruptCondition,
55 load_metadata_ertr>;
56 using interruptor =
57 ::crimson::interruptible::interruptor<
58 ::crimson::osd::IOInterruptCondition>;
59 template <typename T = void>
60 using interruptible_future =
61 ::crimson::interruptible::interruptible_future<
62 ::crimson::osd::IOInterruptCondition, T>;
63 using rep_op_fut_t =
64 std::tuple<interruptible_future<>,
65 interruptible_future<crimson::osd::acked_peers_t>>;
66 PGBackend(shard_id_t shard, CollectionRef coll,
67 crimson::osd::ShardServices &shard_services,
68 DoutPrefixProvider &dpp);
69 virtual ~PGBackend() = default;
70 static std::unique_ptr<PGBackend> create(pg_t pgid,
71 const pg_shard_t pg_shard,
72 const pg_pool_t& pool,
73 crimson::os::CollectionRef coll,
74 crimson::osd::ShardServices& shard_services,
75 const ec_profile_t& ec_profile,
76 DoutPrefixProvider &dpp);
77 using attrs_t =
78 std::map<std::string, ceph::bufferptr, std::less<>>;
79 using read_errorator = ll_read_errorator::extend<
80 crimson::ct_error::object_corrupted>;
81 using read_ierrorator =
82 ::crimson::interruptible::interruptible_errorator<
83 ::crimson::osd::IOInterruptCondition,
84 read_errorator>;
85 read_ierrorator::future<> read(
86 const ObjectState& os,
87 OSDOp& osd_op,
88 object_stat_sum_t& delta_stats);
89 read_ierrorator::future<> sparse_read(
90 const ObjectState& os,
91 OSDOp& osd_op,
92 object_stat_sum_t& delta_stats);
93 using checksum_errorator = ll_read_errorator::extend<
94 crimson::ct_error::object_corrupted,
95 crimson::ct_error::invarg>;
96 using checksum_ierrorator =
97 ::crimson::interruptible::interruptible_errorator<
98 ::crimson::osd::IOInterruptCondition,
99 checksum_errorator>;
100 checksum_ierrorator::future<> checksum(
101 const ObjectState& os,
102 OSDOp& osd_op);
103 using cmp_ext_errorator = ll_read_errorator::extend<
104 crimson::ct_error::invarg,
105 crimson::ct_error::cmp_fail>;
106 using cmp_ext_ierrorator =
107 ::crimson::interruptible::interruptible_errorator<
108 ::crimson::osd::IOInterruptCondition,
109 cmp_ext_errorator>;
110 cmp_ext_ierrorator::future<> cmp_ext(
111 const ObjectState& os,
112 OSDOp& osd_op);
113 using stat_errorator = crimson::errorator<crimson::ct_error::enoent>;
114 using stat_ierrorator =
115 ::crimson::interruptible::interruptible_errorator<
116 ::crimson::osd::IOInterruptCondition,
117 stat_errorator>;
118 stat_ierrorator::future<> stat(
119 const ObjectState& os,
120 OSDOp& osd_op,
121 object_stat_sum_t& delta_stats);
122
123 // TODO: switch the entire write family to errorator.
124 using write_ertr = crimson::errorator<
125 crimson::ct_error::file_too_large,
126 crimson::ct_error::invarg>;
127 using write_iertr =
128 ::crimson::interruptible::interruptible_errorator<
129 ::crimson::osd::IOInterruptCondition,
130 write_ertr>;
131 using create_ertr = crimson::errorator<
132 crimson::ct_error::invarg,
133 crimson::ct_error::eexist>;
134 using create_iertr =
135 ::crimson::interruptible::interruptible_errorator<
136 ::crimson::osd::IOInterruptCondition,
137 create_ertr>;
138 create_iertr::future<> create(
139 ObjectState& os,
140 const OSDOp& osd_op,
141 ceph::os::Transaction& trans,
142 object_stat_sum_t& delta_stats);
143 using remove_ertr = crimson::errorator<
144 crimson::ct_error::enoent>;
145 using remove_iertr =
146 ::crimson::interruptible::interruptible_errorator<
147 ::crimson::osd::IOInterruptCondition,
148 remove_ertr>;
149 remove_iertr::future<> remove(
150 ObjectState& os,
151 ceph::os::Transaction& txn,
152 object_stat_sum_t& delta_stats,
153 bool whiteout);
154 interruptible_future<> remove(
155 ObjectState& os,
156 ceph::os::Transaction& txn);
157 interruptible_future<> set_allochint(
158 ObjectState& os,
159 const OSDOp& osd_op,
160 ceph::os::Transaction& trans,
161 object_stat_sum_t& delta_stats);
162 write_iertr::future<> write(
163 ObjectState& os,
164 const OSDOp& osd_op,
165 ceph::os::Transaction& trans,
166 osd_op_params_t& osd_op_params,
167 object_stat_sum_t& delta_stats);
168 interruptible_future<> write_same(
169 ObjectState& os,
170 const OSDOp& osd_op,
171 ceph::os::Transaction& trans,
172 osd_op_params_t& osd_op_params,
173 object_stat_sum_t& delta_stats);
174 write_iertr::future<> writefull(
175 ObjectState& os,
176 const OSDOp& osd_op,
177 ceph::os::Transaction& trans,
178 osd_op_params_t& osd_op_params,
179 object_stat_sum_t& delta_stats);
180 using append_errorator = crimson::errorator<
181 crimson::ct_error::invarg>;
182 using append_ierrorator =
183 ::crimson::interruptible::interruptible_errorator<
184 ::crimson::osd::IOInterruptCondition,
185 append_errorator>;
186 append_ierrorator::future<> append(
187 ObjectState& os,
188 OSDOp& osd_op,
189 ceph::os::Transaction& trans,
190 osd_op_params_t& osd_op_params,
191 object_stat_sum_t& delta_stats);
192 using rollback_ertr = crimson::errorator<
193 crimson::ct_error::enoent>;
194 using rollback_iertr =
195 ::crimson::interruptible::interruptible_errorator<
196 ::crimson::osd::IOInterruptCondition,
197 rollback_ertr>;
198 rollback_iertr::future<> rollback(
199 ObjectState& os,
200 const OSDOp& osd_op,
201 ceph::os::Transaction& txn,
202 osd_op_params_t& osd_op_params,
203 object_stat_sum_t& delta_stats,
204 crimson::osd::ObjectContextRef head,
205 crimson::osd::ObjectContextLoader& obc_loader);
206 write_iertr::future<> truncate(
207 ObjectState& os,
208 const OSDOp& osd_op,
209 ceph::os::Transaction& trans,
210 osd_op_params_t& osd_op_params,
211 object_stat_sum_t& delta_stats);
212 write_iertr::future<> zero(
213 ObjectState& os,
214 const OSDOp& osd_op,
215 ceph::os::Transaction& trans,
216 osd_op_params_t& osd_op_params,
217 object_stat_sum_t& delta_stats);
218 rep_op_fut_t mutate_object(
219 std::set<pg_shard_t> pg_shards,
220 crimson::osd::ObjectContextRef &&obc,
221 ceph::os::Transaction&& txn,
222 osd_op_params_t&& osd_op_p,
223 epoch_t min_epoch,
224 epoch_t map_epoch,
225 std::vector<pg_log_entry_t>&& log_entries);
226 interruptible_future<std::tuple<std::vector<hobject_t>, hobject_t>> list_objects(
227 const hobject_t& start,
228 uint64_t limit) const;
229 using setxattr_errorator = crimson::errorator<
230 crimson::ct_error::file_too_large,
231 crimson::ct_error::enametoolong>;
232 using setxattr_ierrorator =
233 ::crimson::interruptible::interruptible_errorator<
234 ::crimson::osd::IOInterruptCondition,
235 setxattr_errorator>;
236 setxattr_ierrorator::future<> setxattr(
237 ObjectState& os,
238 const OSDOp& osd_op,
239 ceph::os::Transaction& trans,
240 object_stat_sum_t& delta_stats);
241 using get_attr_errorator = crimson::os::FuturizedStore::Shard::get_attr_errorator;
242 using get_attr_ierrorator =
243 ::crimson::interruptible::interruptible_errorator<
244 ::crimson::osd::IOInterruptCondition,
245 get_attr_errorator>;
246 get_attr_ierrorator::future<> getxattr(
247 const ObjectState& os,
248 OSDOp& osd_op,
249 object_stat_sum_t& delta_stats) const;
250 get_attr_ierrorator::future<ceph::bufferlist> getxattr(
251 const hobject_t& soid,
252 std::string_view key) const;
253 get_attr_ierrorator::future<ceph::bufferlist> getxattr(
254 const hobject_t& soid,
255 std::string&& key) const;
256 get_attr_ierrorator::future<> get_xattrs(
257 const ObjectState& os,
258 OSDOp& osd_op,
259 object_stat_sum_t& delta_stats) const;
260 using cmp_xattr_errorator = get_attr_errorator::extend<
261 crimson::ct_error::ecanceled,
262 crimson::ct_error::invarg>;
263 using cmp_xattr_ierrorator =
264 ::crimson::interruptible::interruptible_errorator<
265 ::crimson::osd::IOInterruptCondition,
266 cmp_xattr_errorator>;
267 cmp_xattr_ierrorator::future<> cmp_xattr(
268 const ObjectState& os,
269 OSDOp& osd_op,
270 object_stat_sum_t& delta_stats) const;
271 using rm_xattr_ertr = crimson::errorator<crimson::ct_error::enoent>;
272 using rm_xattr_iertr =
273 ::crimson::interruptible::interruptible_errorator<
274 ::crimson::osd::IOInterruptCondition,
275 rm_xattr_ertr>;
276 rm_xattr_iertr::future<> rm_xattr(
277 ObjectState& os,
278 const OSDOp& osd_op,
279 ceph::os::Transaction& trans);
280 void clone(
281 /* const */object_info_t& snap_oi,
282 const ObjectState& os,
283 const ObjectState& d_os,
284 ceph::os::Transaction& trans);
285 interruptible_future<struct stat> stat(
286 CollectionRef c,
287 const ghobject_t& oid) const;
288 read_errorator::future<std::map<uint64_t, uint64_t>> fiemap(
289 CollectionRef c,
290 const ghobject_t& oid,
291 uint64_t off,
292 uint64_t len);
293
294 write_iertr::future<> tmapput(
295 ObjectState& os,
296 const OSDOp& osd_op,
297 ceph::os::Transaction& trans,
298 object_stat_sum_t& delta_stats,
299 osd_op_params_t& osd_op_params);
300
301 using tmapup_ertr = write_ertr::extend<
302 crimson::ct_error::enoent,
303 crimson::ct_error::eexist>;
304 using tmapup_iertr = ::crimson::interruptible::interruptible_errorator<
305 ::crimson::osd::IOInterruptCondition,
306 tmapup_ertr>;
307 tmapup_iertr::future<> tmapup(
308 ObjectState& os,
309 const OSDOp& osd_op,
310 ceph::os::Transaction& trans,
311 object_stat_sum_t& delta_stats,
312 osd_op_params_t& osd_op_params);
313
314 read_ierrorator::future<> tmapget(
315 const ObjectState& os,
316 OSDOp& osd_op,
317 object_stat_sum_t& delta_stats);
318
319 // OMAP
320 ll_read_ierrorator::future<> omap_get_keys(
321 const ObjectState& os,
322 OSDOp& osd_op,
323 object_stat_sum_t& delta_stats) const;
324 using omap_cmp_ertr =
325 crimson::os::FuturizedStore::Shard::read_errorator::extend<
326 crimson::ct_error::ecanceled,
327 crimson::ct_error::invarg>;
328 using omap_cmp_iertr =
329 ::crimson::interruptible::interruptible_errorator<
330 ::crimson::osd::IOInterruptCondition,
331 omap_cmp_ertr>;
332 omap_cmp_iertr::future<> omap_cmp(
333 const ObjectState& os,
334 OSDOp& osd_op,
335 object_stat_sum_t& delta_stats) const;
336 ll_read_ierrorator::future<> omap_get_vals(
337 const ObjectState& os,
338 OSDOp& osd_op,
339 object_stat_sum_t& delta_stats) const;
340 ll_read_ierrorator::future<> omap_get_vals_by_keys(
341 const ObjectState& os,
342 OSDOp& osd_op,
343 object_stat_sum_t& delta_stats) const;
344 interruptible_future<> omap_set_vals(
345 ObjectState& os,
346 const OSDOp& osd_op,
347 ceph::os::Transaction& trans,
348 osd_op_params_t& osd_op_params,
349 object_stat_sum_t& delta_stats);
350 ll_read_ierrorator::future<ceph::bufferlist> omap_get_header(
351 const crimson::os::CollectionRef& c,
352 const ghobject_t& oid) const;
353 ll_read_ierrorator::future<> omap_get_header(
354 const ObjectState& os,
355 OSDOp& osd_op,
356 object_stat_sum_t& delta_stats) const;
357 interruptible_future<> omap_set_header(
358 ObjectState& os,
359 const OSDOp& osd_op,
360 ceph::os::Transaction& trans,
361 osd_op_params_t& osd_op_params,
362 object_stat_sum_t& delta_stats);
363 interruptible_future<> omap_remove_range(
364 ObjectState& os,
365 const OSDOp& osd_op,
366 ceph::os::Transaction& trans,
367 object_stat_sum_t& delta_stats);
368 interruptible_future<> omap_remove_key(
369 ObjectState& os,
370 const OSDOp& osd_op,
371 ceph::os::Transaction& trans);
372 using omap_clear_ertr = crimson::errorator<crimson::ct_error::enoent>;
373 using omap_clear_iertr =
374 ::crimson::interruptible::interruptible_errorator<
375 ::crimson::osd::IOInterruptCondition,
376 omap_clear_ertr>;
377 omap_clear_iertr::future<> omap_clear(
378 ObjectState& os,
379 OSDOp& osd_op,
380 ceph::os::Transaction& trans,
381 osd_op_params_t& osd_op_params,
382 object_stat_sum_t& delta_stats);
383
384 virtual void got_rep_op_reply(const MOSDRepOpReply&) {}
385 virtual seastar::future<> stop() = 0;
386 virtual void on_actingset_changed(bool same_primary) = 0;
387 protected:
388 const shard_id_t shard;
389 CollectionRef coll;
390 crimson::osd::ShardServices &shard_services;
391 DoutPrefixProvider &dpp; ///< provides log prefix context
392 crimson::os::FuturizedStore::Shard* store;
393 virtual seastar::future<> request_committed(
394 const osd_reqid_t& reqid,
395 const eversion_t& at_version) = 0;
396 public:
397 struct loaded_object_md_t {
398 ObjectState os;
399 crimson::osd::SnapSetContextRef ssc;
400 using ref = std::unique_ptr<loaded_object_md_t>;
401 };
402 load_metadata_iertr::future<loaded_object_md_t::ref>
403 load_metadata(
404 const hobject_t &oid);
405
406 private:
407 virtual ll_read_ierrorator::future<ceph::bufferlist> _read(
408 const hobject_t& hoid,
409 size_t offset,
410 size_t length,
411 uint32_t flags) = 0;
412 write_iertr::future<> _writefull(
413 ObjectState& os,
414 off_t truncate_size,
415 const bufferlist& bl,
416 ceph::os::Transaction& txn,
417 osd_op_params_t& osd_op_params,
418 object_stat_sum_t& delta_stats,
419 unsigned flags);
420 write_iertr::future<> _truncate(
421 ObjectState& os,
422 ceph::os::Transaction& txn,
423 osd_op_params_t& osd_op_params,
424 object_stat_sum_t& delta_stats,
425 size_t offset,
426 size_t truncate_size,
427 uint32_t truncate_seq);
428
429 bool maybe_create_new_object(ObjectState& os,
430 ceph::os::Transaction& txn,
431 object_stat_sum_t& delta_stats);
432 void update_size_and_usage(object_stat_sum_t& delta_stats,
433 object_info_t& oi, uint64_t offset,
434 uint64_t length, bool write_full = false);
435 void truncate_update_size_and_usage(
436 object_stat_sum_t& delta_stats,
437 object_info_t& oi,
438 uint64_t truncate_size);
439 virtual rep_op_fut_t
440 _submit_transaction(std::set<pg_shard_t>&& pg_shards,
441 const hobject_t& hoid,
442 ceph::os::Transaction&& txn,
443 osd_op_params_t&& osd_op_p,
444 epoch_t min_epoch, epoch_t max_epoch,
445 std::vector<pg_log_entry_t>&& log_entries) = 0;
446 friend class ReplicatedRecoveryBackend;
447 friend class ::crimson::osd::PG;
448 };