From: Jason Dillaman Date: Fri, 17 Nov 2017 20:51:14 +0000 (-0500) Subject: rbd-mirror: image deleter now takes a librados::IoCtx shared pointer X-Git-Tag: v13.0.1~134^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=527a62c80ae2cc644d402b95c192d06a0ea2c185;p=ceph-ci.git rbd-mirror: image deleter now takes a librados::IoCtx shared pointer Signed-off-by: Jason Dillaman --- diff --git a/src/test/rbd_mirror/test_ImageDeleter.cc b/src/test/rbd_mirror/test_ImageDeleter.cc index f5232270492..41197caae19 100644 --- a/src/test/rbd_mirror/test_ImageDeleter.cc +++ b/src/test/rbd_mirror/test_ImageDeleter.cc @@ -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> 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()); diff --git a/src/test/rbd_mirror/test_mock_ImageReplayer.cc b/src/test/rbd_mirror/test_mock_ImageReplayer.cc index e63c7338a39..0821da96a12 100644 --- a/src/test/rbd_mirror/test_mock_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_mock_ImageReplayer.cc @@ -85,8 +85,7 @@ struct Threads { template <> struct ImageDeleter { - 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) { diff --git a/src/tools/rbd_mirror/ImageDeleter.cc b/src/tools/rbd_mirror/ImageDeleter.cc index 1571433d73f..2bc62426b07 100644 --- a/src/tools/rbd_mirror/ImageDeleter.cc +++ b/src/tools/rbd_mirror/ImageDeleter.cc @@ -193,14 +193,13 @@ void ImageDeleter::run() { } template -void ImageDeleter::schedule_image_delete(RadosRef local_rados, - int64_t local_pool_id, +void ImageDeleter::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::schedule_image_delete(RadosRef local_rados, } m_delete_queue.push_front( - unique_ptr(new DeleteInfo(local_rados, local_pool_id, - global_image_id, ignore_orphaned))); + unique_ptr(new DeleteInfo(local_pool_id, global_image_id, + local_io_ctx, ignore_orphaned))); m_delete_queue_cond.Signal(); } @@ -267,27 +266,14 @@ bool ImageDeleter::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::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); diff --git a/src/tools/rbd_mirror/ImageDeleter.h b/src/tools/rbd_mirror/ImageDeleter.h index 7742a1c8453..b469b216da1 100644 --- a/src/tools/rbd_mirror/ImageDeleter.h +++ b/src/tools/rbd_mirror/ImageDeleter.h @@ -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) { diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index fd3bf7a90f1..98094091d42 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -382,7 +382,8 @@ void ImageReplayer::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::prepare_local_image() { Context *ctx = create_context_callback< ImageReplayer, &ImageReplayer::handle_prepare_local_image>(this); auto req = PrepareLocalImageRequest::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::bootstrap() { ImageReplayer, &ImageReplayer::handle_bootstrap>(this); BootstrapRequest *request = BootstrapRequest::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::send_mirror_status_update(const OptionalState &opt_state) librados::AioCompletion *aio_comp = create_rados_callback< ImageReplayer, &ImageReplayer::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::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::handle_shut_down(int r) { } dout(20) << "stop complete" << dendl; - m_local_ioctx.close(); - ReplayStatusFormatter::destroy(m_replay_status_formatter); m_replay_status_formatter = nullptr; @@ -1797,7 +1795,7 @@ template void ImageReplayer::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; diff --git a/src/tools/rbd_mirror/ImageReplayer.h b/src/tools/rbd_mirror/ImageReplayer.h index 55e44a6d01b..525660f98d1 100644 --- a/src/tools/rbd_mirror/ImageReplayer.h +++ b/src/tools/rbd_mirror/ImageReplayer.h @@ -305,7 +305,7 @@ private: image_replayer::EventPreprocessor *m_event_preprocessor = nullptr; image_replayer::ReplayStatusFormatter *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;