]> git.proxmox.com Git - ceph.git/blame - ceph/src/librbd/io/ImageRequest.h
import ceph quincy 17.2.6
[ceph.git] / ceph / src / librbd / io / ImageRequest.h
CommitLineData
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
18namespace librbd {
19class ImageCtx;
20
21namespace io {
22
23class AioCompletion;
11fdf7f2 24class ObjectDispatchSpec;
7c673cae
FG
25class ReadResult;
26
27template <typename ImageCtxT = ImageCtx>
28class ImageRequest {
29public:
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 70protected:
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
96template <typename ImageCtxT = ImageCtx>
97class ImageReadRequest : public ImageRequest<ImageCtxT> {
98public:
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
106protected:
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 }
115private:
7c673cae 116 int m_op_flags;
f67539c2 117 int m_read_flags;
7c673cae
FG
118};
119
120template <typename ImageCtxT = ImageCtx>
121class AbstractImageWriteRequest : public ImageRequest<ImageCtxT> {
122public:
7c673cae
FG
123 inline void flag_synchronous() {
124 m_synchronous = true;
125 }
126
127protected:
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
156private:
157 bool m_synchronous;
158};
159
160template <typename ImageCtxT = ImageCtx>
161class ImageWriteRequest : public AbstractImageWriteRequest<ImageCtxT> {
162public:
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
175protected:
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
195private:
196 bufferlist m_bl;
197 int m_op_flags;
198};
199
200template <typename ImageCtxT = ImageCtx>
201class ImageDiscardRequest : public AbstractImageWriteRequest<ImageCtxT> {
202public:
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
213protected:
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 233private:
11fdf7f2 234 uint32_t m_discard_granularity_bytes;
7c673cae
FG
235};
236
237template <typename ImageCtxT = ImageCtx>
238class ImageFlushRequest : public ImageRequest<ImageCtxT> {
239public:
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
248protected:
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
262private:
263 FlushSource m_flush_source;
264
7c673cae
FG
265};
266
267template <typename ImageCtxT = ImageCtx>
268class ImageWriteSameRequest : public AbstractImageWriteRequest<ImageCtxT> {
269public:
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
280protected:
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;
296private:
297 bufferlist m_data_bl;
298 int m_op_flags;
299};
300
c07f9fc5
FG
301template <typename ImageCtxT = ImageCtx>
302class ImageCompareAndWriteRequest : public AbstractImageWriteRequest<ImageCtxT> {
303public:
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
318protected:
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
339private:
340 bufferlist m_cmp_bl;
341 bufferlist m_bl;
342 uint64_t *m_mismatch_offset;
343 int m_op_flags;
344};
345
f67539c2
TL
346template <typename ImageCtxT = ImageCtx>
347class ImageListSnapsRequest : public ImageRequest<ImageCtxT> {
348public:
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
356protected:
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
367private:
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
376extern template class librbd::io::ImageRequest<librbd::ImageCtx>;
377extern template class librbd::io::ImageReadRequest<librbd::ImageCtx>;
378extern template class librbd::io::AbstractImageWriteRequest<librbd::ImageCtx>;
379extern template class librbd::io::ImageWriteRequest<librbd::ImageCtx>;
380extern template class librbd::io::ImageDiscardRequest<librbd::ImageCtx>;
381extern template class librbd::io::ImageFlushRequest<librbd::ImageCtx>;
382extern template class librbd::io::ImageWriteSameRequest<librbd::ImageCtx>;
c07f9fc5 383extern template class librbd::io::ImageCompareAndWriteRequest<librbd::ImageCtx>;
f67539c2 384extern template class librbd::io::ImageListSnapsRequest<librbd::ImageCtx>;
7c673cae
FG
385
386#endif // CEPH_LIBRBD_IO_IMAGE_REQUEST_H