1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_LIBRBD_IO_TYPES_H
5 #define CEPH_LIBRBD_IO_TYPES_H
7 #include "include/int_types.h"
8 #include "include/rados/rados_types.hpp"
9 #include "common/interval_map.h"
10 #include "osdc/StriperTypes.h"
30 AIO_TYPE_COMPARE_AND_WRITE
,
35 FLUSH_SOURCE_INTERNAL
,
36 FLUSH_SOURCE_SHUTDOWN
,
37 FLUSH_SOURCE_EXCLUSIVE_LOCK
,
38 FLUSH_SOURCE_EXCLUSIVE_LOCK_SKIP_REFRESH
,
40 FLUSH_SOURCE_WRITEBACK
,
41 FLUSH_SOURCE_WRITE_BLOCK
,
51 DISPATCH_RESULT_INVALID
,
52 DISPATCH_RESULT_RESTART
,
53 DISPATCH_RESULT_CONTINUE
,
54 DISPATCH_RESULT_COMPLETE
57 enum ImageDispatchLayer
{
58 IMAGE_DISPATCH_LAYER_NONE
= 0,
59 IMAGE_DISPATCH_LAYER_API_START
= IMAGE_DISPATCH_LAYER_NONE
,
60 IMAGE_DISPATCH_LAYER_QUEUE
,
61 IMAGE_DISPATCH_LAYER_QOS
,
62 IMAGE_DISPATCH_LAYER_EXCLUSIVE_LOCK
,
63 IMAGE_DISPATCH_LAYER_REFRESH
,
64 IMAGE_DISPATCH_LAYER_INTERNAL_START
= IMAGE_DISPATCH_LAYER_REFRESH
,
65 IMAGE_DISPATCH_LAYER_MIGRATION
,
66 IMAGE_DISPATCH_LAYER_JOURNAL
,
67 IMAGE_DISPATCH_LAYER_WRITE_BLOCK
,
68 IMAGE_DISPATCH_LAYER_WRITEBACK_CACHE
,
69 IMAGE_DISPATCH_LAYER_CRYPTO
,
70 IMAGE_DISPATCH_LAYER_CORE
,
71 IMAGE_DISPATCH_LAYER_LAST
75 IMAGE_DISPATCH_FLAG_QOS_IOPS_THROTTLE
= 1 << 0,
76 IMAGE_DISPATCH_FLAG_QOS_BPS_THROTTLE
= 1 << 1,
77 IMAGE_DISPATCH_FLAG_QOS_READ_IOPS_THROTTLE
= 1 << 2,
78 IMAGE_DISPATCH_FLAG_QOS_WRITE_IOPS_THROTTLE
= 1 << 3,
79 IMAGE_DISPATCH_FLAG_QOS_READ_BPS_THROTTLE
= 1 << 4,
80 IMAGE_DISPATCH_FLAG_QOS_WRITE_BPS_THROTTLE
= 1 << 5,
81 IMAGE_DISPATCH_FLAG_QOS_BPS_MASK
= (
82 IMAGE_DISPATCH_FLAG_QOS_BPS_THROTTLE
|
83 IMAGE_DISPATCH_FLAG_QOS_READ_BPS_THROTTLE
|
84 IMAGE_DISPATCH_FLAG_QOS_WRITE_BPS_THROTTLE
),
85 IMAGE_DISPATCH_FLAG_QOS_IOPS_MASK
= (
86 IMAGE_DISPATCH_FLAG_QOS_IOPS_THROTTLE
|
87 IMAGE_DISPATCH_FLAG_QOS_READ_IOPS_THROTTLE
|
88 IMAGE_DISPATCH_FLAG_QOS_WRITE_IOPS_THROTTLE
),
89 IMAGE_DISPATCH_FLAG_QOS_READ_MASK
= (
90 IMAGE_DISPATCH_FLAG_QOS_READ_IOPS_THROTTLE
|
91 IMAGE_DISPATCH_FLAG_QOS_READ_BPS_THROTTLE
),
92 IMAGE_DISPATCH_FLAG_QOS_WRITE_MASK
= (
93 IMAGE_DISPATCH_FLAG_QOS_WRITE_IOPS_THROTTLE
|
94 IMAGE_DISPATCH_FLAG_QOS_WRITE_BPS_THROTTLE
),
95 IMAGE_DISPATCH_FLAG_QOS_MASK
= (
96 IMAGE_DISPATCH_FLAG_QOS_BPS_MASK
|
97 IMAGE_DISPATCH_FLAG_QOS_IOPS_MASK
),
101 RBD_IO_OPERATIONS_DEFAULT
= 0,
102 RBD_IO_OPERATION_READ
= 1 << 0,
103 RBD_IO_OPERATION_WRITE
= 1 << 1,
104 RBD_IO_OPERATION_DISCARD
= 1 << 2,
105 RBD_IO_OPERATION_WRITE_SAME
= 1 << 3,
106 RBD_IO_OPERATION_COMPARE_AND_WRITE
= 1 << 4,
107 RBD_IO_OPERATIONS_ALL
= (
108 RBD_IO_OPERATION_READ
|
109 RBD_IO_OPERATION_WRITE
|
110 RBD_IO_OPERATION_DISCARD
|
111 RBD_IO_OPERATION_WRITE_SAME
|
112 RBD_IO_OPERATION_COMPARE_AND_WRITE
)
115 enum ImageExtentsMapType
{
116 IMAGE_EXTENTS_MAP_TYPE_LOGICAL_TO_PHYSICAL
,
117 IMAGE_EXTENTS_MAP_TYPE_PHYSICAL_TO_LOGICAL
,
120 enum ObjectDispatchLayer
{
121 OBJECT_DISPATCH_LAYER_NONE
= 0,
122 OBJECT_DISPATCH_LAYER_CACHE
,
123 OBJECT_DISPATCH_LAYER_CRYPTO
,
124 OBJECT_DISPATCH_LAYER_JOURNAL
,
125 OBJECT_DISPATCH_LAYER_PARENT_CACHE
,
126 OBJECT_DISPATCH_LAYER_SCHEDULER
,
127 OBJECT_DISPATCH_LAYER_CORE
,
128 OBJECT_DISPATCH_LAYER_LAST
132 READ_FLAG_DISABLE_READ_FROM_PARENT
= 1UL << 0,
133 READ_FLAG_DISABLE_CLIPPING
= 1UL << 1,
137 OBJECT_WRITE_FLAG_CREATE_EXCLUSIVE
= 1UL << 0
141 OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE
= 1UL << 0,
142 OBJECT_DISCARD_FLAG_DISABLE_OBJECT_MAP_UPDATE
= 1UL << 1
146 OBJECT_DISPATCH_FLAG_FLUSH
= 1UL << 0,
147 OBJECT_DISPATCH_FLAG_WILL_RETRY_ON_ERROR
= 1UL << 1
151 LIST_SNAPS_FLAG_DISABLE_LIST_FROM_PARENT
= 1UL << 0,
152 LIST_SNAPS_FLAG_WHOLE_OBJECT
= 1UL << 1,
153 LIST_SNAPS_FLAG_IGNORE_ZEROED_EXTENTS
= 1UL << 2,
156 enum SparseExtentState
{
157 SPARSE_EXTENT_STATE_DNE
, /* does not exist */
158 SPARSE_EXTENT_STATE_ZEROED
,
159 SPARSE_EXTENT_STATE_DATA
162 std::ostream
& operator<<(std::ostream
& os
, SparseExtentState state
);
164 struct SparseExtent
{
165 SparseExtentState state
;
168 SparseExtent(SparseExtentState state
, uint64_t length
)
169 : state(state
), length(length
) {
172 operator SparseExtentState() const {
176 bool operator==(const SparseExtent
& rhs
) const {
177 return state
== rhs
.state
&& length
== rhs
.length
;
181 std::ostream
& operator<<(std::ostream
& os
, const SparseExtent
& state
);
183 struct SparseExtentSplitMerge
{
184 SparseExtent
split(uint64_t offset
, uint64_t length
, SparseExtent
&se
) const {
185 return SparseExtent(se
.state
, se
.length
);
188 bool can_merge(const SparseExtent
& left
, const SparseExtent
& right
) const {
189 return left
.state
== right
.state
;
192 SparseExtent
merge(SparseExtent
&& left
, SparseExtent
&& right
) const {
193 SparseExtent
se(left
);
194 se
.length
+= right
.length
;
198 uint64_t length(const SparseExtent
& se
) const {
203 typedef interval_map
<uint64_t,
205 SparseExtentSplitMerge
> SparseExtents
;
207 typedef std::vector
<uint64_t> SnapIds
;
209 typedef std::pair
<librados::snap_t
, librados::snap_t
> WriteReadSnapIds
;
210 extern const WriteReadSnapIds INITIAL_WRITE_READ_SNAP_IDS
;
212 typedef std::map
<WriteReadSnapIds
, SparseExtents
> SnapshotDelta
;
214 struct SparseBufferlistExtent
: public SparseExtent
{
217 SparseBufferlistExtent(SparseExtentState state
, uint64_t length
)
218 : SparseExtent(state
, length
) {
219 ceph_assert(state
!= SPARSE_EXTENT_STATE_DATA
);
221 SparseBufferlistExtent(SparseExtentState state
, uint64_t length
,
222 ceph::bufferlist
&& bl_
)
223 : SparseExtent(state
, length
), bl(std::move(bl_
)) {
224 ceph_assert(state
!= SPARSE_EXTENT_STATE_DATA
|| length
== bl
.length());
227 bool operator==(const SparseBufferlistExtent
& rhs
) const {
228 return (state
== rhs
.state
&&
229 length
== rhs
.length
&&
230 bl
.contents_equal(rhs
.bl
));
234 struct SparseBufferlistExtentSplitMerge
{
235 SparseBufferlistExtent
split(uint64_t offset
, uint64_t length
,
236 SparseBufferlistExtent
& sbe
) const {
238 if (sbe
.state
== SPARSE_EXTENT_STATE_DATA
) {
239 bl
.substr_of(bl
, offset
, length
);
241 return SparseBufferlistExtent(sbe
.state
, length
, std::move(bl
));
244 bool can_merge(const SparseBufferlistExtent
& left
,
245 const SparseBufferlistExtent
& right
) const {
246 return left
.state
== right
.state
;
249 SparseBufferlistExtent
merge(SparseBufferlistExtent
&& left
,
250 SparseBufferlistExtent
&& right
) const {
251 if (left
.state
== SPARSE_EXTENT_STATE_DATA
) {
252 ceph::bufferlist bl
{std::move(left
.bl
)};
253 bl
.claim_append(std::move(right
.bl
));
254 return SparseBufferlistExtent(SPARSE_EXTENT_STATE_DATA
,
255 bl
.length(), std::move(bl
));
257 return SparseBufferlistExtent(left
.state
, left
.length
+ right
.length
, {});
261 uint64_t length(const SparseBufferlistExtent
& sbe
) const {
266 typedef interval_map
<uint64_t,
267 SparseBufferlistExtent
,
268 SparseBufferlistExtentSplitMerge
> SparseBufferlist
;
269 typedef std::map
<uint64_t, SparseBufferlist
> SnapshotSparseBufferlist
;
271 using striper::LightweightBufferExtents
;
272 using striper::LightweightObjectExtent
;
273 using striper::LightweightObjectExtents
;
275 typedef std::pair
<uint64_t,uint64_t> Extent
;
276 typedef std::vector
<Extent
> Extents
;
279 const uint64_t offset
;
280 const uint64_t length
;
281 const LightweightBufferExtents buffer_extents
;
285 ReadExtent(uint64_t offset
,
286 uint64_t length
) : offset(offset
), length(length
) {};
287 ReadExtent(uint64_t offset
,
289 const LightweightBufferExtents
&& buffer_extents
)
292 buffer_extents(buffer_extents
) {}
293 ReadExtent(uint64_t offset
,
295 const LightweightBufferExtents
&& buffer_extents
,
296 ceph::bufferlist
&& bl
,
297 Extents
&& extent_map
) : offset(offset
),
299 buffer_extents(buffer_extents
),
301 extent_map(extent_map
) {};
303 friend inline std::ostream
& operator<<(
305 const ReadExtent
&extent
) {
306 os
<< "offset=" << extent
.offset
<< ", "
307 << "length=" << extent
.length
<< ", "
308 << "buffer_extents=" << extent
.buffer_extents
<< ", "
309 << "bl.length=" << extent
.bl
.length() << ", "
310 << "extent_map=" << extent
.extent_map
;
315 typedef std::vector
<ReadExtent
> ReadExtents
;
317 typedef std::map
<uint64_t, uint64_t> ExtentMap
;
320 } // namespace librbd
322 #endif // CEPH_LIBRBD_IO_TYPES_H