From: Jason Dillaman Date: Fri, 4 Dec 2015 20:23:32 +0000 (-0500) Subject: librbd: support updated async cls_rbd API X-Git-Tag: v10.0.2~35^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8a4c1558d290af93e514ce091a455a0a83fec55a;p=ceph.git librbd: support updated async cls_rbd API Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/object_map/SnapshotRemoveRequest.cc b/src/librbd/object_map/SnapshotRemoveRequest.cc index b3b145e1a868..6cc8987ed1b0 100644 --- a/src/librbd/object_map/SnapshotRemoveRequest.cc +++ b/src/librbd/object_map/SnapshotRemoveRequest.cc @@ -72,6 +72,10 @@ bool SnapshotRemoveRequest::should_complete(int r) { bool finished = false; switch (m_state) { case STATE_LOAD_MAP: + if (r == 0) { + bufferlist::iterator it = m_out_bl.begin(); + r = cls_client::object_map_load_finish(&it, &m_snap_object_map); + } if (r < 0) { RWLock::WLocker snap_locker(m_image_ctx.snap_lock); send_invalidate_next_map(); @@ -108,8 +112,14 @@ void SnapshotRemoveRequest::send_load_map() { << dendl; m_state = STATE_LOAD_MAP; - cls_client::object_map_load(&m_image_ctx.md_ctx, snap_oid, - &m_snap_object_map, create_callback_context()); + librados::ObjectReadOperation op; + cls_client::object_map_load_start(&op); + + librados::AioCompletion *rados_completion = create_callback_completion(); + int r = m_image_ctx.md_ctx.aio_operate(snap_oid, rados_completion, &op, + &m_out_bl); + assert(r == 0); + rados_completion->release(); } void SnapshotRemoveRequest::send_remove_snapshot() { diff --git a/src/librbd/object_map/SnapshotRemoveRequest.h b/src/librbd/object_map/SnapshotRemoveRequest.h index 24950faef9e6..75fbdc8839fd 100644 --- a/src/librbd/object_map/SnapshotRemoveRequest.h +++ b/src/librbd/object_map/SnapshotRemoveRequest.h @@ -5,6 +5,7 @@ #define CEPH_LIBRBD_OBJECT_MAP_SNAPSHOT_REMOVE_REQUEST_H #include "include/int_types.h" +#include "include/buffer.h" #include "common/bit_vector.hpp" #include "librbd/AsyncRequest.h" @@ -73,6 +74,7 @@ private: uint64_t m_next_snap_id; ceph::BitVector<2> m_snap_object_map; + bufferlist m_out_bl; void send_load_map(); void send_remove_snapshot(); diff --git a/src/librbd/operation/SnapshotUnprotectRequest.cc b/src/librbd/operation/SnapshotUnprotectRequest.cc index c9c8f54224c4..65b71670dd83 100644 --- a/src/librbd/operation/SnapshotUnprotectRequest.cc +++ b/src/librbd/operation/SnapshotUnprotectRequest.cc @@ -10,6 +10,7 @@ #include "librbd/ImageCtx.h" #include "librbd/internal.h" #include "librbd/parent_types.h" +#include "librbd/Utils.h" #include #include #include @@ -97,8 +98,15 @@ public: return r; } - cls_client::get_children(&m_pool_ioctx, RBD_CHILDREN, m_pspec, &m_children, - this); + librados::ObjectReadOperation op; + cls_client::get_children_start(&op, m_pspec); + + librados::AioCompletion *rados_completion = + util::create_rados_ack_callback(this); + r = m_pool_ioctx.aio_operate(RBD_CHILDREN, rados_completion, &op, + &m_children_bl); + assert(r == 0); + rados_completion->release(); return 0; } @@ -106,8 +114,13 @@ protected: virtual void finish(int r) { I &image_ctx = this->m_image_ctx; CephContext *cct = image_ctx.cct; - ldout(cct, 10) << this << " retrieved children: r=" << r << dendl; + if (r == 0) { + bufferlist::iterator it = m_children_bl.begin(); + r= cls_client::get_children_finish(&it, &m_children); + } + + ldout(cct, 10) << this << " retrieved children: r=" << r << dendl; if (r == -ENOENT) { // no children -- proceed with unprotect r = 0;