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/snap_types.h"
10 #include "common/zipkin_trace.h"
11 #include "osd/osd_types.h"
12 #include "librbd/Utils.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 int op_flags
, const ZTracer::Trace
&parent_trace
);
39 static void aio_write(ImageCtxT
*ictx
, AioCompletion
*c
,
40 Extents
&&image_extents
, bufferlist
&&bl
, int op_flags
,
41 const ZTracer::Trace
&parent_trace
);
42 static void aio_discard(ImageCtxT
*ictx
, AioCompletion
*c
,
43 Extents
&&image_extents
,
44 uint32_t discard_granularity_bytes
,
45 const ZTracer::Trace
&parent_trace
);
46 static void aio_flush(ImageCtxT
*ictx
, AioCompletion
*c
,
47 FlushSource flush_source
,
48 const ZTracer::Trace
&parent_trace
);
49 static void aio_writesame(ImageCtxT
*ictx
, AioCompletion
*c
,
50 Extents
&&image_extents
, bufferlist
&&bl
,
51 int op_flags
, const ZTracer::Trace
&parent_trace
);
53 static void aio_compare_and_write(ImageCtxT
*ictx
, AioCompletion
*c
,
54 Extents
&&image_extents
, bufferlist
&&cmp_bl
,
55 bufferlist
&&bl
, uint64_t *mismatch_offset
,
56 int op_flags
, const ZTracer::Trace
&parent_trace
);
60 void set_bypass_image_cache() {
61 m_bypass_image_cache
= true;
64 inline const ZTracer::Trace
&get_trace() const {
69 typedef std::list
<ObjectDispatchSpec
*> ObjectRequests
;
71 ImageCtxT
&m_image_ctx
;
72 AioCompletion
*m_aio_comp
;
73 Extents m_image_extents
;
74 ZTracer::Trace m_trace
;
75 bool m_bypass_image_cache
= false;
77 ImageRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
78 Extents
&&image_extents
, const char *trace_name
,
79 const ZTracer::Trace
&parent_trace
)
80 : m_image_ctx(image_ctx
), m_aio_comp(aio_comp
),
81 m_image_extents(std::move(image_extents
)),
82 m_trace(util::create_trace(image_ctx
, trace_name
, parent_trace
)) {
83 m_trace
.event("start");
87 virtual int clip_request();
88 virtual void update_timestamp();
89 virtual void send_request() = 0;
90 virtual void send_image_cache_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 int op_flags
, const ZTracer::Trace
&parent_trace
);
106 int clip_request() override
;
108 void send_request() override
;
109 void send_image_cache_request() override
;
111 aio_type_t
get_aio_type() const override
{
112 return AIO_TYPE_READ
;
114 const char *get_request_type() const override
{
121 template <typename ImageCtxT
= ImageCtx
>
122 class AbstractImageWriteRequest
: public ImageRequest
<ImageCtxT
> {
124 inline void flag_synchronous() {
125 m_synchronous
= true;
129 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
130 using typename ImageRequest
<ImageCtxT
>::Extents
;
132 typedef std::vector
<ObjectExtent
> ObjectExtents
;
134 AbstractImageWriteRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
135 Extents
&&image_extents
, const char *trace_name
,
136 const ZTracer::Trace
&parent_trace
)
137 : ImageRequest
<ImageCtxT
>(image_ctx
, aio_comp
, std::move(image_extents
),
138 trace_name
, parent_trace
),
139 m_synchronous(false) {
142 void send_request() override
;
144 virtual int prune_object_extents(ObjectExtents
* object_extents
) const {
148 void send_object_requests(const ObjectExtents
&object_extents
,
149 const ::SnapContext
&snapc
, uint64_t journal_tid
);
150 virtual ObjectDispatchSpec
*create_object_request(
151 const ObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
152 uint64_t journal_tid
, Context
*on_finish
) = 0;
154 virtual uint64_t append_journal_event(bool synchronous
) = 0;
155 virtual void update_stats(size_t length
) = 0;
161 template <typename ImageCtxT
= ImageCtx
>
162 class ImageWriteRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
164 using typename ImageRequest
<ImageCtxT
>::Extents
;
166 ImageWriteRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
167 Extents
&&image_extents
, bufferlist
&&bl
, int op_flags
,
168 const ZTracer::Trace
&parent_trace
)
169 : AbstractImageWriteRequest
<ImageCtxT
>(
170 image_ctx
, aio_comp
, std::move(image_extents
), "write", parent_trace
),
171 m_bl(std::move(bl
)), m_op_flags(op_flags
) {
175 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
176 using typename AbstractImageWriteRequest
<ImageCtxT
>::ObjectExtents
;
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 ObjectExtent
&object_extent
, bufferlist
*bl
);
187 void send_image_cache_request() override
;
190 ObjectDispatchSpec
*create_object_request(
191 const ObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
192 uint64_t journal_tid
, Context
*on_finish
) override
;
194 uint64_t append_journal_event(bool synchronous
) override
;
195 void update_stats(size_t length
) override
;
202 template <typename ImageCtxT
= ImageCtx
>
203 class ImageDiscardRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
205 ImageDiscardRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
206 Extents
&& image_extents
,
207 uint32_t discard_granularity_bytes
,
208 const ZTracer::Trace
&parent_trace
)
209 : AbstractImageWriteRequest
<ImageCtxT
>(
210 image_ctx
, aio_comp
, std::move(image_extents
), "discard", parent_trace
),
211 m_discard_granularity_bytes(discard_granularity_bytes
) {
215 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
216 using typename AbstractImageWriteRequest
<ImageCtxT
>::ObjectExtents
;
218 aio_type_t
get_aio_type() const override
{
219 return AIO_TYPE_DISCARD
;
221 const char *get_request_type() const override
{
222 return "aio_discard";
225 void send_image_cache_request() override
;
227 ObjectDispatchSpec
*create_object_request(
228 const ObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
229 uint64_t journal_tid
, Context
*on_finish
) override
;
231 uint64_t append_journal_event(bool synchronous
) override
;
232 void update_stats(size_t length
) override
;
234 int prune_object_extents(ObjectExtents
* object_extents
) const override
;
237 uint32_t m_discard_granularity_bytes
;
240 template <typename ImageCtxT
= ImageCtx
>
241 class ImageFlushRequest
: public ImageRequest
<ImageCtxT
> {
243 ImageFlushRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
244 FlushSource flush_source
,
245 const ZTracer::Trace
&parent_trace
)
246 : ImageRequest
<ImageCtxT
>(image_ctx
, aio_comp
, {}, "flush", parent_trace
),
247 m_flush_source(flush_source
) {
251 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
253 int clip_request() override
{
256 void update_timestamp() override
{
258 void send_request() override
;
259 void send_image_cache_request() override
;
261 aio_type_t
get_aio_type() const override
{
262 return AIO_TYPE_FLUSH
;
264 const char *get_request_type() const override
{
269 FlushSource m_flush_source
;
273 template <typename ImageCtxT
= ImageCtx
>
274 class ImageWriteSameRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
276 ImageWriteSameRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
277 Extents
&& image_extents
, bufferlist
&&bl
,
278 int op_flags
, const ZTracer::Trace
&parent_trace
)
279 : AbstractImageWriteRequest
<ImageCtxT
>(
280 image_ctx
, aio_comp
, std::move(image_extents
), "writesame",
282 m_data_bl(std::move(bl
)), m_op_flags(op_flags
) {
286 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
287 using typename AbstractImageWriteRequest
<ImageCtxT
>::ObjectExtents
;
289 aio_type_t
get_aio_type() const override
{
290 return AIO_TYPE_WRITESAME
;
292 const char *get_request_type() const override
{
293 return "aio_writesame";
296 void send_image_cache_request() override
;
298 ObjectDispatchSpec
*create_object_request(
299 const ObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
300 uint64_t journal_tid
, Context
*on_finish
) override
;
302 uint64_t append_journal_event(bool synchronous
) override
;
303 void update_stats(size_t length
) override
;
305 bufferlist m_data_bl
;
309 template <typename ImageCtxT
= ImageCtx
>
310 class ImageCompareAndWriteRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
312 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
313 using typename AbstractImageWriteRequest
<ImageCtxT
>::ObjectExtents
;
315 ImageCompareAndWriteRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
316 Extents
&&image_extents
, bufferlist
&&cmp_bl
,
317 bufferlist
&&bl
, uint64_t *mismatch_offset
,
318 int op_flags
, const ZTracer::Trace
&parent_trace
)
319 : AbstractImageWriteRequest
<ImageCtxT
>(
320 image_ctx
, aio_comp
, std::move(image_extents
), "compare_and_write", parent_trace
),
321 m_cmp_bl(std::move(cmp_bl
)), m_bl(std::move(bl
)),
322 m_mismatch_offset(mismatch_offset
), m_op_flags(op_flags
) {
326 void send_image_cache_request() override
;
328 void assemble_extent(const ObjectExtent
&object_extent
, bufferlist
*bl
);
330 ObjectDispatchSpec
*create_object_request(
331 const ObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
332 uint64_t journal_tid
, Context
*on_finish
) override
;
334 uint64_t append_journal_event(bool synchronous
) override
;
335 void update_stats(size_t length
) override
;
337 aio_type_t
get_aio_type() const override
{
338 return AIO_TYPE_COMPARE_AND_WRITE
;
340 const char *get_request_type() const override
{
341 return "aio_compare_and_write";
344 int prune_object_extents(ObjectExtents
* object_extents
) const override
;
349 uint64_t *m_mismatch_offset
;
354 } // namespace librbd
356 extern template class librbd::io::ImageRequest
<librbd::ImageCtx
>;
357 extern template class librbd::io::ImageReadRequest
<librbd::ImageCtx
>;
358 extern template class librbd::io::AbstractImageWriteRequest
<librbd::ImageCtx
>;
359 extern template class librbd::io::ImageWriteRequest
<librbd::ImageCtx
>;
360 extern template class librbd::io::ImageDiscardRequest
<librbd::ImageCtx
>;
361 extern template class librbd::io::ImageFlushRequest
<librbd::ImageCtx
>;
362 extern template class librbd::io::ImageWriteSameRequest
<librbd::ImageCtx
>;
363 extern template class librbd::io::ImageCompareAndWriteRequest
<librbd::ImageCtx
>;
365 #endif // CEPH_LIBRBD_IO_IMAGE_REQUEST_H