#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/io/Types.h"
#include <list>
#include <utility>
public:
typedef std::vector<std::pair<uint64_t,uint64_t> > Extents;
- virtual ~ImageRequest() {}
+ virtual ~ImageRequest() {
+ m_trace.event("finish");
+ }
static void aio_read(ImageCtxT *ictx, AioCompletion *c,
Extents &&image_extents, ReadResult &&read_result,
- int op_flags);
+ int op_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, 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);
- static void aio_flush(ImageCtxT *ictx, AioCompletion *c);
+ uint64_t len, bool skip_partial_discard,
+ 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);
+ uint64_t len, bufferlist &&bl, int op_flags,
+ const ZTracer::Trace &parent_trace);
virtual bool is_write_op() const {
return false;
m_bypass_image_cache = true;
}
+ inline const ZTracer::Trace &get_trace() const {
+ return m_trace;
+ }
+
protected:
typedef std::list<ObjectRequestHandle *> ObjectRequests;
ImageCtxT &m_image_ctx;
AioCompletion *m_aio_comp;
Extents m_image_extents;
+ ZTracer::Trace m_trace;
bool m_bypass_image_cache = false;
ImageRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents)
+ Extents &&image_extents, const char *trace_name,
+ const ZTracer::Trace &parent_trace)
: m_image_ctx(image_ctx), m_aio_comp(aio_comp),
- m_image_extents(image_extents) {
+ m_image_extents(std::move(image_extents)),
+ m_trace(util::create_trace(image_ctx, trace_name, parent_trace)) {
+ m_trace.event("start");
}
+
virtual int clip_request();
virtual void send_request() = 0;
ImageReadRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
Extents &&image_extents, ReadResult &&read_result,
- int op_flags);
+ int op_flags, const ZTracer::Trace &parent_trace);
protected:
int clip_request() override;
typedef std::vector<ObjectExtent> ObjectExtents;
AbstractImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents)
- : ImageRequest<ImageCtxT>(image_ctx, aio_comp, std::move(image_extents)),
+ Extents &&image_extents, const char *trace_name,
+ const ZTracer::Trace &parent_trace)
+ : ImageRequest<ImageCtxT>(image_ctx, aio_comp, std::move(image_extents),
+ trace_name, parent_trace),
m_synchronous(false) {
}
using typename ImageRequest<ImageCtxT>::Extents;
ImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents, bufferlist &&bl, int op_flags)
- : AbstractImageWriteRequest<ImageCtxT>(image_ctx, aio_comp,
- std::move(image_extents)),
+ Extents &&image_extents, bufferlist &&bl, int op_flags,
+ const ZTracer::Trace &parent_trace)
+ : AbstractImageWriteRequest<ImageCtxT>(
+ image_ctx, aio_comp, std::move(image_extents), "write", parent_trace),
m_bl(std::move(bl)), m_op_flags(op_flags) {
}
class ImageDiscardRequest : public AbstractImageWriteRequest<ImageCtxT> {
public:
ImageDiscardRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
- uint64_t off, uint64_t len, bool skip_partial_discard)
- : AbstractImageWriteRequest<ImageCtxT>(image_ctx, aio_comp, {{off, len}}),
+ uint64_t off, uint64_t len, bool skip_partial_discard,
+ const ZTracer::Trace &parent_trace)
+ : AbstractImageWriteRequest<ImageCtxT>(
+ image_ctx, aio_comp, {{off, len}}, "discard", parent_trace),
m_skip_partial_discard(skip_partial_discard) {
}
template <typename ImageCtxT = ImageCtx>
class ImageFlushRequest : public ImageRequest<ImageCtxT> {
public:
- ImageFlushRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp)
- : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {}) {
+ 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 {
public:
ImageWriteSameRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
uint64_t off, uint64_t len, bufferlist &&bl,
- int op_flags)
- : AbstractImageWriteRequest<ImageCtxT>(image_ctx, aio_comp, {{off, len}}),
+ int op_flags, const ZTracer::Trace &parent_trace)
+ : AbstractImageWriteRequest<ImageCtxT>(
+ image_ctx, aio_comp, {{off, len}}, "writesame", parent_trace),
m_data_bl(std::move(bl)), m_op_flags(op_flags) {
}