]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: only delete ImageCtx after open failure
authorJason Dillaman <dillaman@redhat.com>
Tue, 22 Mar 2016 22:50:43 +0000 (18:50 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 29 Mar 2016 19:12:29 +0000 (15:12 -0400)
The image is already closed -- it just needs to be destroyed
in a thread context outside of librbd.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/test_mock_ImageReplayer.cc
src/tools/rbd_mirror/image_replayer/CloseImageRequest.cc
src/tools/rbd_mirror/image_replayer/CloseImageRequest.h
src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc
src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.h

index 36ad1733e8af862b484b76bab265fd86bf78976b..9b78c070c7a1895935dd13b11fd9592922139394 100644 (file)
@@ -83,7 +83,7 @@ struct CloseImageRequest<librbd::MockImageReplayerImageCtx> {
   Context *on_finish = nullptr;
 
   static CloseImageRequest* create(librbd::MockImageReplayerImageCtx **image_ctx,
-                                   ContextWQ *work_queue,
+                                   ContextWQ *work_queue, bool destroy_only,
                                    Context *on_finish) {
     assert(s_instance != nullptr);
     s_instance->on_finish = on_finish;
index 37512455ca7f1088634834e68dd567d0be77b06e..a2a39a6c94d4ee408101c5575b80fe0fbd957977 100644 (file)
@@ -22,8 +22,9 @@ using librbd::util::create_context_callback;
 
 template <typename I>
 CloseImageRequest<I>::CloseImageRequest(I **image_ctx, ContextWQ *work_queue,
-                                        Context *on_finish)
-  : m_image_ctx(image_ctx), m_work_queue(work_queue), m_on_finish(on_finish) {
+                                        bool destroy_only, Context *on_finish)
+  : m_image_ctx(image_ctx), m_work_queue(work_queue),
+    m_destroy_only(destroy_only), m_on_finish(on_finish) {
 }
 
 template <typename I>
@@ -33,6 +34,11 @@ void CloseImageRequest<I>::send() {
 
 template <typename I>
 void CloseImageRequest<I>::close_image() {
+  if (m_destroy_only) {
+    switch_thread_context();
+    return;
+  }
+
   dout(20) << dendl;
 
   Context *ctx = create_context_callback<
index 8c4329706218e78aa4c86d83a2921c5604d7f2ea..dddad47220e2d64a050dff6e73b3ca785f9f8a2d 100644 (file)
@@ -20,12 +20,13 @@ template <typename ImageCtxT = librbd::ImageCtx>
 class CloseImageRequest {
 public:
   static CloseImageRequest* create(ImageCtxT **image_ctx, ContextWQ *work_queue,
-                                   Context *on_finish) {
-    return new CloseImageRequest(image_ctx, work_queue, on_finish);
+                                   bool destroy_only, Context *on_finish) {
+    return new CloseImageRequest(image_ctx, work_queue, destroy_only,
+                                 on_finish);
   }
 
   CloseImageRequest(ImageCtxT **image_ctx, ContextWQ *work_queue,
-                    Context *on_finish);
+                    bool destroy_only, Context *on_finish);
 
   void send();
 
@@ -36,7 +37,7 @@ private:
    * <start>
    *    |
    *    v
-   * CLOSE_IMAGE
+   * CLOSE_IMAGE (skip if not needed)
    *    |
    *    v
    * SWITCH_CONTEXT
@@ -48,6 +49,7 @@ private:
    */
   ImageCtxT **m_image_ctx;
   ContextWQ *m_work_queue;
+  bool m_destroy_only;
   Context *m_on_finish;
 
   void close_image();
index 846f9c4dfd21ce6f43230eaf61fcda0681d71975..0d2b2871e54b632591370d959bf64b0a31c3afad 100644 (file)
@@ -98,11 +98,11 @@ void OpenLocalImageRequest<I>::handle_open_image(int r) {
   if (r < 0) {
     derr << "failed to open image '" << m_local_image_id << "': "
          << cpp_strerror(r) << dendl;
-    send_close_image(r);
+    send_close_image(true, r);
     return;
   } else if ((*m_local_image_ctx)->exclusive_lock == nullptr) {
     derr << "image does not support exclusive lock" << dendl;
-    send_close_image(-EINVAL);
+    send_close_image(false, -EINVAL);
     return;
   }
 
@@ -128,12 +128,12 @@ void OpenLocalImageRequest<I>::handle_lock_image(int r) {
   if (r < 0) {
     derr << "failed to lock image '" << m_local_image_id << "': "
        << cpp_strerror(r) << dendl;
-    send_close_image(r);
+    send_close_image(false, r);
     return;
   } else if ((*m_local_image_ctx)->exclusive_lock == nullptr ||
              !(*m_local_image_ctx)->exclusive_lock->is_lock_owner()) {
     derr << "image is not locked" << dendl;
-    send_close_image(-EBUSY);
+    send_close_image(false, -EBUSY);
     return;
   }
 
@@ -141,7 +141,7 @@ void OpenLocalImageRequest<I>::handle_lock_image(int r) {
 }
 
 template <typename I>
-void OpenLocalImageRequest<I>::send_close_image(int r) {
+void OpenLocalImageRequest<I>::send_close_image(bool destroy_only, int r) {
   dout(20) << dendl;
 
   if (m_ret_val == 0 && r < 0) {
@@ -152,7 +152,7 @@ void OpenLocalImageRequest<I>::send_close_image(int r) {
     OpenLocalImageRequest<I>, &OpenLocalImageRequest<I>::handle_close_image>(
       this);
   CloseImageRequest<I> *request = CloseImageRequest<I>::create(
-    m_local_image_ctx, m_work_queue, ctx);
+    m_local_image_ctx, m_work_queue, destroy_only, ctx);
   request->send();
 }
 
index daf5c0aff62a5050a110309c7ffb68464f727092..a8db813bcabe6e5553c576e99b3641aae6446e75 100644 (file)
@@ -71,7 +71,7 @@ private:
   void send_lock_image();
   void handle_lock_image(int r);
 
-  void send_close_image(int r);
+  void send_close_image(bool destroy_only, int r);
   void handle_close_image(int r);
 
   void finish(int r);