From eb8dda5296eb5c19aa27e96d6e92eaa0c352cb62 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 12 May 2016 21:22:56 -0400 Subject: [PATCH] librbd: track IO in the order issued Fixes: http://tracker.ceph.com/issues/15034 Signed-off-by: Jason Dillaman --- src/librbd/AioCompletion.cc | 2 +- src/librbd/AioImageRequest.cc | 14 ++++++++++---- src/librbd/AioImageRequest.h | 4 ++++ src/librbd/AioImageRequestWQ.cc | 2 ++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/librbd/AioCompletion.cc b/src/librbd/AioCompletion.cc index d60dbcad92d60..db4b2ca74febe 100644 --- a/src/librbd/AioCompletion.cc +++ b/src/librbd/AioCompletion.cc @@ -139,7 +139,7 @@ namespace librbd { Mutex::Locker locker(lock); assert(ictx != nullptr); assert(!async_op.started()); - if (state == STATE_PENDING) { + if (state == STATE_PENDING && aio_type != AIO_TYPE_FLUSH) { async_op.start_op(*ictx); } } diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc index 08311b18e47ca..3b2868801da18 100644 --- a/src/librbd/AioImageRequest.cc +++ b/src/librbd/AioImageRequest.cc @@ -83,7 +83,9 @@ void AioImageRequest::aio_read( const std::vector > &extents, char *buf, bufferlist *pbl, int op_flags) { c->init_time(ictx, librbd::AIO_TYPE_READ); + AioImageRead req(*ictx, c, extents, buf, pbl, op_flags); + req.start_op(); req.send(); } @@ -92,7 +94,9 @@ void AioImageRequest::aio_read(I *ictx, AioCompletion *c, uint64_t off, size_t len, char *buf, bufferlist *pbl, int op_flags) { c->init_time(ictx, librbd::AIO_TYPE_READ); + AioImageRead req(*ictx, c, off, len, buf, pbl, op_flags); + req.start_op(); req.send(); } @@ -101,7 +105,9 @@ void AioImageRequest::aio_write(I *ictx, AioCompletion *c, uint64_t off, size_t len, const char *buf, int op_flags) { c->init_time(ictx, librbd::AIO_TYPE_WRITE); + AioImageWrite req(*ictx, c, off, len, buf, op_flags); + req.start_op(); req.send(); } @@ -109,14 +115,18 @@ template void AioImageRequest::aio_discard(I *ictx, AioCompletion *c, uint64_t off, uint64_t len) { c->init_time(ictx, librbd::AIO_TYPE_DISCARD); + AioImageDiscard req(*ictx, c, off, len); + req.start_op(); req.send(); } template void AioImageRequest::aio_flush(I *ictx, AioCompletion *c) { c->init_time(ictx, librbd::AIO_TYPE_FLUSH); + AioImageFlush req(*ictx, c); + req.start_op(); req.send(); } @@ -174,8 +184,6 @@ void AioImageRead::send_request() { object_extents, buffer_ofs); buffer_ofs += len; } - - m_aio_comp->start_op(); } m_aio_comp->read_buf = m_buf; @@ -247,7 +255,6 @@ void AbstractAioImageWrite::send_request() { } snapc = m_image_ctx.snapc; - m_aio_comp->start_op(); // map to object extents if (clip_len > 0) { @@ -465,7 +472,6 @@ void AioImageFlush::send_request() { C_AioRequest *req_comp = new C_AioRequest(m_aio_comp); m_image_ctx.flush(req_comp); - m_aio_comp->start_op(); m_aio_comp->put(); m_image_ctx.perfcounter->inc(l_librbd_aio_flush); diff --git a/src/librbd/AioImageRequest.h b/src/librbd/AioImageRequest.h index 50e70de22ee5f..b30cc30f417a7 100644 --- a/src/librbd/AioImageRequest.h +++ b/src/librbd/AioImageRequest.h @@ -40,6 +40,10 @@ public: return false; } + void start_op() { + m_aio_comp->start_op(); + } + void send(); void fail(int r); diff --git a/src/librbd/AioImageRequestWQ.cc b/src/librbd/AioImageRequestWQ.cc index 263746c0e11bc..279b3770dc0cb 100644 --- a/src/librbd/AioImageRequestWQ.cc +++ b/src/librbd/AioImageRequestWQ.cc @@ -341,6 +341,8 @@ void *AioImageRequestWQ::_void_dequeue() { get_pool_lock().Lock(); return nullptr; } + + item->start_op(); return item; } -- 2.39.5