]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: image deleter now takes a librados::IoCtx shared pointer
authorJason Dillaman <dillaman@redhat.com>
Fri, 17 Nov 2017 20:51:14 +0000 (15:51 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 21 Nov 2017 14:17:40 +0000 (09:17 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/test_ImageDeleter.cc
src/test/rbd_mirror/test_mock_ImageReplayer.cc
src/tools/rbd_mirror/ImageDeleter.cc
src/tools/rbd_mirror/ImageDeleter.h
src/tools/rbd_mirror/ImageReplayer.cc
src/tools/rbd_mirror/ImageReplayer.h

index f5232270492593f60830d79f8d9e3e6c028d04a6..41197caae1926cbdf69587a4d2385d2779da7e00 100644 (file)
@@ -19,6 +19,7 @@
 #include "tools/rbd_mirror/ImageDeleter.h"
 #include "tools/rbd_mirror/ServiceDaemon.h"
 #include "tools/rbd_mirror/Threads.h"
+#include "tools/rbd_mirror/types.h"
 #include "librbd/ImageCtx.h"
 #include "librbd/ImageState.h"
 #include "librbd/Operations.h"
@@ -62,6 +63,10 @@ public:
 
   void SetUp() override {
     TestFixture::SetUp();
+
+    m_local_io_ctx_ref.reset(new librados::IoCtx{});
+    ASSERT_EQ(0, _rados->ioctx_create2(m_local_pool_id, *m_local_io_ctx_ref));
+
     m_service_daemon.reset(new rbd::mirror::ServiceDaemon<>(g_ceph_context,
                                                             _rados, m_threads));
 
@@ -215,6 +220,7 @@ public:
 
   librbd::RBD rbd;
   std::string m_local_image_id;
+  rbd::mirror::IoCtxRef m_local_io_ctx_ref;
   std::unique_ptr<rbd::mirror::ServiceDaemon<>> m_service_daemon;
   rbd::mirror::ImageDeleter<> *m_deleter;
 };
@@ -223,8 +229,7 @@ int64_t TestImageDeleter::m_local_pool_id;
 
 
 TEST_F(TestImageDeleter, Delete_NonPrimary_Image) {
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -241,8 +246,7 @@ TEST_F(TestImageDeleter, Delete_Split_Brain_Image) {
   promote_image();
   demote_image();
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   true);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, true);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -258,8 +262,7 @@ TEST_F(TestImageDeleter, Delete_Split_Brain_Image) {
 TEST_F(TestImageDeleter, Fail_Delete_Primary_Image) {
   promote_image();
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -274,8 +277,7 @@ TEST_F(TestImageDeleter, Fail_Delete_Orphan_Image) {
   promote_image();
   demote_image();
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -289,8 +291,7 @@ TEST_F(TestImageDeleter, Fail_Delete_Orphan_Image) {
 TEST_F(TestImageDeleter, Delete_Image_With_Child) {
   create_snapshot();
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -305,8 +306,7 @@ TEST_F(TestImageDeleter, Delete_Image_With_Children) {
   create_snapshot("snap1");
   create_snapshot("snap2");
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -320,8 +320,7 @@ TEST_F(TestImageDeleter, Delete_Image_With_Children) {
 TEST_F(TestImageDeleter, Delete_Image_With_ProtectedChild) {
   create_snapshot("snap1", true);
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -336,8 +335,7 @@ TEST_F(TestImageDeleter, Delete_Image_With_ProtectedChildren) {
   create_snapshot("snap1", true);
   create_snapshot("snap2", true);
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -351,8 +349,7 @@ TEST_F(TestImageDeleter, Delete_Image_With_ProtectedChildren) {
 TEST_F(TestImageDeleter, Delete_Image_With_Clone) {
   std::string clone_id = create_clone();
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -362,8 +359,8 @@ TEST_F(TestImageDeleter, Delete_Image_With_Clone) {
   ASSERT_EQ(1u, m_deleter->get_delete_queue_items().size());
   ASSERT_EQ(0u, m_deleter->get_failed_queue_items().size());
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id,
-                                   GLOBAL_CLONE_IMAGE_ID, false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_CLONE_IMAGE_ID,
+                                   false);
 
   C_SaferCond ctx2;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_CLONE_IMAGE_ID,
@@ -387,8 +384,7 @@ TEST_F(TestImageDeleter, Delete_NonExistent_Image) {
   EXPECT_EQ(0, cls_client::mirror_image_set(&m_local_io_ctx, m_local_image_id,
                                             mirror_image));
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -412,8 +408,7 @@ TEST_F(TestImageDeleter, Delete_NonExistent_Image_With_MirroringState) {
   EXPECT_EQ(0, cls_client::mirror_image_set(&m_local_io_ctx, m_local_image_id,
                                             mirror_image));
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -429,8 +424,7 @@ TEST_F(TestImageDeleter, Delete_NonExistent_Image_With_MirroringState) {
 TEST_F(TestImageDeleter, Delete_NonExistent_Image_Without_MirroringState) {
   remove_image();
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -448,8 +442,7 @@ TEST_F(TestImageDeleter, Fail_Delete_NonPrimary_Image) {
                                 false);
   EXPECT_EQ(0, ictx->state->open(false));
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -469,8 +462,7 @@ TEST_F(TestImageDeleter, Retry_Failed_Deletes) {
 
   m_deleter->set_failed_timer_interval(2);
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -495,8 +487,7 @@ TEST_F(TestImageDeleter, Delete_Is_Idempotent) {
                                 false);
   EXPECT_EQ(0, ictx->state->open(false));
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   C_SaferCond ctx;
   m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
@@ -506,8 +497,7 @@ TEST_F(TestImageDeleter, Delete_Is_Idempotent) {
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
   ASSERT_EQ(1u, m_deleter->get_failed_queue_items().size());
 
-  m_deleter->schedule_image_delete(_rados, m_local_pool_id, GLOBAL_IMAGE_ID,
-                                   false);
+  m_deleter->schedule_image_delete(m_local_io_ctx_ref, GLOBAL_IMAGE_ID, false);
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
   ASSERT_EQ(1u, m_deleter->get_failed_queue_items().size());
index e63c7338a39df6526597b9d486e0c70da050d382..0821da96a120ff57b1f33ff890df6a420659e019 100644 (file)
@@ -85,8 +85,7 @@ struct Threads<librbd::MockTestImageCtx> {
 
 template <>
 struct ImageDeleter<librbd::MockTestImageCtx> {
-  MOCK_METHOD4(schedule_image_delete, void(RadosRef, int64_t,
-                                           const std::string&, bool));
+  MOCK_METHOD3(schedule_image_delete, void(IoCtxRef, const std::string&, bool));
   MOCK_METHOD4(wait_for_scheduled_deletion,
                void(int64_t, const std::string&, Context*, bool));
   MOCK_METHOD2(cancel_waiter, void(int64_t, const std::string&));
@@ -400,7 +399,7 @@ public:
                                     const std::string& global_image_id,
                                     bool ignore_orphan) {
     EXPECT_CALL(mock_image_deleter,
-                schedule_image_delete(_, _, global_image_id, ignore_orphan));
+                schedule_image_delete(_, global_image_id, ignore_orphan));
   }
 
   bufferlist encode_tag_data(const librbd::journal::TagData &tag_data) {
index 1571433d73ff4790854015da30435622d66fe2ca..2bc62426b07f8e43775c4a5b24dd21bbc022c6bd 100644 (file)
@@ -193,14 +193,13 @@ void ImageDeleter<I>::run() {
 }
 
 template <typename I>
-void ImageDeleter<I>::schedule_image_delete(RadosRef local_rados,
-                                            int64_t local_pool_id,
+void ImageDeleter<I>::schedule_image_delete(IoCtxRef local_io_ctx,
                                             const std::string& global_image_id,
                                             bool ignore_orphaned) {
   dout(20) << "enter" << dendl;
 
   Mutex::Locker locker(m_delete_lock);
-
+  int64_t local_pool_id = local_io_ctx->get_id();
   auto del_info = find_delete_info(local_pool_id, global_image_id);
   if (del_info != nullptr) {
     dout(20) << "image " << global_image_id << " "
@@ -212,8 +211,8 @@ void ImageDeleter<I>::schedule_image_delete(RadosRef local_rados,
   }
 
   m_delete_queue.push_front(
-    unique_ptr<DeleteInfo>(new DeleteInfo(local_rados, local_pool_id,
-                                          global_image_id, ignore_orphaned)));
+    unique_ptr<DeleteInfo>(new DeleteInfo(local_pool_id, global_image_id,
+                                          local_io_ctx, ignore_orphaned)));
   m_delete_queue_cond.Signal();
 }
 
@@ -267,27 +266,14 @@ bool ImageDeleter<I>::process_image_delete() {
   std::string del_info_str = ss.str();
   dout(10) << "start processing delete request: " << del_info_str << dendl;
 
-  // remote image was disabled, now we need to delete local image
-  IoCtx ioctx;
-  int r = m_active_delete->local_rados->ioctx_create2(
-    m_active_delete->local_pool_id, ioctx);
-  if (r < 0) {
-    derr << "error accessing local pool " << m_active_delete->local_pool_id
-         << ": " << cpp_strerror(r) << dendl;
-    enqueue_failed_delete(r);
-    return true;
-  }
-
-  dout(20) << "connected to local pool: " << ioctx.get_pool_name() << dendl;
-
   C_SaferCond remove_ctx;
   image_deleter::ErrorResult error_result;
   auto req = image_deleter::RemoveRequest<I>::create(
-    ioctx, m_active_delete->global_image_id, m_active_delete->ignore_orphaned,
-    &error_result, m_work_queue, &remove_ctx);
+    *m_active_delete->local_io_ctx, m_active_delete->global_image_id,
+    m_active_delete->ignore_orphaned, &error_result, m_work_queue, &remove_ctx);
   req->send();
 
-  r = remove_ctx.wait();
+  int r = remove_ctx.wait();
   if (r < 0) {
     if (error_result == image_deleter::ERROR_RESULT_COMPLETE) {
       complete_active_delete(r);
index 7742a1c8453cf99fbeb517492a956bf5ff1b47f7..b469b216da153b1ba138c56790a5f9faef847b74 100644 (file)
@@ -48,8 +48,7 @@ public:
   ImageDeleter(const ImageDeleter&) = delete;
   ImageDeleter& operator=(const ImageDeleter&) = delete;
 
-  void schedule_image_delete(RadosRef local_rados,
-                             int64_t local_pool_id,
+  void schedule_image_delete(IoCtxRef local_io_ctx,
                              const std::string& global_image_id,
                              bool ignore_orphaned);
   void wait_for_scheduled_deletion(int64_t local_pool_id,
@@ -80,20 +79,19 @@ private:
   };
 
   struct DeleteInfo {
-    RadosRef local_rados;
     int64_t local_pool_id;
     std::string global_image_id;
+    IoCtxRef local_io_ctx;
     bool ignore_orphaned;
     int error_code = 0;
     int retries = 0;
     bool notify_on_failed_retry = true;
     Context *on_delete = nullptr;
 
-    DeleteInfo(RadosRef local_rados, int64_t local_pool_id,
-               const std::string& global_image_id,
-               bool ignore_orphaned)
-      : local_rados(local_rados), local_pool_id(local_pool_id),
-        global_image_id(global_image_id), ignore_orphaned(ignore_orphaned) {
+    DeleteInfo(int64_t local_pool_id, const std::string& global_image_id,
+               IoCtxRef local_io_ctx, bool ignore_orphaned)
+      : local_pool_id(local_pool_id), global_image_id(global_image_id),
+        local_io_ctx(local_io_ctx), ignore_orphaned(ignore_orphaned) {
     }
 
     bool match(int64_t local_pool_id, const std::string &global_image_id) {
index fd3bf7a90f136aaaed1f052e99d23fb47641908b..98094091d4242238b374738bd31fee35934781fe 100644 (file)
@@ -382,7 +382,8 @@ void ImageReplayer<I>::start(Context *on_finish, bool manual)
     return;
   }
 
-  r = m_local->ioctx_create2(m_local_pool_id, m_local_ioctx);
+  m_local_ioctx.reset(new librados::IoCtx{});
+  r = m_local->ioctx_create2(m_local_pool_id, *m_local_ioctx);
   if (r < 0) {
     derr << "error opening ioctx for local pool " << m_local_pool_id
          << ": " << cpp_strerror(r) << dendl;
@@ -426,7 +427,7 @@ void ImageReplayer<I>::prepare_local_image() {
   Context *ctx = create_context_callback<
     ImageReplayer, &ImageReplayer<I>::handle_prepare_local_image>(this);
   auto req = PrepareLocalImageRequest<I>::create(
-    m_local_ioctx, m_global_image_id, &m_local_image_id,
+    *m_local_ioctx, m_global_image_id, &m_local_image_id,
     &m_local_image_tag_owner, m_threads->work_queue, ctx);
   req->send();
 }
@@ -518,7 +519,7 @@ void ImageReplayer<I>::bootstrap() {
     ImageReplayer, &ImageReplayer<I>::handle_bootstrap>(this);
 
   BootstrapRequest<I> *request = BootstrapRequest<I>::create(
-    m_local_ioctx, m_remote_image.io_ctx, m_instance_watcher,
+    *m_local_ioctx, m_remote_image.io_ctx, m_instance_watcher,
     &m_local_image_ctx, m_local_image_id, m_remote_image.image_id,
     m_global_image_id, m_threads->work_queue, m_threads->timer,
     &m_threads->timer_lock, m_local_mirror_uuid, m_remote_image.mirror_uuid,
@@ -1429,7 +1430,7 @@ void ImageReplayer<I>::send_mirror_status_update(const OptionalState &opt_state)
 
   librados::AioCompletion *aio_comp = create_rados_callback<
     ImageReplayer<I>, &ImageReplayer<I>::handle_mirror_status_update>(this);
-  int r = m_local_ioctx.aio_operate(RBD_MIRRORING, aio_comp, &op);
+  int r = m_local_ioctx->aio_operate(RBD_MIRRORING, aio_comp, &op);
   assert(r == 0);
   aio_comp->release();
 }
@@ -1656,8 +1657,7 @@ void ImageReplayer<I>::handle_shut_down(int r) {
       delete_requested = true;
     }
     if (delete_requested || m_resync_requested) {
-      m_image_deleter->schedule_image_delete(m_local,
-                                             m_local_pool_id,
+      m_image_deleter->schedule_image_delete(m_local_ioctx,
                                              m_global_image_id,
                                              m_resync_requested);
 
@@ -1680,8 +1680,6 @@ void ImageReplayer<I>::handle_shut_down(int r) {
   }
 
   dout(20) << "stop complete" << dendl;
-  m_local_ioctx.close();
-
   ReplayStatusFormatter<I>::destroy(m_replay_status_formatter);
   m_replay_status_formatter = nullptr;
 
@@ -1797,7 +1795,7 @@ template <typename I>
 void ImageReplayer<I>::on_name_changed() {
   {
     Mutex::Locker locker(m_lock);
-    std::string name = m_local_ioctx.get_pool_name() + "/" +
+    std::string name = m_local_ioctx->get_pool_name() + "/" +
       m_local_image_ctx->name;
     if (m_name == name) {
       return;
index 55e44a6d01bd1979904d9c23f79ef5f3b92ee598..525660f98d18f1f7ff761c0af6f4430e3ecfd324 100644 (file)
@@ -305,7 +305,7 @@ private:
   image_replayer::EventPreprocessor<ImageCtxT> *m_event_preprocessor = nullptr;
   image_replayer::ReplayStatusFormatter<ImageCtxT> *m_replay_status_formatter =
     nullptr;
-  librados::IoCtx m_local_ioctx;
+  IoCtxRef m_local_ioctx;
   ImageCtxT *m_local_image_ctx = nullptr;
   std::string m_local_image_tag_owner;