]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
4 | #ifndef CEPH_LIBRBD_IO_IMAGE_REQUEST_H | |
5 | #define CEPH_LIBRBD_IO_IMAGE_REQUEST_H | |
6 | ||
7 | #include "include/int_types.h" | |
8 | #include "include/buffer_fwd.h" | |
31f18b77 | 9 | #include "common/zipkin_trace.h" |
7c673cae | 10 | #include "osd/osd_types.h" |
31f18b77 | 11 | #include "librbd/Utils.h" |
f67539c2 | 12 | #include "librbd/Types.h" |
7c673cae FG |
13 | #include "librbd/io/Types.h" |
14 | #include <list> | |
15 | #include <utility> | |
16 | #include <vector> | |
17 | ||
18 | namespace librbd { | |
19 | class ImageCtx; | |
20 | ||
21 | namespace io { | |
22 | ||
23 | class AioCompletion; | |
11fdf7f2 | 24 | class ObjectDispatchSpec; |
7c673cae FG |
25 | class ReadResult; |
26 | ||
27 | template <typename ImageCtxT = ImageCtx> | |
28 | class ImageRequest { | |
29 | public: | |
30 | typedef std::vector<std::pair<uint64_t,uint64_t> > Extents; | |
31 | ||
31f18b77 FG |
32 | virtual ~ImageRequest() { |
33 | m_trace.event("finish"); | |
34 | } | |
7c673cae FG |
35 | |
36 | static void aio_read(ImageCtxT *ictx, AioCompletion *c, | |
37 | Extents &&image_extents, ReadResult &&read_result, | |
f67539c2 TL |
38 | IOContext io_context, int op_flags, int read_flags, |
39 | const ZTracer::Trace &parent_trace); | |
7c673cae | 40 | static void aio_write(ImageCtxT *ictx, AioCompletion *c, |
f67539c2 TL |
41 | Extents &&image_extents, bufferlist &&bl, |
42 | IOContext io_context, int op_flags, | |
31f18b77 | 43 | const ZTracer::Trace &parent_trace); |
11fdf7f2 TL |
44 | static void aio_discard(ImageCtxT *ictx, AioCompletion *c, |
45 | Extents &&image_extents, | |
46 | uint32_t discard_granularity_bytes, | |
f67539c2 | 47 | IOContext io_context, |
11fdf7f2 | 48 | const ZTracer::Trace &parent_trace); |
31f18b77 | 49 | static void aio_flush(ImageCtxT *ictx, AioCompletion *c, |
11fdf7f2 TL |
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, | |
f67539c2 TL |
54 | IOContext io_context, int op_flags, |
55 | const ZTracer::Trace &parent_trace); | |
7c673cae | 56 | |
c07f9fc5 | 57 | static void aio_compare_and_write(ImageCtxT *ictx, AioCompletion *c, |
f67539c2 TL |
58 | Extents &&image_extents, |
59 | bufferlist &&cmp_bl, | |
c07f9fc5 | 60 | bufferlist &&bl, uint64_t *mismatch_offset, |
f67539c2 TL |
61 | IOContext io_context, int op_flags, |
62 | const ZTracer::Trace &parent_trace); | |
c07f9fc5 | 63 | |
7c673cae | 64 | void send(); |
7c673cae | 65 | |
31f18b77 FG |
66 | inline const ZTracer::Trace &get_trace() const { |
67 | return m_trace; | |
68 | } | |
69 | ||
7c673cae | 70 | protected: |
11fdf7f2 | 71 | typedef std::list<ObjectDispatchSpec*> ObjectRequests; |
7c673cae FG |
72 | |
73 | ImageCtxT &m_image_ctx; | |
74 | AioCompletion *m_aio_comp; | |
75 | Extents m_image_extents; | |
f67539c2 | 76 | IOContext m_io_context; |
31f18b77 | 77 | ZTracer::Trace m_trace; |
7c673cae FG |
78 | |
79 | ImageRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, | |
f67539c2 TL |
80 | Extents &&image_extents, IOContext io_context, |
81 | const char *trace_name, | |
31f18b77 | 82 | const ZTracer::Trace &parent_trace) |
7c673cae | 83 | : m_image_ctx(image_ctx), m_aio_comp(aio_comp), |
f67539c2 | 84 | m_image_extents(std::move(image_extents)), m_io_context(io_context), |
f91f0fd5 | 85 | m_trace(librbd::util::create_trace(image_ctx, trace_name, parent_trace)) { |
31f18b77 | 86 | m_trace.event("start"); |
7c673cae | 87 | } |
11fdf7f2 | 88 | |
11fdf7f2 | 89 | virtual void update_timestamp(); |
7c673cae | 90 | virtual void send_request() = 0; |
7c673cae FG |
91 | |
92 | virtual aio_type_t get_aio_type() const = 0; | |
93 | virtual const char *get_request_type() const = 0; | |
94 | }; | |
95 | ||
96 | template <typename ImageCtxT = ImageCtx> | |
97 | class ImageReadRequest : public ImageRequest<ImageCtxT> { | |
98 | public: | |
99 | using typename ImageRequest<ImageCtxT>::Extents; | |
100 | ||
101 | ImageReadRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, | |
102 | Extents &&image_extents, ReadResult &&read_result, | |
f67539c2 TL |
103 | IOContext io_context, int op_flags, int read_flags, |
104 | const ZTracer::Trace &parent_trace); | |
7c673cae FG |
105 | |
106 | protected: | |
7c673cae | 107 | void send_request() override; |
7c673cae FG |
108 | |
109 | aio_type_t get_aio_type() const override { | |
110 | return AIO_TYPE_READ; | |
111 | } | |
112 | const char *get_request_type() const override { | |
113 | return "aio_read"; | |
114 | } | |
115 | private: | |
7c673cae | 116 | int m_op_flags; |
f67539c2 | 117 | int m_read_flags; |
7c673cae FG |
118 | }; |
119 | ||
120 | template <typename ImageCtxT = ImageCtx> | |
121 | class AbstractImageWriteRequest : public ImageRequest<ImageCtxT> { | |
122 | public: | |
7c673cae FG |
123 | inline void flag_synchronous() { |
124 | m_synchronous = true; | |
125 | } | |
126 | ||
127 | protected: | |
128 | using typename ImageRequest<ImageCtxT>::ObjectRequests; | |
129 | using typename ImageRequest<ImageCtxT>::Extents; | |
130 | ||
7c673cae | 131 | AbstractImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, |
f67539c2 TL |
132 | Extents &&image_extents, IOContext io_context, |
133 | const char *trace_name, | |
31f18b77 FG |
134 | const ZTracer::Trace &parent_trace) |
135 | : ImageRequest<ImageCtxT>(image_ctx, aio_comp, std::move(image_extents), | |
f67539c2 | 136 | io_context, trace_name, parent_trace), |
7c673cae FG |
137 | m_synchronous(false) { |
138 | } | |
139 | ||
140 | void send_request() override; | |
141 | ||
9f95a23c TL |
142 | virtual int prune_object_extents( |
143 | LightweightObjectExtents* object_extents) const { | |
c07f9fc5 | 144 | return 0; |
7c673cae | 145 | } |
7c673cae | 146 | |
9f95a23c | 147 | void send_object_requests(const LightweightObjectExtents &object_extents, |
f67539c2 | 148 | IOContext io_context, uint64_t journal_tid); |
11fdf7f2 | 149 | virtual ObjectDispatchSpec *create_object_request( |
f67539c2 | 150 | const LightweightObjectExtent &object_extent, IOContext io_context, |
9f95a23c | 151 | uint64_t journal_tid, bool single_extent, Context *on_finish) = 0; |
7c673cae | 152 | |
11fdf7f2 | 153 | virtual uint64_t append_journal_event(bool synchronous) = 0; |
7c673cae FG |
154 | virtual void update_stats(size_t length) = 0; |
155 | ||
156 | private: | |
157 | bool m_synchronous; | |
158 | }; | |
159 | ||
160 | template <typename ImageCtxT = ImageCtx> | |
161 | class ImageWriteRequest : public AbstractImageWriteRequest<ImageCtxT> { | |
162 | public: | |
163 | using typename ImageRequest<ImageCtxT>::Extents; | |
164 | ||
165 | ImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, | |
f67539c2 TL |
166 | Extents &&image_extents, bufferlist &&bl, |
167 | IOContext io_context, int op_flags, | |
31f18b77 FG |
168 | const ZTracer::Trace &parent_trace) |
169 | : AbstractImageWriteRequest<ImageCtxT>( | |
f67539c2 TL |
170 | image_ctx, aio_comp, std::move(image_extents), io_context, "write", |
171 | parent_trace), | |
7c673cae FG |
172 | m_bl(std::move(bl)), m_op_flags(op_flags) { |
173 | } | |
174 | ||
175 | protected: | |
176 | using typename ImageRequest<ImageCtxT>::ObjectRequests; | |
7c673cae FG |
177 | |
178 | aio_type_t get_aio_type() const override { | |
179 | return AIO_TYPE_WRITE; | |
180 | } | |
181 | const char *get_request_type() const override { | |
182 | return "aio_write"; | |
183 | } | |
184 | ||
9f95a23c TL |
185 | void assemble_extent(const LightweightObjectExtent &object_extent, |
186 | bufferlist *bl); | |
7c673cae | 187 | |
11fdf7f2 | 188 | ObjectDispatchSpec *create_object_request( |
f67539c2 | 189 | const LightweightObjectExtent &object_extent, IOContext io_context, |
9f95a23c | 190 | uint64_t journal_tid, bool single_extent, Context *on_finish) override; |
7c673cae | 191 | |
11fdf7f2 | 192 | uint64_t append_journal_event(bool synchronous) override; |
7c673cae FG |
193 | void update_stats(size_t length) override; |
194 | ||
195 | private: | |
196 | bufferlist m_bl; | |
197 | int m_op_flags; | |
198 | }; | |
199 | ||
200 | template <typename ImageCtxT = ImageCtx> | |
201 | class ImageDiscardRequest : public AbstractImageWriteRequest<ImageCtxT> { | |
202 | public: | |
203 | ImageDiscardRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, | |
11fdf7f2 | 204 | Extents&& image_extents, |
f67539c2 | 205 | uint32_t discard_granularity_bytes, IOContext io_context, |
11fdf7f2 | 206 | const ZTracer::Trace &parent_trace) |
31f18b77 | 207 | : AbstractImageWriteRequest<ImageCtxT>( |
f67539c2 TL |
208 | image_ctx, aio_comp, std::move(image_extents), io_context, "discard", |
209 | parent_trace), | |
11fdf7f2 | 210 | m_discard_granularity_bytes(discard_granularity_bytes) { |
7c673cae FG |
211 | } |
212 | ||
213 | protected: | |
214 | using typename ImageRequest<ImageCtxT>::ObjectRequests; | |
7c673cae FG |
215 | |
216 | aio_type_t get_aio_type() const override { | |
217 | return AIO_TYPE_DISCARD; | |
218 | } | |
219 | const char *get_request_type() const override { | |
220 | return "aio_discard"; | |
221 | } | |
222 | ||
11fdf7f2 | 223 | ObjectDispatchSpec *create_object_request( |
f67539c2 | 224 | const LightweightObjectExtent &object_extent, IOContext io_context, |
9f95a23c | 225 | uint64_t journal_tid, bool single_extent, Context *on_finish) override; |
7c673cae | 226 | |
11fdf7f2 | 227 | uint64_t append_journal_event(bool synchronous) override; |
7c673cae | 228 | void update_stats(size_t length) override; |
11fdf7f2 | 229 | |
9f95a23c TL |
230 | int prune_object_extents( |
231 | LightweightObjectExtents* object_extents) const override; | |
11fdf7f2 | 232 | |
7c673cae | 233 | private: |
11fdf7f2 | 234 | uint32_t m_discard_granularity_bytes; |
7c673cae FG |
235 | }; |
236 | ||
237 | template <typename ImageCtxT = ImageCtx> | |
238 | class ImageFlushRequest : public ImageRequest<ImageCtxT> { | |
239 | public: | |
31f18b77 | 240 | ImageFlushRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, |
11fdf7f2 TL |
241 | FlushSource flush_source, |
242 | const ZTracer::Trace &parent_trace) | |
f67539c2 TL |
243 | : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {}, {}, "flush", |
244 | parent_trace), | |
11fdf7f2 | 245 | m_flush_source(flush_source) { |
7c673cae FG |
246 | } |
247 | ||
248 | protected: | |
249 | using typename ImageRequest<ImageCtxT>::ObjectRequests; | |
250 | ||
11fdf7f2 TL |
251 | void update_timestamp() override { |
252 | } | |
7c673cae | 253 | void send_request() override; |
7c673cae FG |
254 | |
255 | aio_type_t get_aio_type() const override { | |
256 | return AIO_TYPE_FLUSH; | |
257 | } | |
258 | const char *get_request_type() const override { | |
259 | return "aio_flush"; | |
260 | } | |
11fdf7f2 TL |
261 | |
262 | private: | |
263 | FlushSource m_flush_source; | |
264 | ||
7c673cae FG |
265 | }; |
266 | ||
267 | template <typename ImageCtxT = ImageCtx> | |
268 | class ImageWriteSameRequest : public AbstractImageWriteRequest<ImageCtxT> { | |
269 | public: | |
270 | ImageWriteSameRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, | |
11fdf7f2 | 271 | Extents&& image_extents, bufferlist &&bl, |
f67539c2 TL |
272 | IOContext io_context, int op_flags, |
273 | const ZTracer::Trace &parent_trace) | |
31f18b77 | 274 | : AbstractImageWriteRequest<ImageCtxT>( |
f67539c2 | 275 | image_ctx, aio_comp, std::move(image_extents), io_context, "writesame", |
11fdf7f2 | 276 | parent_trace), |
7c673cae FG |
277 | m_data_bl(std::move(bl)), m_op_flags(op_flags) { |
278 | } | |
279 | ||
280 | protected: | |
281 | using typename ImageRequest<ImageCtxT>::ObjectRequests; | |
7c673cae FG |
282 | |
283 | aio_type_t get_aio_type() const override { | |
284 | return AIO_TYPE_WRITESAME; | |
285 | } | |
286 | const char *get_request_type() const override { | |
287 | return "aio_writesame"; | |
288 | } | |
289 | ||
11fdf7f2 | 290 | ObjectDispatchSpec *create_object_request( |
f67539c2 | 291 | const LightweightObjectExtent &object_extent, IOContext io_context, |
9f95a23c | 292 | uint64_t journal_tid, bool single_extent, Context *on_finish) override; |
7c673cae | 293 | |
11fdf7f2 | 294 | uint64_t append_journal_event(bool synchronous) override; |
7c673cae FG |
295 | void update_stats(size_t length) override; |
296 | private: | |
297 | bufferlist m_data_bl; | |
298 | int m_op_flags; | |
299 | }; | |
300 | ||
c07f9fc5 FG |
301 | template <typename ImageCtxT = ImageCtx> |
302 | class ImageCompareAndWriteRequest : public AbstractImageWriteRequest<ImageCtxT> { | |
303 | public: | |
304 | using typename ImageRequest<ImageCtxT>::ObjectRequests; | |
c07f9fc5 FG |
305 | |
306 | ImageCompareAndWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, | |
307 | Extents &&image_extents, bufferlist &&cmp_bl, | |
308 | bufferlist &&bl, uint64_t *mismatch_offset, | |
f67539c2 TL |
309 | IOContext io_context, int op_flags, |
310 | const ZTracer::Trace &parent_trace) | |
c07f9fc5 | 311 | : AbstractImageWriteRequest<ImageCtxT>( |
f67539c2 TL |
312 | image_ctx, aio_comp, std::move(image_extents), io_context, |
313 | "compare_and_write", parent_trace), | |
c07f9fc5 FG |
314 | m_cmp_bl(std::move(cmp_bl)), m_bl(std::move(bl)), |
315 | m_mismatch_offset(mismatch_offset), m_op_flags(op_flags) { | |
316 | } | |
317 | ||
318 | protected: | |
9f95a23c | 319 | void assemble_extent(const LightweightObjectExtent &object_extent, |
39ae355f | 320 | bufferlist *bl, bufferlist *cmp_bl); |
c07f9fc5 | 321 | |
11fdf7f2 | 322 | ObjectDispatchSpec *create_object_request( |
f67539c2 | 323 | const LightweightObjectExtent &object_extent, IOContext io_context, |
9f95a23c | 324 | uint64_t journal_tid, bool single_extent, Context *on_finish) override; |
c07f9fc5 | 325 | |
11fdf7f2 | 326 | uint64_t append_journal_event(bool synchronous) override; |
c07f9fc5 FG |
327 | void update_stats(size_t length) override; |
328 | ||
329 | aio_type_t get_aio_type() const override { | |
330 | return AIO_TYPE_COMPARE_AND_WRITE; | |
331 | } | |
332 | const char *get_request_type() const override { | |
333 | return "aio_compare_and_write"; | |
334 | } | |
335 | ||
9f95a23c TL |
336 | int prune_object_extents( |
337 | LightweightObjectExtents* object_extents) const override; | |
11fdf7f2 | 338 | |
c07f9fc5 FG |
339 | private: |
340 | bufferlist m_cmp_bl; | |
341 | bufferlist m_bl; | |
342 | uint64_t *m_mismatch_offset; | |
343 | int m_op_flags; | |
344 | }; | |
345 | ||
f67539c2 TL |
346 | template <typename ImageCtxT = ImageCtx> |
347 | class ImageListSnapsRequest : public ImageRequest<ImageCtxT> { | |
348 | public: | |
349 | using typename ImageRequest<ImageCtxT>::Extents; | |
350 | ||
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); | |
355 | ||
356 | protected: | |
357 | void update_timestamp() override {} | |
358 | void send_request() override; | |
359 | ||
360 | aio_type_t get_aio_type() const override { | |
361 | return AIO_TYPE_GENERIC; | |
362 | } | |
363 | const char *get_request_type() const override { | |
364 | return "list-snaps"; | |
365 | } | |
366 | ||
367 | private: | |
368 | SnapIds m_snap_ids; | |
369 | int m_list_snaps_flags; | |
370 | SnapshotDelta* m_snapshot_delta; | |
371 | }; | |
372 | ||
7c673cae FG |
373 | } // namespace io |
374 | } // namespace librbd | |
375 | ||
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>; | |
c07f9fc5 | 383 | extern template class librbd::io::ImageCompareAndWriteRequest<librbd::ImageCtx>; |
f67539c2 | 384 | extern template class librbd::io::ImageListSnapsRequest<librbd::ImageCtx>; |
7c673cae FG |
385 | |
386 | #endif // CEPH_LIBRBD_IO_IMAGE_REQUEST_H |