From: Jason Dillaman Date: Mon, 14 Dec 2015 20:27:54 +0000 (-0500) Subject: librbd: fix test case race condition for maintenance requests X-Git-Tag: v10.0.2~39^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3e6c990389b2cd8461538385e8f74884a79d7bc2;p=ceph.git librbd: fix test case race condition for maintenance requests Fixes: #14060 Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/AsyncRequest.cc b/src/librbd/AsyncRequest.cc index b6e41eb175a..b8974b024e7 100644 --- a/src/librbd/AsyncRequest.cc +++ b/src/librbd/AsyncRequest.cc @@ -14,15 +14,11 @@ AsyncRequest::AsyncRequest(T &image_ctx, Context *on_finish) : m_image_ctx(image_ctx), m_on_finish(on_finish), m_canceled(false), m_xlist_item(this) { assert(m_on_finish != NULL); - Mutex::Locker l(m_image_ctx.async_ops_lock); - m_image_ctx.async_requests.push_back(&m_xlist_item); + start_request(); } template AsyncRequest::~AsyncRequest() { - Mutex::Locker l(m_image_ctx.async_ops_lock); - assert(m_xlist_item.remove_myself()); - m_image_ctx.async_requests_cond.Signal(); } template @@ -47,6 +43,19 @@ Context *AsyncRequest::create_async_callback_context() { _1));; } +template +void AsyncRequest::start_request() { + Mutex::Locker async_ops_locker(m_image_ctx.async_ops_lock); + m_image_ctx.async_requests.push_back(&m_xlist_item); +} + +template +void AsyncRequest::finish_request() { + Mutex::Locker async_ops_locker(m_image_ctx.async_ops_lock); + assert(m_xlist_item.remove_myself()); + m_image_ctx.async_requests_cond.Signal(); +} + } // namespace librbd template class librbd::AsyncRequest; diff --git a/src/librbd/AsyncRequest.h b/src/librbd/AsyncRequest.h index ca306d531c9..96802f8114a 100644 --- a/src/librbd/AsyncRequest.h +++ b/src/librbd/AsyncRequest.h @@ -24,6 +24,7 @@ public: if (should_complete(r)) { r = filter_return_code(r); finish(r); + finish_request(); m_on_finish->complete(r); delete this; } @@ -58,6 +59,9 @@ protected: private: bool m_canceled; typename xlist *>::item m_xlist_item; + + void start_request(); + void finish_request(); }; } // namespace librbd