]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: use the same IoCtx for each request
authorJosh Durgin <josh.durgin@inktank.com>
Wed, 27 Mar 2013 22:42:10 +0000 (15:42 -0700)
committerJosh Durgin <josh.durgin@inktank.com>
Thu, 28 Mar 2013 17:46:59 +0000 (10:46 -0700)
Before we were duplicating the IoCtx for each new request since they
could have a different snapshot context or read from a different
snapshot id. Since librados now supports setting these explicitly
for a given request, do that instead.

Since librados tracks outstanding requests on a per-IoCtx basis, this
also fixes a bug that causes flush() without caching to ignore
all the outstanding requests, since they were to separate,
duplicate IoCtxs.

Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
src/librbd/AioRequest.cc
src/librbd/AioRequest.h

index 95519fb372d5b34792349e1a1646d52b6b68fa4d..8d4d98c0bd0f150194d551e050be1dfd51ac552a 100644 (file)
@@ -19,7 +19,7 @@
 namespace librbd {
 
   AioRequest::AioRequest() :
-    m_ictx(NULL),
+    m_ictx(NULL), m_ioctx(NULL),
     m_object_no(0), m_object_off(0), m_object_len(0),
     m_snap_id(CEPH_NOSNAP), m_completion(NULL), m_parent_completion(NULL),
     m_hide_enoent(false) {}
@@ -27,19 +27,11 @@ namespace librbd {
                         uint64_t objectno, uint64_t off, uint64_t len,
                         librados::snap_t snap_id,
                         Context *completion,
-                        bool hide_enoent) {
-    m_ictx = ictx;
-    m_ioctx.dup(ictx->data_ctx);
-    m_ioctx.snap_set_read(snap_id);
-    m_oid = oid;
-    m_object_no = objectno;
-    m_object_off = off;
-    m_object_len = len;
-    m_snap_id = snap_id;
-    m_completion = completion;
-    m_parent_completion = NULL;
-    m_hide_enoent = hide_enoent;
-  }
+                        bool hide_enoent) :
+    m_ictx(ictx), m_ioctx(&ictx->data_ctx), m_oid(oid), m_object_no(objectno),
+    m_object_off(off), m_object_len(len), m_snap_id(snap_id),
+    m_completion(completion), m_parent_completion(NULL),
+    m_hide_enoent(hide_enoent) {}
 
   AioRequest::~AioRequest() {
     if (m_parent_completion) {
@@ -100,11 +92,13 @@ namespace librbd {
       librados::Rados::aio_create_completion(this, rados_req_cb, NULL);
     int r;
     if (m_sparse) {
-      r = m_ioctx.aio_sparse_read(m_oid, rados_completion, &m_ext_map,
-                                 &m_read_data, m_object_len, m_object_off);
+      r = m_ioctx->aio_sparse_read(m_oid, rados_completion, &m_ext_map,
+                                  &m_read_data, m_object_len, m_object_off,
+                                  m_snap_id);
     } else {
-      r = m_ioctx.aio_read(m_oid, rados_completion, &m_read_data,
-                          m_object_len, m_object_off);
+      r = m_ioctx->aio_read(m_oid, rados_completion, &m_read_data,
+                           m_object_len, m_object_off,
+                           m_snap_id);
     }
     rados_completion->release();
     return r;
@@ -123,18 +117,16 @@ namespace librbd {
                               Context *completion,
                               bool hide_enoent)
     : AioRequest(ictx, oid, object_no, object_off, len, snap_id, completion, hide_enoent),
-      m_state(LIBRBD_AIO_WRITE_FLAT)
+      m_state(LIBRBD_AIO_WRITE_FLAT), m_snap_seq(snapc.seq.val)
   {
     m_object_image_extents = objectx;
     m_parent_overlap = object_overlap;
 
     // TODO: find a way to make this less stupid
-    std::vector<librados::snap_t> snaps;
     for (std::vector<snapid_t>::const_iterator it = snapc.snaps.begin();
         it != snapc.snaps.end(); ++it) {
-      snaps.push_back(it->val);
+      m_snaps.push_back(it->val);
     }
-    m_ioctx.selfmanaged_snap_set_write_ctx(snapc.seq.val, snaps);
   }
 
   void AbstractWrite::guard_write()
@@ -235,7 +227,8 @@ namespace librbd {
       librados::Rados::aio_create_completion(this, NULL, rados_req_cb);
     int r;
     assert(m_write.size());
-    r = m_ioctx.aio_operate(m_oid, rados_completion, &m_write);
+    r = m_ioctx->aio_operate(m_oid, rados_completion, &m_write,
+                            m_snap_seq, m_snaps);
     rados_completion->release();
     return r;
   }
@@ -246,7 +239,8 @@ namespace librbd {
 
     librados::AioCompletion *rados_completion =
       librados::Rados::aio_create_completion(this, NULL, rados_req_cb);
-    m_ictx->md_ctx.aio_operate(m_oid, rados_completion, &m_copyup);
+    m_ictx->md_ctx.aio_operate(m_oid, rados_completion, &m_copyup,
+                              m_snap_seq, m_snaps);
     rados_completion->release();
   }
 }
index 259af88dda716d517aafee7a656c5c92fe8110c6..8ad15a4264c5e6c276c56f74c5f060d64abe32bc 100644 (file)
@@ -49,7 +49,7 @@ namespace librbd {
     void read_from_parent(vector<pair<uint64_t,uint64_t> >& image_extents);
 
     ImageCtx *m_ictx;
-    librados::IoCtx m_ioctx;
+    librados::IoCtx *m_ioctx;
     std::string m_oid;
     uint64_t m_object_no, m_object_off, m_object_len;
     librados::snap_t m_snap_id;
@@ -69,7 +69,6 @@ namespace librbd {
       : AioRequest(ictx, oid, objectno, offset, len, snap_id, completion, false),
        m_buffer_extents(be),
        m_tried_parent(false), m_sparse(sparse) {
-      m_ioctx.snap_set_read(m_snap_id);
     }
     virtual ~AioRead() {}
     virtual bool should_complete(int r);
@@ -138,6 +137,8 @@ namespace librbd {
     uint64_t m_parent_overlap;
     librados::ObjectWriteOperation m_write;
     librados::ObjectWriteOperation m_copyup;
+    uint64_t m_snap_seq;
+    std::vector<librados::snap_t> m_snaps;
 
   private:
     void send_copyup();