From: Jason Dillaman Date: Fri, 18 Dec 2015 20:12:23 +0000 (-0500) Subject: librbd: object map ENOENT optimizations should complete asynchronously X-Git-Tag: v10.0.2~22^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f6659cc7f0910485da0abb6f5a6ab624813e2ec0;p=ceph.git librbd: object map ENOENT optimizations should complete asynchronously This ensures a consistent lock ordering between the optimized path and a librados callback. Remove the cache writebach handler's custom finisher and re-use the op_work_queue. Fixes: #14123 Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/AioObjectRequest.cc b/src/librbd/AioObjectRequest.cc index 67f9fe3c349d..5b3d61656137 100644 --- a/src/librbd/AioObjectRequest.cc +++ b/src/librbd/AioObjectRequest.cc @@ -6,6 +6,7 @@ #include "common/errno.h" #include "common/Mutex.h" #include "common/RWLock.h" +#include "common/WorkQueue.h" #include "librbd/AioObjectRequest.h" #include "librbd/AioCompletion.h" @@ -205,16 +206,16 @@ namespace librbd { ldout(m_ictx->cct, 20) << "send " << this << " " << m_oid << " " << m_object_off << "~" << m_object_len << dendl; - // send read request to parent if the object doesn't exist locally - bool non_existent = false; { RWLock::RLocker snap_locker(m_ictx->snap_lock); - non_existent = (m_ictx->object_map != nullptr && - !m_ictx->object_map->object_may_exist(m_object_no)); - } - if (non_existent) { - complete(-ENOENT); - return; + + // send read request to parent if the object doesn't exist locally + if (m_ictx->object_map != nullptr && + !m_ictx->object_map->object_may_exist(m_object_no)) { + m_ictx->op_work_queue->queue(util::create_context_callback< + AioObjectRequest>(this), -ENOENT); + return; + } } librados::ObjectReadOperation op; diff --git a/src/librbd/LibrbdWriteback.cc b/src/librbd/LibrbdWriteback.cc index 85fc513f9785..763860bc8632 100644 --- a/src/librbd/LibrbdWriteback.cc +++ b/src/librbd/LibrbdWriteback.cc @@ -5,8 +5,8 @@ #include "common/ceph_context.h" #include "common/dout.h" -#include "common/Finisher.h" #include "common/Mutex.h" +#include "common/WorkQueue.h" #include "include/Context.h" #include "include/rados/librados.hpp" #include "include/rbd/librbd.hpp" @@ -168,14 +168,7 @@ namespace librbd { }; LibrbdWriteback::LibrbdWriteback(ImageCtx *ictx, Mutex& lock) - : m_finisher(new Finisher(ictx->cct)), m_tid(0), m_lock(lock), m_ictx(ictx) - { - m_finisher->start(); - } - - LibrbdWriteback::~LibrbdWriteback() { - m_finisher->stop(); - delete m_finisher; + : m_tid(0), m_lock(lock), m_ictx(ictx) { } void LibrbdWriteback::read(const object_t& oid, uint64_t object_no, @@ -192,7 +185,7 @@ namespace librbd { RWLock::RLocker snap_locker(m_ictx->snap_lock); if (m_ictx->object_map != nullptr && !m_ictx->object_map->object_may_exist(object_no)) { - m_finisher->queue(req, -ENOENT); + m_ictx->op_work_queue->queue(req, -ENOENT); return; } } diff --git a/src/librbd/LibrbdWriteback.h b/src/librbd/LibrbdWriteback.h index b7574ae5dd2d..11b46cf88615 100644 --- a/src/librbd/LibrbdWriteback.h +++ b/src/librbd/LibrbdWriteback.h @@ -11,7 +11,6 @@ #include "osd/osd_types.h" #include "osdc/WritebackHandler.h" -class Finisher; class Mutex; namespace librbd { @@ -21,7 +20,6 @@ namespace librbd { class LibrbdWriteback : public WritebackHandler { public: LibrbdWriteback(ImageCtx *ictx, Mutex& lock); - virtual ~LibrbdWriteback(); // Note that oloc, trunc_size, and trunc_seq are ignored virtual void read(const object_t& oid, uint64_t object_no, @@ -61,7 +59,6 @@ namespace librbd { private: void complete_writes(const std::string& oid); - Finisher *m_finisher; ceph_tid_t m_tid; Mutex& m_lock; librbd::ImageCtx *m_ictx;