]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix test case race condition for maintenance requests
authorJason Dillaman <dillaman@redhat.com>
Mon, 14 Dec 2015 20:27:54 +0000 (15:27 -0500)
committerJason Dillaman <dillaman@redhat.com>
Mon, 14 Dec 2015 20:27:54 +0000 (15:27 -0500)
Fixes: #14060
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/AsyncRequest.cc
src/librbd/AsyncRequest.h

index b6e41eb175ad10665b84bdb79e8d1a05368e3906..b8974b024e7e3acfa93f89053bc9682f408dd0aa 100644 (file)
@@ -14,15 +14,11 @@ AsyncRequest<T>::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 <typename T>
 AsyncRequest<T>::~AsyncRequest() {
-  Mutex::Locker l(m_image_ctx.async_ops_lock);
-  assert(m_xlist_item.remove_myself());
-  m_image_ctx.async_requests_cond.Signal();
 }
 
 template <typename T>
@@ -47,6 +43,19 @@ Context *AsyncRequest<T>::create_async_callback_context() {
                                          _1));;
 }
 
+template <typename T>
+void AsyncRequest<T>::start_request() {
+  Mutex::Locker async_ops_locker(m_image_ctx.async_ops_lock);
+  m_image_ctx.async_requests.push_back(&m_xlist_item);
+}
+
+template <typename T>
+void AsyncRequest<T>::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<librbd::ImageCtx>;
index ca306d531c9e2f7414307841619b5f5b2457bf52..96802f8114a2ca6e40b0fea83360c68b57404e3a 100644 (file)
@@ -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<AsyncRequest<ImageCtxT> *>::item m_xlist_item;
+
+  void start_request();
+  void finish_request();
 };
 
 } // namespace librbd