#include "include/int_types.h"
#include "include/buffer_fwd.h"
-#include "common/snap_types.h"
#include "common/zipkin_trace.h"
#include "osd/osd_types.h"
#include "librbd/Utils.h"
+#include "librbd/Types.h"
#include "librbd/io/Types.h"
#include <list>
#include <utility>
static void aio_read(ImageCtxT *ictx, AioCompletion *c,
Extents &&image_extents, ReadResult &&read_result,
- int op_flags, const ZTracer::Trace &parent_trace);
+ IOContext io_context, int op_flags, int read_flags,
+ const ZTracer::Trace &parent_trace);
static void aio_write(ImageCtxT *ictx, AioCompletion *c,
- Extents &&image_extents, bufferlist &&bl, int op_flags,
+ Extents &&image_extents, bufferlist &&bl,
+ IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace);
static void aio_discard(ImageCtxT *ictx, AioCompletion *c,
Extents &&image_extents,
uint32_t discard_granularity_bytes,
+ IOContext io_context,
const ZTracer::Trace &parent_trace);
static void aio_flush(ImageCtxT *ictx, AioCompletion *c,
FlushSource flush_source,
const ZTracer::Trace &parent_trace);
static void aio_writesame(ImageCtxT *ictx, AioCompletion *c,
Extents &&image_extents, bufferlist &&bl,
- int op_flags, const ZTracer::Trace &parent_trace);
+ IOContext io_context, int op_flags,
+ const ZTracer::Trace &parent_trace);
static void aio_compare_and_write(ImageCtxT *ictx, AioCompletion *c,
- Extents &&image_extents, bufferlist &&cmp_bl,
+ Extents &&image_extents,
+ bufferlist &&cmp_bl,
bufferlist &&bl, uint64_t *mismatch_offset,
- int op_flags, const ZTracer::Trace &parent_trace);
+ IOContext io_context, int op_flags,
+ const ZTracer::Trace &parent_trace);
void send();
- void set_bypass_image_cache() {
- m_bypass_image_cache = true;
- }
-
inline const ZTracer::Trace &get_trace() const {
return m_trace;
}
ImageCtxT &m_image_ctx;
AioCompletion *m_aio_comp;
Extents m_image_extents;
+ IOContext m_io_context;
ZTracer::Trace m_trace;
- bool m_bypass_image_cache = false;
ImageRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents, const char *trace_name,
+ Extents &&image_extents, IOContext io_context,
+ const char *trace_name,
const ZTracer::Trace &parent_trace)
: m_image_ctx(image_ctx), m_aio_comp(aio_comp),
- m_image_extents(std::move(image_extents)),
+ m_image_extents(std::move(image_extents)), m_io_context(io_context),
m_trace(librbd::util::create_trace(image_ctx, trace_name, parent_trace)) {
m_trace.event("start");
}
- virtual bool finish_request_early() {
- return false;
- }
- virtual int clip_request();
virtual void update_timestamp();
virtual void send_request() = 0;
- virtual void send_image_cache_request() = 0;
virtual aio_type_t get_aio_type() const = 0;
virtual const char *get_request_type() const = 0;
ImageReadRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
Extents &&image_extents, ReadResult &&read_result,
- int op_flags, const ZTracer::Trace &parent_trace);
+ IOContext io_context, int op_flags, int read_flags,
+ const ZTracer::Trace &parent_trace);
protected:
- int clip_request() override;
-
void send_request() override;
- void send_image_cache_request() override;
aio_type_t get_aio_type() const override {
return AIO_TYPE_READ;
}
private:
int m_op_flags;
+ int m_read_flags;
};
template <typename ImageCtxT = ImageCtx>
using typename ImageRequest<ImageCtxT>::Extents;
AbstractImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents, const char *trace_name,
+ Extents &&image_extents, IOContext io_context,
+ const char *trace_name,
const ZTracer::Trace &parent_trace)
: ImageRequest<ImageCtxT>(image_ctx, aio_comp, std::move(image_extents),
- trace_name, parent_trace),
+ io_context, trace_name, parent_trace),
m_synchronous(false) {
}
void send_request() override;
- bool finish_request_early() override;
virtual int prune_object_extents(
LightweightObjectExtents* object_extents) const {
}
void send_object_requests(const LightweightObjectExtents &object_extents,
- const ::SnapContext &snapc, uint64_t journal_tid);
+ IOContext io_context, uint64_t journal_tid);
virtual ObjectDispatchSpec *create_object_request(
- const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, IOContext io_context,
uint64_t journal_tid, bool single_extent, Context *on_finish) = 0;
virtual uint64_t append_journal_event(bool synchronous) = 0;
using typename ImageRequest<ImageCtxT>::Extents;
ImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents, bufferlist &&bl, int op_flags,
+ Extents &&image_extents, bufferlist &&bl,
+ IOContext io_context, int op_flags,
const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, std::move(image_extents), "write", parent_trace),
+ image_ctx, aio_comp, std::move(image_extents), io_context, "write",
+ parent_trace),
m_bl(std::move(bl)), m_op_flags(op_flags) {
}
void assemble_extent(const LightweightObjectExtent &object_extent,
bufferlist *bl);
- void send_image_cache_request() override;
-
-
ObjectDispatchSpec *create_object_request(
- const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, IOContext io_context,
uint64_t journal_tid, bool single_extent, Context *on_finish) override;
uint64_t append_journal_event(bool synchronous) override;
public:
ImageDiscardRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
Extents&& image_extents,
- uint32_t discard_granularity_bytes,
+ uint32_t discard_granularity_bytes, IOContext io_context,
const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, std::move(image_extents), "discard", parent_trace),
+ image_ctx, aio_comp, std::move(image_extents), io_context, "discard",
+ parent_trace),
m_discard_granularity_bytes(discard_granularity_bytes) {
}
return "aio_discard";
}
- void send_image_cache_request() override;
-
ObjectDispatchSpec *create_object_request(
- const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, IOContext io_context,
uint64_t journal_tid, bool single_extent, Context *on_finish) override;
uint64_t append_journal_event(bool synchronous) override;
ImageFlushRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
FlushSource flush_source,
const ZTracer::Trace &parent_trace)
- : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {}, "flush", parent_trace),
+ : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {}, {}, "flush",
+ parent_trace),
m_flush_source(flush_source) {
}
protected:
using typename ImageRequest<ImageCtxT>::ObjectRequests;
- int clip_request() override {
- return 0;
- }
void update_timestamp() override {
}
void send_request() override;
- void send_image_cache_request() override;
aio_type_t get_aio_type() const override {
return AIO_TYPE_FLUSH;
public:
ImageWriteSameRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
Extents&& image_extents, bufferlist &&bl,
- int op_flags, const ZTracer::Trace &parent_trace)
+ IOContext io_context, int op_flags,
+ const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, std::move(image_extents), "writesame",
+ image_ctx, aio_comp, std::move(image_extents), io_context, "writesame",
parent_trace),
m_data_bl(std::move(bl)), m_op_flags(op_flags) {
}
return "aio_writesame";
}
- void send_image_cache_request() override;
-
ObjectDispatchSpec *create_object_request(
- const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, IOContext io_context,
uint64_t journal_tid, bool single_extent, Context *on_finish) override;
uint64_t append_journal_event(bool synchronous) override;
ImageCompareAndWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
Extents &&image_extents, bufferlist &&cmp_bl,
bufferlist &&bl, uint64_t *mismatch_offset,
- int op_flags, const ZTracer::Trace &parent_trace)
+ IOContext io_context, int op_flags,
+ const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, std::move(image_extents), "compare_and_write", parent_trace),
+ image_ctx, aio_comp, std::move(image_extents), io_context,
+ "compare_and_write", parent_trace),
m_cmp_bl(std::move(cmp_bl)), m_bl(std::move(bl)),
m_mismatch_offset(mismatch_offset), m_op_flags(op_flags) {
}
protected:
- void send_image_cache_request() override;
-
void assemble_extent(const LightweightObjectExtent &object_extent,
bufferlist *bl);
ObjectDispatchSpec *create_object_request(
- const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, IOContext io_context,
uint64_t journal_tid, bool single_extent, Context *on_finish) override;
uint64_t append_journal_event(bool synchronous) override;
int m_op_flags;
};
+template <typename ImageCtxT = ImageCtx>
+class ImageListSnapsRequest : public ImageRequest<ImageCtxT> {
+public:
+ using typename ImageRequest<ImageCtxT>::Extents;
+
+ ImageListSnapsRequest(
+ ImageCtxT& image_ctx, AioCompletion* aio_comp,
+ Extents&& image_extents, SnapIds&& snap_ids, int list_snaps_flags,
+ SnapshotDelta* snapshot_delta, const ZTracer::Trace& parent_trace);
+
+protected:
+ void update_timestamp() override {}
+ void send_request() override;
+
+ aio_type_t get_aio_type() const override {
+ return AIO_TYPE_GENERIC;
+ }
+ const char *get_request_type() const override {
+ return "list-snaps";
+ }
+
+private:
+ SnapIds m_snap_ids;
+ int m_list_snaps_flags;
+ SnapshotDelta* m_snapshot_delta;
+};
+
} // namespace io
} // namespace librbd
extern template class librbd::io::ImageFlushRequest<librbd::ImageCtx>;
extern template class librbd::io::ImageWriteSameRequest<librbd::ImageCtx>;
extern template class librbd::io::ImageCompareAndWriteRequest<librbd::ImageCtx>;
+extern template class librbd::io::ImageListSnapsRequest<librbd::ImageCtx>;
#endif // CEPH_LIBRBD_IO_IMAGE_REQUEST_H