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_IMAGE_REQUEST_H
5 #define CEPH_LIBRBD_IO_IMAGE_REQUEST_H
7 #include "include/int_types.h"
8 #include "include/buffer_fwd.h"
9 #include "common/zipkin_trace.h"
10 #include "osd/osd_types.h"
11 #include "librbd/Utils.h"
12 #include "librbd/Types.h"
13 #include "librbd/io/Types.h"
24 class ObjectDispatchSpec
;
27 template <typename ImageCtxT
= ImageCtx
>
30 typedef std::vector
<std::pair
<uint64_t,uint64_t> > Extents
;
32 virtual ~ImageRequest() {
33 m_trace
.event("finish");
36 static void aio_read(ImageCtxT
*ictx
, AioCompletion
*c
,
37 Extents
&&image_extents
, ReadResult
&&read_result
,
38 IOContext io_context
, int op_flags
, int read_flags
,
39 const ZTracer::Trace
&parent_trace
);
40 static void aio_write(ImageCtxT
*ictx
, AioCompletion
*c
,
41 Extents
&&image_extents
, bufferlist
&&bl
,
42 IOContext io_context
, int op_flags
,
43 const ZTracer::Trace
&parent_trace
);
44 static void aio_discard(ImageCtxT
*ictx
, AioCompletion
*c
,
45 Extents
&&image_extents
,
46 uint32_t discard_granularity_bytes
,
48 const ZTracer::Trace
&parent_trace
);
49 static void aio_flush(ImageCtxT
*ictx
, AioCompletion
*c
,
50 FlushSource flush_source
,
51 const ZTracer::Trace
&parent_trace
);
52 static void aio_writesame(ImageCtxT
*ictx
, AioCompletion
*c
,
53 Extents
&&image_extents
, bufferlist
&&bl
,
54 IOContext io_context
, int op_flags
,
55 const ZTracer::Trace
&parent_trace
);
57 static void aio_compare_and_write(ImageCtxT
*ictx
, AioCompletion
*c
,
58 Extents
&&image_extents
,
60 bufferlist
&&bl
, uint64_t *mismatch_offset
,
61 IOContext io_context
, int op_flags
,
62 const ZTracer::Trace
&parent_trace
);
66 inline const ZTracer::Trace
&get_trace() const {
71 typedef std::list
<ObjectDispatchSpec
*> ObjectRequests
;
73 ImageCtxT
&m_image_ctx
;
74 AioCompletion
*m_aio_comp
;
75 Extents m_image_extents
;
76 IOContext m_io_context
;
77 ZTracer::Trace m_trace
;
79 ImageRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
80 Extents
&&image_extents
, IOContext io_context
,
81 const char *trace_name
,
82 const ZTracer::Trace
&parent_trace
)
83 : m_image_ctx(image_ctx
), m_aio_comp(aio_comp
),
84 m_image_extents(std::move(image_extents
)), m_io_context(io_context
),
85 m_trace(librbd::util::create_trace(image_ctx
, trace_name
, parent_trace
)) {
86 m_trace
.event("start");
89 virtual void update_timestamp();
90 virtual void send_request() = 0;
92 virtual aio_type_t
get_aio_type() const = 0;
93 virtual const char *get_request_type() const = 0;
96 template <typename ImageCtxT
= ImageCtx
>
97 class ImageReadRequest
: public ImageRequest
<ImageCtxT
> {
99 using typename ImageRequest
<ImageCtxT
>::Extents
;
101 ImageReadRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
102 Extents
&&image_extents
, ReadResult
&&read_result
,
103 IOContext io_context
, int op_flags
, int read_flags
,
104 const ZTracer::Trace
&parent_trace
);
107 void send_request() override
;
109 aio_type_t
get_aio_type() const override
{
110 return AIO_TYPE_READ
;
112 const char *get_request_type() const override
{
120 template <typename ImageCtxT
= ImageCtx
>
121 class AbstractImageWriteRequest
: public ImageRequest
<ImageCtxT
> {
123 inline void flag_synchronous() {
124 m_synchronous
= true;
128 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
129 using typename ImageRequest
<ImageCtxT
>::Extents
;
131 AbstractImageWriteRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
132 Extents
&&image_extents
, IOContext io_context
,
133 const char *trace_name
,
134 const ZTracer::Trace
&parent_trace
)
135 : ImageRequest
<ImageCtxT
>(image_ctx
, aio_comp
, std::move(image_extents
),
136 io_context
, trace_name
, parent_trace
),
137 m_synchronous(false) {
140 void send_request() override
;
142 virtual int prune_object_extents(
143 LightweightObjectExtents
* object_extents
) const {
147 void send_object_requests(const LightweightObjectExtents
&object_extents
,
148 IOContext io_context
, uint64_t journal_tid
);
149 virtual ObjectDispatchSpec
*create_object_request(
150 const LightweightObjectExtent
&object_extent
, IOContext io_context
,
151 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) = 0;
153 virtual uint64_t append_journal_event(bool synchronous
) = 0;
154 virtual void update_stats(size_t length
) = 0;
160 template <typename ImageCtxT
= ImageCtx
>
161 class ImageWriteRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
163 using typename ImageRequest
<ImageCtxT
>::Extents
;
165 ImageWriteRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
166 Extents
&&image_extents
, bufferlist
&&bl
,
167 IOContext io_context
, int op_flags
,
168 const ZTracer::Trace
&parent_trace
)
169 : AbstractImageWriteRequest
<ImageCtxT
>(
170 image_ctx
, aio_comp
, std::move(image_extents
), io_context
, "write",
172 m_bl(std::move(bl
)), m_op_flags(op_flags
) {
176 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
178 aio_type_t
get_aio_type() const override
{
179 return AIO_TYPE_WRITE
;
181 const char *get_request_type() const override
{
185 void assemble_extent(const LightweightObjectExtent
&object_extent
,
188 ObjectDispatchSpec
*create_object_request(
189 const LightweightObjectExtent
&object_extent
, IOContext io_context
,
190 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) override
;
192 uint64_t append_journal_event(bool synchronous
) override
;
193 void update_stats(size_t length
) override
;
200 template <typename ImageCtxT
= ImageCtx
>
201 class ImageDiscardRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
203 ImageDiscardRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
204 Extents
&& image_extents
,
205 uint32_t discard_granularity_bytes
, IOContext io_context
,
206 const ZTracer::Trace
&parent_trace
)
207 : AbstractImageWriteRequest
<ImageCtxT
>(
208 image_ctx
, aio_comp
, std::move(image_extents
), io_context
, "discard",
210 m_discard_granularity_bytes(discard_granularity_bytes
) {
214 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
216 aio_type_t
get_aio_type() const override
{
217 return AIO_TYPE_DISCARD
;
219 const char *get_request_type() const override
{
220 return "aio_discard";
223 ObjectDispatchSpec
*create_object_request(
224 const LightweightObjectExtent
&object_extent
, IOContext io_context
,
225 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) override
;
227 uint64_t append_journal_event(bool synchronous
) override
;
228 void update_stats(size_t length
) override
;
230 int prune_object_extents(
231 LightweightObjectExtents
* object_extents
) const override
;
234 uint32_t m_discard_granularity_bytes
;
237 template <typename ImageCtxT
= ImageCtx
>
238 class ImageFlushRequest
: public ImageRequest
<ImageCtxT
> {
240 ImageFlushRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
241 FlushSource flush_source
,
242 const ZTracer::Trace
&parent_trace
)
243 : ImageRequest
<ImageCtxT
>(image_ctx
, aio_comp
, {}, {}, "flush",
245 m_flush_source(flush_source
) {
249 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
251 void update_timestamp() override
{
253 void send_request() override
;
255 aio_type_t
get_aio_type() const override
{
256 return AIO_TYPE_FLUSH
;
258 const char *get_request_type() const override
{
263 FlushSource m_flush_source
;
267 template <typename ImageCtxT
= ImageCtx
>
268 class ImageWriteSameRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
270 ImageWriteSameRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
271 Extents
&& image_extents
, bufferlist
&&bl
,
272 IOContext io_context
, int op_flags
,
273 const ZTracer::Trace
&parent_trace
)
274 : AbstractImageWriteRequest
<ImageCtxT
>(
275 image_ctx
, aio_comp
, std::move(image_extents
), io_context
, "writesame",
277 m_data_bl(std::move(bl
)), m_op_flags(op_flags
) {
281 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
283 aio_type_t
get_aio_type() const override
{
284 return AIO_TYPE_WRITESAME
;
286 const char *get_request_type() const override
{
287 return "aio_writesame";
290 ObjectDispatchSpec
*create_object_request(
291 const LightweightObjectExtent
&object_extent
, IOContext io_context
,
292 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) override
;
294 uint64_t append_journal_event(bool synchronous
) override
;
295 void update_stats(size_t length
) override
;
297 bufferlist m_data_bl
;
301 template <typename ImageCtxT
= ImageCtx
>
302 class ImageCompareAndWriteRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
304 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
306 ImageCompareAndWriteRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
307 Extents
&&image_extents
, bufferlist
&&cmp_bl
,
308 bufferlist
&&bl
, uint64_t *mismatch_offset
,
309 IOContext io_context
, int op_flags
,
310 const ZTracer::Trace
&parent_trace
)
311 : AbstractImageWriteRequest
<ImageCtxT
>(
312 image_ctx
, aio_comp
, std::move(image_extents
), io_context
,
313 "compare_and_write", parent_trace
),
314 m_cmp_bl(std::move(cmp_bl
)), m_bl(std::move(bl
)),
315 m_mismatch_offset(mismatch_offset
), m_op_flags(op_flags
) {
319 void assemble_extent(const LightweightObjectExtent
&object_extent
,
322 ObjectDispatchSpec
*create_object_request(
323 const LightweightObjectExtent
&object_extent
, IOContext io_context
,
324 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) override
;
326 uint64_t append_journal_event(bool synchronous
) override
;
327 void update_stats(size_t length
) override
;
329 aio_type_t
get_aio_type() const override
{
330 return AIO_TYPE_COMPARE_AND_WRITE
;
332 const char *get_request_type() const override
{
333 return "aio_compare_and_write";
336 int prune_object_extents(
337 LightweightObjectExtents
* object_extents
) const override
;
342 uint64_t *m_mismatch_offset
;
346 template <typename ImageCtxT
= ImageCtx
>
347 class ImageListSnapsRequest
: public ImageRequest
<ImageCtxT
> {
349 using typename ImageRequest
<ImageCtxT
>::Extents
;
351 ImageListSnapsRequest(
352 ImageCtxT
& image_ctx
, AioCompletion
* aio_comp
,
353 Extents
&& image_extents
, SnapIds
&& snap_ids
, int list_snaps_flags
,
354 SnapshotDelta
* snapshot_delta
, const ZTracer::Trace
& parent_trace
);
357 void update_timestamp() override
{}
358 void send_request() override
;
360 aio_type_t
get_aio_type() const override
{
361 return AIO_TYPE_GENERIC
;
363 const char *get_request_type() const override
{
369 int m_list_snaps_flags
;
370 SnapshotDelta
* m_snapshot_delta
;
374 } // namespace librbd
376 extern template class librbd::io::ImageRequest
<librbd::ImageCtx
>;
377 extern template class librbd::io::ImageReadRequest
<librbd::ImageCtx
>;
378 extern template class librbd::io::AbstractImageWriteRequest
<librbd::ImageCtx
>;
379 extern template class librbd::io::ImageWriteRequest
<librbd::ImageCtx
>;
380 extern template class librbd::io::ImageDiscardRequest
<librbd::ImageCtx
>;
381 extern template class librbd::io::ImageFlushRequest
<librbd::ImageCtx
>;
382 extern template class librbd::io::ImageWriteSameRequest
<librbd::ImageCtx
>;
383 extern template class librbd::io::ImageCompareAndWriteRequest
<librbd::ImageCtx
>;
384 extern template class librbd::io::ImageListSnapsRequest
<librbd::ImageCtx
>;
386 #endif // CEPH_LIBRBD_IO_IMAGE_REQUEST_H