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");
86 virtual bool finish_request_early() {
89 virtual int clip_request();
90 virtual void update_timestamp();
91 virtual void send_request() = 0;
92 virtual void send_image_cache_request() = 0;
94 virtual aio_type_t
get_aio_type() const = 0;
95 virtual const char *get_request_type() const = 0;
98 template <typename ImageCtxT
= ImageCtx
>
99 class ImageReadRequest
: public ImageRequest
<ImageCtxT
> {
101 using typename ImageRequest
<ImageCtxT
>::Extents
;
103 ImageReadRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
104 Extents
&&image_extents
, ReadResult
&&read_result
,
105 int op_flags
, const ZTracer::Trace
&parent_trace
);
108 int clip_request() override
;
110 void send_request() override
;
111 void send_image_cache_request() override
;
113 aio_type_t
get_aio_type() const override
{
114 return AIO_TYPE_READ
;
116 const char *get_request_type() const override
{
123 template <typename ImageCtxT
= ImageCtx
>
124 class AbstractImageWriteRequest
: public ImageRequest
<ImageCtxT
> {
126 inline void flag_synchronous() {
127 m_synchronous
= true;
131 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
132 using typename ImageRequest
<ImageCtxT
>::Extents
;
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
;
143 bool finish_request_early() override
;
145 virtual int prune_object_extents(
146 LightweightObjectExtents
* object_extents
) const {
150 void send_object_requests(const LightweightObjectExtents
&object_extents
,
151 const ::SnapContext
&snapc
, uint64_t journal_tid
);
152 virtual ObjectDispatchSpec
*create_object_request(
153 const LightweightObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
154 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) = 0;
156 virtual uint64_t append_journal_event(bool synchronous
) = 0;
157 virtual void update_stats(size_t length
) = 0;
163 template <typename ImageCtxT
= ImageCtx
>
164 class ImageWriteRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
166 using typename ImageRequest
<ImageCtxT
>::Extents
;
168 ImageWriteRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
169 Extents
&&image_extents
, bufferlist
&&bl
, int op_flags
,
170 const ZTracer::Trace
&parent_trace
)
171 : AbstractImageWriteRequest
<ImageCtxT
>(
172 image_ctx
, aio_comp
, std::move(image_extents
), "write", parent_trace
),
173 m_bl(std::move(bl
)), m_op_flags(op_flags
) {
177 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
179 aio_type_t
get_aio_type() const override
{
180 return AIO_TYPE_WRITE
;
182 const char *get_request_type() const override
{
186 void assemble_extent(const LightweightObjectExtent
&object_extent
,
189 void send_image_cache_request() override
;
192 ObjectDispatchSpec
*create_object_request(
193 const LightweightObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
194 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) override
;
196 uint64_t append_journal_event(bool synchronous
) override
;
197 void update_stats(size_t length
) override
;
204 template <typename ImageCtxT
= ImageCtx
>
205 class ImageDiscardRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
207 ImageDiscardRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
208 Extents
&& image_extents
,
209 uint32_t discard_granularity_bytes
,
210 const ZTracer::Trace
&parent_trace
)
211 : AbstractImageWriteRequest
<ImageCtxT
>(
212 image_ctx
, aio_comp
, std::move(image_extents
), "discard", parent_trace
),
213 m_discard_granularity_bytes(discard_granularity_bytes
) {
217 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
219 aio_type_t
get_aio_type() const override
{
220 return AIO_TYPE_DISCARD
;
222 const char *get_request_type() const override
{
223 return "aio_discard";
226 void send_image_cache_request() override
;
228 ObjectDispatchSpec
*create_object_request(
229 const LightweightObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
230 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) override
;
232 uint64_t append_journal_event(bool synchronous
) override
;
233 void update_stats(size_t length
) override
;
235 int prune_object_extents(
236 LightweightObjectExtents
* object_extents
) const override
;
239 uint32_t m_discard_granularity_bytes
;
242 template <typename ImageCtxT
= ImageCtx
>
243 class ImageFlushRequest
: public ImageRequest
<ImageCtxT
> {
245 ImageFlushRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
246 FlushSource flush_source
,
247 const ZTracer::Trace
&parent_trace
)
248 : ImageRequest
<ImageCtxT
>(image_ctx
, aio_comp
, {}, "flush", parent_trace
),
249 m_flush_source(flush_source
) {
253 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
255 int clip_request() override
{
258 void update_timestamp() override
{
260 void send_request() override
;
261 void send_image_cache_request() override
;
263 aio_type_t
get_aio_type() const override
{
264 return AIO_TYPE_FLUSH
;
266 const char *get_request_type() const override
{
271 FlushSource m_flush_source
;
275 template <typename ImageCtxT
= ImageCtx
>
276 class ImageWriteSameRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
278 ImageWriteSameRequest(ImageCtxT
&image_ctx
, AioCompletion
*aio_comp
,
279 Extents
&& image_extents
, bufferlist
&&bl
,
280 int op_flags
, const ZTracer::Trace
&parent_trace
)
281 : AbstractImageWriteRequest
<ImageCtxT
>(
282 image_ctx
, aio_comp
, std::move(image_extents
), "writesame",
284 m_data_bl(std::move(bl
)), m_op_flags(op_flags
) {
288 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
290 aio_type_t
get_aio_type() const override
{
291 return AIO_TYPE_WRITESAME
;
293 const char *get_request_type() const override
{
294 return "aio_writesame";
297 void send_image_cache_request() override
;
299 ObjectDispatchSpec
*create_object_request(
300 const LightweightObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
301 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) override
;
303 uint64_t append_journal_event(bool synchronous
) override
;
304 void update_stats(size_t length
) override
;
306 bufferlist m_data_bl
;
310 template <typename ImageCtxT
= ImageCtx
>
311 class ImageCompareAndWriteRequest
: public AbstractImageWriteRequest
<ImageCtxT
> {
313 using typename ImageRequest
<ImageCtxT
>::ObjectRequests
;
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 LightweightObjectExtent
&object_extent
,
331 ObjectDispatchSpec
*create_object_request(
332 const LightweightObjectExtent
&object_extent
, const ::SnapContext
&snapc
,
333 uint64_t journal_tid
, bool single_extent
, Context
*on_finish
) override
;
335 uint64_t append_journal_event(bool synchronous
) override
;
336 void update_stats(size_t length
) override
;
338 aio_type_t
get_aio_type() const override
{
339 return AIO_TYPE_COMPARE_AND_WRITE
;
341 const char *get_request_type() const override
{
342 return "aio_compare_and_write";
345 int prune_object_extents(
346 LightweightObjectExtents
* object_extents
) const override
;
351 uint64_t *m_mismatch_offset
;
356 } // namespace librbd
358 extern template class librbd::io::ImageRequest
<librbd::ImageCtx
>;
359 extern template class librbd::io::ImageReadRequest
<librbd::ImageCtx
>;
360 extern template class librbd::io::AbstractImageWriteRequest
<librbd::ImageCtx
>;
361 extern template class librbd::io::ImageWriteRequest
<librbd::ImageCtx
>;
362 extern template class librbd::io::ImageDiscardRequest
<librbd::ImageCtx
>;
363 extern template class librbd::io::ImageFlushRequest
<librbd::ImageCtx
>;
364 extern template class librbd::io::ImageWriteSameRequest
<librbd::ImageCtx
>;
365 extern template class librbd::io::ImageCompareAndWriteRequest
<librbd::ImageCtx
>;
367 #endif // CEPH_LIBRBD_IO_IMAGE_REQUEST_H