From e0834d12e91bf085a5c9503f1c69a2bee2d21edf Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 22 Jun 2017 14:00:07 -0400 Subject: [PATCH] librbd: cleanup interface between IO work queue and IO requests This will help mock the testing of the IO work queue Signed-off-by: Jason Dillaman --- src/librbd/io/ImageRequest.cc | 42 +++++++++++++++++++++++++++++++++ src/librbd/io/ImageRequest.h | 25 ++++++++++++++++++++ src/librbd/io/ImageRequestWQ.cc | 19 ++++++++------- 3 files changed, 77 insertions(+), 9 deletions(-) diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index 80c7208a144..8afd6556a32 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -108,6 +108,48 @@ private: } // anonymous namespace +template +ImageRequest* ImageRequest::create_read_request( + I &image_ctx, AioCompletion *aio_comp, Extents &&image_extents, + ReadResult &&read_result, int op_flags, + const ZTracer::Trace &parent_trace) { + return new ImageReadRequest(image_ctx, aio_comp, + std::move(image_extents), + std::move(read_result), op_flags, + parent_trace); +} + +template +ImageRequest* ImageRequest::create_write_request( + I &image_ctx, AioCompletion *aio_comp, Extents &&image_extents, + bufferlist &&bl, int op_flags, const ZTracer::Trace &parent_trace) { + return new ImageWriteRequest(image_ctx, aio_comp, std::move(image_extents), + std::move(bl), op_flags, parent_trace); +} + +template +ImageRequest* ImageRequest::create_discard_request( + I &image_ctx, AioCompletion *aio_comp, uint64_t off, uint64_t len, + bool skip_partial_discard, const ZTracer::Trace &parent_trace) { + return new ImageDiscardRequest(image_ctx, aio_comp, off, len, + skip_partial_discard, parent_trace); +} + +template +ImageRequest* ImageRequest::create_flush_request( + I &image_ctx, AioCompletion *aio_comp, + const ZTracer::Trace &parent_trace) { + return new ImageFlushRequest(image_ctx, aio_comp, parent_trace); +} + +template +ImageRequest* ImageRequest::create_writesame_request( + I &image_ctx, AioCompletion *aio_comp, uint64_t off, uint64_t len, + bufferlist &&bl, int op_flags, const ZTracer::Trace &parent_trace) { + return new ImageWriteSameRequest(image_ctx, aio_comp, off, len, + std::move(bl), op_flags, parent_trace); +} + template void ImageRequest::aio_read(I *ictx, AioCompletion *c, Extents &&image_extents, diff --git a/src/librbd/io/ImageRequest.h b/src/librbd/io/ImageRequest.h index 21b88b098cf..de19f490c6f 100644 --- a/src/librbd/io/ImageRequest.h +++ b/src/librbd/io/ImageRequest.h @@ -33,6 +33,31 @@ public: 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 void aio_read(ImageCtxT *ictx, AioCompletion *c, Extents &&image_extents, ReadResult &&read_result, int op_flags, const ZTracer::Trace &parent_trace); diff --git a/src/librbd/io/ImageRequestWQ.cc b/src/librbd/io/ImageRequestWQ.cc index 593301c5abc..547c773e578 100644 --- a/src/librbd/io/ImageRequestWQ.cc +++ b/src/librbd/io/ImageRequestWQ.cc @@ -192,8 +192,9 @@ void ImageRequestWQ::aio_read(AioCompletion *c, uint64_t off, uint64_t len, RWLock::RLocker owner_locker(m_image_ctx.owner_lock); if (m_image_ctx.non_blocking_aio || writes_blocked() || !writes_empty() || require_lock_on_read()) { - queue(new ImageReadRequest(m_image_ctx, c, {{off, len}}, - std::move(read_result), op_flags, trace)); + queue(ImageRequest::create_read_request( + m_image_ctx, c, {{off, len}}, std::move(read_result), op_flags, + trace)); } else { c->start_op(); ImageRequest::aio_read(&m_image_ctx, c, {{off, len}}, @@ -229,8 +230,8 @@ void ImageRequestWQ::aio_write(AioCompletion *c, uint64_t off, uint64_t len, RWLock::RLocker owner_locker(m_image_ctx.owner_lock); if (m_image_ctx.non_blocking_aio || writes_blocked()) { - queue(new ImageWriteRequest(m_image_ctx, c, {{off, len}}, - std::move(bl), op_flags, trace)); + queue(ImageRequest::create_write_request( + m_image_ctx, c, {{off, len}}, std::move(bl), op_flags, trace)); } else { c->start_op(); ImageRequest::aio_write(&m_image_ctx, c, {{off, len}}, @@ -266,8 +267,8 @@ void ImageRequestWQ::aio_discard(AioCompletion *c, uint64_t off, RWLock::RLocker owner_locker(m_image_ctx.owner_lock); if (m_image_ctx.non_blocking_aio || writes_blocked()) { - queue(new ImageDiscardRequest(m_image_ctx, c, off, len, - skip_partial_discard, trace)); + queue(ImageRequest::create_discard_request( + m_image_ctx, c, off, len, skip_partial_discard, trace)); } else { c->start_op(); ImageRequest::aio_discard(&m_image_ctx, c, off, len, @@ -300,7 +301,7 @@ void ImageRequestWQ::aio_flush(AioCompletion *c, bool native_async) { RWLock::RLocker owner_locker(m_image_ctx.owner_lock); if (m_image_ctx.non_blocking_aio || writes_blocked() || !writes_empty()) { - queue(new ImageFlushRequest(m_image_ctx, c, trace)); + queue(ImageRequest::create_flush_request(m_image_ctx, c, trace)); } else { ImageRequest::aio_flush(&m_image_ctx, c, trace); finish_in_flight_io(); @@ -335,8 +336,8 @@ void ImageRequestWQ::aio_writesame(AioCompletion *c, uint64_t off, RWLock::RLocker owner_locker(m_image_ctx.owner_lock); if (m_image_ctx.non_blocking_aio || writes_blocked()) { - queue(new ImageWriteSameRequest(m_image_ctx, c, off, len, std::move(bl), - op_flags, trace)); + queue(ImageRequest::create_writesame_request( + m_image_ctx, c, off, len, std::move(bl), op_flags, trace)); } else { c->start_op(); ImageRequest::aio_writesame(&m_image_ctx, c, off, len, std::move(bl), -- 2.47.3