From f2e490cb5b1f322e637d787e788733ac4b2496f4 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Wed, 27 Mar 2013 15:42:10 -0700 Subject: [PATCH] librbd: use the same IoCtx for each request 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 (cherry picked from commit 860493e7ff0d87d02069b243fc1c8326ce0721f9) --- src/librbd/AioRequest.cc | 42 +++++++++++++++++----------------------- src/librbd/AioRequest.h | 5 +++-- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/librbd/AioRequest.cc b/src/librbd/AioRequest.cc index 95519fb372d5b..8d4d98c0bd0f1 100644 --- a/src/librbd/AioRequest.cc +++ b/src/librbd/AioRequest.cc @@ -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 snaps; for (std::vector::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(); } } diff --git a/src/librbd/AioRequest.h b/src/librbd/AioRequest.h index 259af88dda716..8ad15a4264c5e 100644 --- a/src/librbd/AioRequest.h +++ b/src/librbd/AioRequest.h @@ -49,7 +49,7 @@ namespace librbd { void read_from_parent(vector >& 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 m_snaps; private: void send_copyup(); -- 2.39.5