]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: track IO in the order issued
authorJason Dillaman <dillaman@redhat.com>
Fri, 13 May 2016 01:22:56 +0000 (21:22 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 7 Jun 2016 11:30:48 +0000 (07:30 -0400)
Fixes: http://tracker.ceph.com/issues/15034
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/AioCompletion.cc
src/librbd/AioImageRequest.cc
src/librbd/AioImageRequest.h
src/librbd/AioImageRequestWQ.cc

index d60dbcad92d60d3aa46a238da3e45984f5c1248d..db4b2ca74febeea8df8b1a9726d272bf0ff8bcc1 100644 (file)
@@ -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);
     }
   }
index 08311b18e47ca064c4cdcd683a1795d9168b9fda..3b2868801da18b8bcba6653a33acf405b3351878 100644 (file)
@@ -83,7 +83,9 @@ void AioImageRequest<I>::aio_read(
     const std::vector<std::pair<uint64_t,uint64_t> > &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<I>::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<I>::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 <typename I>
 void AioImageRequest<I>::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 <typename I>
 void AioImageRequest<I>::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);
index 50e70de22ee5ff85e475aff0e8d2721fedc70bc1..b30cc30f417a77e6470972ad1457ddc977f17187 100644 (file)
@@ -40,6 +40,10 @@ public:
     return false;
   }
 
+  void start_op() {
+    m_aio_comp->start_op();
+  }
+
   void send();
   void fail(int r);
 
index 263746c0e11bc542ee57e9925b9c1cd3e8eb60e8..279b3770dc0cbcf1dd4fd310d8b557efb0f949cf 100644 (file)
@@ -341,6 +341,8 @@ void *AioImageRequestWQ::_void_dequeue() {
     get_pool_lock().Lock();
     return nullptr;
   }
+
+  item->start_op();
   return item;
 }