namespace io {
class AioCompletion;
-class ObjectRequestHandle;
+class ObjectDispatchSpec;
class ReadResult;
template <typename ImageCtxT = ImageCtx>
m_trace.event("finish");
}
- static ImageRequest* create_read_request(ImageCtxT &image_ctx,
- AioCompletion *aio_comp,
- Extents &&image_extents,
- ReadResult &&read_result,
- int op_flags,
- const ZTracer::Trace &parent_trace);
- static ImageRequest* create_write_request(ImageCtxT &image_ctx,
- AioCompletion *aio_comp,
- Extents &&image_extents,
- bufferlist &&bl, int op_flags,
- const ZTracer::Trace &parent_trace);
- static ImageRequest* create_discard_request(ImageCtxT &image_ctx,
- AioCompletion *aio_comp,
- uint64_t off, uint64_t len,
- bool skip_partial_discard,
- const ZTracer::Trace &parent_trace);
- static ImageRequest* create_flush_request(ImageCtxT &image_ctx,
- AioCompletion *aio_comp,
- const ZTracer::Trace &parent_trace);
- static ImageRequest* create_writesame_request(ImageCtxT &image_ctx,
- AioCompletion *aio_comp,
- uint64_t off, uint64_t len,
- bufferlist &&bl, int op_flags,
- const ZTracer::Trace &parent_trace);
- static ImageRequest* create_compare_and_write_request(
- ImageCtxT &image_ctx, AioCompletion *c, Extents &&image_extents,
- bufferlist &&cmp_bl, bufferlist &&bl, uint64_t *mismatch_offset,
- int op_flags, const ZTracer::Trace &parent_trace);
-
static void aio_read(ImageCtxT *ictx, AioCompletion *c,
Extents &&image_extents, ReadResult &&read_result,
int op_flags, const ZTracer::Trace &parent_trace);
static void aio_write(ImageCtxT *ictx, AioCompletion *c,
Extents &&image_extents, bufferlist &&bl, int op_flags,
const ZTracer::Trace &parent_trace);
- static void aio_discard(ImageCtxT *ictx, AioCompletion *c, uint64_t off,
- uint64_t len, bool skip_partial_discard,
- const ZTracer::Trace &parent_trace);
+ static void aio_discard(ImageCtxT *ictx, AioCompletion *c,
+ Extents &&image_extents,
+ uint32_t discard_granularity_bytes,
+ const ZTracer::Trace &parent_trace);
static void aio_flush(ImageCtxT *ictx, AioCompletion *c,
- const ZTracer::Trace &parent_trace);
- static void aio_writesame(ImageCtxT *ictx, AioCompletion *c, uint64_t off,
- uint64_t len, bufferlist &&bl, int op_flags,
- const ZTracer::Trace &parent_trace);
+ 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);
static void aio_compare_and_write(ImageCtxT *ictx, AioCompletion *c,
Extents &&image_extents, bufferlist &&cmp_bl,
bufferlist &&bl, uint64_t *mismatch_offset,
int op_flags, const ZTracer::Trace &parent_trace);
- virtual bool is_write_op() const {
- return false;
- }
-
- void start_op();
-
void send();
- void fail(int r);
void set_bypass_image_cache() {
m_bypass_image_cache = true;
}
protected:
- typedef std::list<ObjectRequestHandle *> ObjectRequests;
+ typedef std::list<ObjectDispatchSpec*> ObjectRequests;
ImageCtxT &m_image_ctx;
AioCompletion *m_aio_comp;
m_trace(util::create_trace(image_ctx, trace_name, parent_trace)) {
m_trace.event("start");
}
-
+
virtual int clip_request();
+ virtual void update_timestamp();
virtual void send_request() = 0;
virtual void send_image_cache_request() = 0;
return "aio_read";
}
private:
- char *m_buf;
- bufferlist *m_pbl;
int m_op_flags;
};
template <typename ImageCtxT = ImageCtx>
class AbstractImageWriteRequest : public ImageRequest<ImageCtxT> {
public:
- bool is_write_op() const override {
- return true;
- }
-
inline void flag_synchronous() {
m_synchronous = true;
}
void send_request() override;
- virtual int prune_object_extents(ObjectExtents &object_extents) {
+ virtual int prune_object_extents(ObjectExtents* object_extents) const {
return 0;
}
- virtual uint32_t get_object_cache_request_count() const {
- return 0;
- }
- virtual void send_object_cache_requests(const ObjectExtents &object_extents,
- uint64_t journal_tid) = 0;
- virtual void send_object_requests(const ObjectExtents &object_extents,
- const ::SnapContext &snapc,
- ObjectRequests *object_requests);
- virtual ObjectRequestHandle *create_object_request(
+ void send_object_requests(const ObjectExtents &object_extents,
+ const ::SnapContext &snapc, uint64_t journal_tid);
+ virtual ObjectDispatchSpec *create_object_request(
const ObjectExtent &object_extent, const ::SnapContext &snapc,
- Context *on_finish) = 0;
+ uint64_t journal_tid, Context *on_finish) = 0;
- virtual uint64_t append_journal_event(const ObjectRequests &requests,
- bool synchronous) = 0;
+ virtual uint64_t append_journal_event(bool synchronous) = 0;
virtual void update_stats(size_t length) = 0;
private:
void send_image_cache_request() override;
- void send_object_cache_requests(const ObjectExtents &object_extents,
- uint64_t journal_tid) override;
- void send_object_requests(const ObjectExtents &object_extents,
- const ::SnapContext &snapc,
- ObjectRequests *aio_object_requests) override;
-
- ObjectRequestHandle *create_object_request(
+ ObjectDispatchSpec *create_object_request(
const ObjectExtent &object_extent, const ::SnapContext &snapc,
- Context *on_finish) override;
+ uint64_t journal_tid, Context *on_finish) override;
- uint64_t append_journal_event(const ObjectRequests &requests,
- bool synchronous) override;
+ uint64_t append_journal_event(bool synchronous) override;
void update_stats(size_t length) override;
private:
class ImageDiscardRequest : public AbstractImageWriteRequest<ImageCtxT> {
public:
ImageDiscardRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- uint64_t off, uint64_t len, bool skip_partial_discard,
- const ZTracer::Trace &parent_trace)
+ Extents&& image_extents,
+ uint32_t discard_granularity_bytes,
+ const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, {{off, len}}, "discard", parent_trace),
- m_skip_partial_discard(skip_partial_discard) {
+ image_ctx, aio_comp, std::move(image_extents), "discard", parent_trace),
+ m_discard_granularity_bytes(discard_granularity_bytes) {
}
protected:
return "aio_discard";
}
- int prune_object_extents(ObjectExtents &object_extents) override;
-
void send_image_cache_request() override;
- uint32_t get_object_cache_request_count() const override;
- void send_object_cache_requests(const ObjectExtents &object_extents,
- uint64_t journal_tid) override;
-
- ObjectRequestHandle *create_object_request(
+ ObjectDispatchSpec *create_object_request(
const ObjectExtent &object_extent, const ::SnapContext &snapc,
- Context *on_finish) override;
+ uint64_t journal_tid, Context *on_finish) override;
- uint64_t append_journal_event(const ObjectRequests &requests,
- bool synchronous) override;
+ uint64_t append_journal_event(bool synchronous) override;
void update_stats(size_t length) override;
+
+ int prune_object_extents(ObjectExtents* object_extents) const override;
+
private:
- bool m_skip_partial_discard;
+ uint32_t m_discard_granularity_bytes;
};
template <typename ImageCtxT = ImageCtx>
class ImageFlushRequest : public ImageRequest<ImageCtxT> {
public:
ImageFlushRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- const ZTracer::Trace &parent_trace)
- : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {}, "flush", parent_trace) {
- }
-
- bool is_write_op() const override {
- return true;
+ FlushSource flush_source,
+ const ZTracer::Trace &parent_trace)
+ : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {}, "flush", parent_trace),
+ m_flush_source(flush_source) {
}
protected:
int clip_request() override {
return 0;
}
+ void update_timestamp() override {
+ }
void send_request() override;
void send_image_cache_request() override;
const char *get_request_type() const override {
return "aio_flush";
}
+
+private:
+ FlushSource m_flush_source;
+
};
template <typename ImageCtxT = ImageCtx>
class ImageWriteSameRequest : public AbstractImageWriteRequest<ImageCtxT> {
public:
ImageWriteSameRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- uint64_t off, uint64_t len, bufferlist &&bl,
+ Extents&& image_extents, bufferlist &&bl,
int op_flags, const ZTracer::Trace &parent_trace)
: AbstractImageWriteRequest<ImageCtxT>(
- image_ctx, aio_comp, {{off, len}}, "writesame", parent_trace),
+ image_ctx, aio_comp, std::move(image_extents), "writesame",
+ parent_trace),
m_data_bl(std::move(bl)), m_op_flags(op_flags) {
}
return "aio_writesame";
}
- bool assemble_writesame_extent(const ObjectExtent &object_extent,
- bufferlist *bl, bool force_write);
-
void send_image_cache_request() override;
- void send_object_cache_requests(const ObjectExtents &object_extents,
- uint64_t journal_tid) override;
-
- void send_object_requests(const ObjectExtents &object_extents,
- const ::SnapContext &snapc,
- ObjectRequests *object_requests) override;
- ObjectRequestHandle *create_object_request(
+ ObjectDispatchSpec *create_object_request(
const ObjectExtent &object_extent, const ::SnapContext &snapc,
- Context *on_finish) override;
+ uint64_t journal_tid, Context *on_finish) override;
- uint64_t append_journal_event(const ObjectRequests &requests,
- bool synchronous) override;
+ uint64_t append_journal_event(bool synchronous) override;
void update_stats(size_t length) override;
private:
bufferlist m_data_bl;
protected:
void send_image_cache_request() override;
- uint32_t get_object_cache_request_count() const override;
- void send_object_cache_requests(const ObjectExtents &object_extents,
- uint64_t journal_tid) override;
-
void assemble_extent(const ObjectExtent &object_extent, bufferlist *bl);
- ObjectRequestHandle *create_object_request(const ObjectExtent &object_extent,
- const ::SnapContext &snapc,
- Context *on_finish) override;
+ ObjectDispatchSpec *create_object_request(
+ const ObjectExtent &object_extent, const ::SnapContext &snapc,
+ uint64_t journal_tid, Context *on_finish) override;
- uint64_t append_journal_event(const ObjectRequests &requests,
- bool synchronous) override;
+ uint64_t append_journal_event(bool synchronous) override;
void update_stats(size_t length) override;
aio_type_t get_aio_type() const override {
return "aio_compare_and_write";
}
- int prune_object_extents(ObjectExtents &object_extents) override;
+ int prune_object_extents(ObjectExtents* object_extents) const override;
+
private:
bufferlist m_cmp_bl;
bufferlist m_bl;