1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
9 #include <boost/container/flat_set.hpp>
11 #include "include/rados.h"
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"
31 namespace crimson::osd
{
34 class ObjectContextLoader
;
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
,
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
,
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
>;
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
);
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
,
85 read_ierrorator::future
<> read(
86 const ObjectState
& os
,
88 object_stat_sum_t
& delta_stats
);
89 read_ierrorator::future
<> sparse_read(
90 const ObjectState
& os
,
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
,
100 checksum_ierrorator::future
<> checksum(
101 const ObjectState
& os
,
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
,
110 cmp_ext_ierrorator::future
<> cmp_ext(
111 const ObjectState
& os
,
113 using stat_errorator
= crimson::errorator
<crimson::ct_error::enoent
>;
114 using stat_ierrorator
=
115 ::crimson::interruptible::interruptible_errorator
<
116 ::crimson::osd::IOInterruptCondition
,
118 stat_ierrorator::future
<> stat(
119 const ObjectState
& os
,
121 object_stat_sum_t
& delta_stats
);
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
>;
128 ::crimson::interruptible::interruptible_errorator
<
129 ::crimson::osd::IOInterruptCondition
,
131 using create_ertr
= crimson::errorator
<
132 crimson::ct_error::invarg
,
133 crimson::ct_error::eexist
>;
135 ::crimson::interruptible::interruptible_errorator
<
136 ::crimson::osd::IOInterruptCondition
,
138 create_iertr::future
<> create(
141 ceph::os::Transaction
& trans
,
142 object_stat_sum_t
& delta_stats
);
143 using remove_ertr
= crimson::errorator
<
144 crimson::ct_error::enoent
>;
146 ::crimson::interruptible::interruptible_errorator
<
147 ::crimson::osd::IOInterruptCondition
,
149 remove_iertr::future
<> remove(
151 ceph::os::Transaction
& txn
,
152 object_stat_sum_t
& delta_stats
,
154 interruptible_future
<> remove(
156 ceph::os::Transaction
& txn
);
157 interruptible_future
<> set_allochint(
160 ceph::os::Transaction
& trans
,
161 object_stat_sum_t
& delta_stats
);
162 write_iertr::future
<> write(
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(
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(
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
,
186 append_ierrorator::future
<> append(
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
,
198 rollback_iertr::future
<> rollback(
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(
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(
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
,
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
,
236 setxattr_ierrorator::future
<> setxattr(
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
,
246 get_attr_ierrorator::future
<> getxattr(
247 const ObjectState
& os
,
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
,
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
,
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
,
276 rm_xattr_iertr::future
<> rm_xattr(
279 ceph::os::Transaction
& trans
);
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(
287 const ghobject_t
& oid
) const;
288 read_errorator::future
<std::map
<uint64_t, uint64_t>> fiemap(
290 const ghobject_t
& oid
,
294 write_iertr::future
<> tmapput(
297 ceph::os::Transaction
& trans
,
298 object_stat_sum_t
& delta_stats
,
299 osd_op_params_t
& osd_op_params
);
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
,
307 tmapup_iertr::future
<> tmapup(
310 ceph::os::Transaction
& trans
,
311 object_stat_sum_t
& delta_stats
,
312 osd_op_params_t
& osd_op_params
);
314 read_ierrorator::future
<> tmapget(
315 const ObjectState
& os
,
317 object_stat_sum_t
& delta_stats
);
320 ll_read_ierrorator::future
<> omap_get_keys(
321 const ObjectState
& os
,
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
,
332 omap_cmp_iertr::future
<> omap_cmp(
333 const ObjectState
& os
,
335 object_stat_sum_t
& delta_stats
) const;
336 ll_read_ierrorator::future
<> omap_get_vals(
337 const ObjectState
& os
,
339 object_stat_sum_t
& delta_stats
) const;
340 ll_read_ierrorator::future
<> omap_get_vals_by_keys(
341 const ObjectState
& os
,
343 object_stat_sum_t
& delta_stats
) const;
344 interruptible_future
<> omap_set_vals(
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
,
356 object_stat_sum_t
& delta_stats
) const;
357 interruptible_future
<> omap_set_header(
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(
366 ceph::os::Transaction
& trans
,
367 object_stat_sum_t
& delta_stats
);
368 interruptible_future
<> omap_remove_key(
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
,
377 omap_clear_iertr::future
<> omap_clear(
380 ceph::os::Transaction
& trans
,
381 osd_op_params_t
& osd_op_params
,
382 object_stat_sum_t
& delta_stats
);
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;
388 const shard_id_t shard
;
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;
397 struct loaded_object_md_t
{
399 crimson::osd::SnapSetContextRef ssc
;
400 using ref
= std::unique_ptr
<loaded_object_md_t
>;
402 load_metadata_iertr::future
<loaded_object_md_t::ref
>
404 const hobject_t
&oid
);
407 virtual ll_read_ierrorator::future
<ceph::bufferlist
> _read(
408 const hobject_t
& hoid
,
412 write_iertr::future
<> _writefull(
415 const bufferlist
& bl
,
416 ceph::os::Transaction
& txn
,
417 osd_op_params_t
& osd_op_params
,
418 object_stat_sum_t
& delta_stats
,
420 write_iertr::future
<> _truncate(
422 ceph::os::Transaction
& txn
,
423 osd_op_params_t
& osd_op_params
,
424 object_stat_sum_t
& delta_stats
,
426 size_t truncate_size
,
427 uint32_t truncate_seq
);
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
,
438 uint64_t truncate_size
);
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
;