From 2b5095232d2cf21a5dbd3c8a649fd5106b6bc266 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 14 Dec 2017 15:36:25 -0500 Subject: [PATCH] rbd-mirror: move images to trash when propagating deletions Signed-off-by: Jason Dillaman --- src/test/rbd_mirror/test_ImageReplayer.cc | 38 +------ .../rbd_mirror/test_mock_ImageReplayer.cc | 100 +++++++----------- .../rbd_mirror/test_mock_InstanceReplayer.cc | 13 +-- src/tools/rbd_mirror/ImageReplayer.cc | 54 +++------- src/tools/rbd_mirror/ImageReplayer.h | 17 +-- src/tools/rbd_mirror/InstanceReplayer.cc | 10 +- src/tools/rbd_mirror/InstanceReplayer.h | 8 +- src/tools/rbd_mirror/PoolReplayer.cc | 4 +- 8 files changed, 73 insertions(+), 171 deletions(-) diff --git a/src/test/rbd_mirror/test_ImageReplayer.cc b/src/test/rbd_mirror/test_ImageReplayer.cc index b1616195ca35c..5ea29c6d5d1a0 100644 --- a/src/test/rbd_mirror/test_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_ImageReplayer.cc @@ -35,7 +35,6 @@ #include "librbd/io/ImageRequestWQ.h" #include "librbd/io/ReadResult.h" #include "tools/rbd_mirror/types.h" -#include "tools/rbd_mirror/ImageDeleter.h" #include "tools/rbd_mirror/ImageReplayer.h" #include "tools/rbd_mirror/InstanceWatcher.h" #include "tools/rbd_mirror/ServiceDaemon.h" @@ -123,12 +122,6 @@ public: m_service_daemon.reset(new rbd::mirror::ServiceDaemon<>(g_ceph_context, m_local_cluster, m_threads.get())); - m_image_deleter.reset(new rbd::mirror::ImageDeleter<>( - m_local_ioctx, m_threads.get(), m_service_daemon.get())); - - C_SaferCond ctx; - m_image_deleter->init(&ctx); - EXPECT_EQ(0, ctx.wait()); m_instance_watcher = rbd::mirror::InstanceWatcher<>::create( m_local_ioctx, m_threads->work_queue, nullptr); @@ -144,10 +137,6 @@ public: delete m_replayer; delete m_instance_watcher; - C_SaferCond ctx; - m_image_deleter->shut_down(&ctx); - ctx.wait(); - EXPECT_EQ(0, m_remote_cluster.pool_delete(m_remote_pool_name.c_str())); EXPECT_EQ(0, m_local_cluster->pool_delete(m_local_pool_name.c_str())); } @@ -155,7 +144,7 @@ public: template > void create_replayer() { m_replayer = new ImageReplayerT( - m_threads.get(), m_image_deleter.get(), m_instance_watcher, + m_threads.get(), m_instance_watcher, rbd::mirror::RadosRef(new librados::Rados(m_local_ioctx)), m_local_mirror_uuid, m_local_ioctx.get_id(), m_global_image_id); m_replayer->add_peer("peer uuid", m_remote_ioctx); @@ -391,7 +380,6 @@ public: std::shared_ptr m_local_cluster; std::unique_ptr> m_threads; std::unique_ptr> m_service_daemon; - std::unique_ptr> m_image_deleter; librados::Rados m_remote_cluster; rbd::mirror::InstanceWatcher<> *m_instance_watcher; std::string m_local_mirror_uuid = "local mirror uuid"; @@ -668,17 +656,13 @@ TEST_F(TestImageReplayer, Resync) m_replayer->resync_image(&ctx); ASSERT_EQ(0, ctx.wait()); - C_SaferCond delete_ctx; - m_image_deleter->wait_for_scheduled_deletion( - m_replayer->get_global_image_id(), &delete_ctx); - EXPECT_EQ(0, delete_ctx.wait()); + wait_for_stopped(); C_SaferCond cond; m_replayer->start(&cond); ASSERT_EQ(0, cond.wait()); ASSERT_TRUE(m_replayer->is_replaying()); - wait_for_replay_complete(); open_local_image(&ictx); @@ -730,11 +714,6 @@ TEST_F(TestImageReplayer, Resync_While_Stop) ASSERT_TRUE(m_replayer->is_stopped()); - C_SaferCond delete_ctx; - m_image_deleter->wait_for_scheduled_deletion( - m_replayer->get_global_image_id(), &delete_ctx); - EXPECT_EQ(0, delete_ctx.wait()); - C_SaferCond cond3; m_replayer->start(&cond3); ASSERT_EQ(0, cond3.wait()); @@ -768,11 +747,6 @@ TEST_F(TestImageReplayer, Resync_StartInterrupted) ASSERT_TRUE(m_replayer->is_stopped()); - C_SaferCond delete_ctx; - m_image_deleter->wait_for_scheduled_deletion( - m_replayer->get_global_image_id(), &delete_ctx); - EXPECT_EQ(0, delete_ctx.wait()); - C_SaferCond cond2; m_replayer->start(&cond2); ASSERT_EQ(0, cond2.wait()); @@ -955,10 +929,6 @@ TEST_F(TestImageReplayer, Disconnect) C_SaferCond cond2; m_replayer->start(&cond2); ASSERT_EQ(0, cond2.wait()); - C_SaferCond delete_cond; - m_image_deleter->wait_for_scheduled_deletion( - m_replayer->get_global_image_id(), &delete_cond); - EXPECT_EQ(0, delete_cond.wait()); start(); wait_for_replay_complete(); @@ -996,10 +966,6 @@ TEST_F(TestImageReplayer, Disconnect) C_SaferCond cond5; m_replayer->start(&cond5); ASSERT_EQ(-ENOTCONN, cond5.wait()); - C_SaferCond delete_cond1; - m_image_deleter->wait_for_scheduled_deletion( - m_replayer->get_global_image_id(), &delete_cond1); - EXPECT_EQ(0, delete_cond1.wait()); C_SaferCond cond6; m_replayer->start(&cond6); diff --git a/src/test/rbd_mirror/test_mock_ImageReplayer.cc b/src/test/rbd_mirror/test_mock_ImageReplayer.cc index 869b55f795b88..b1bf9cf6d452c 100644 --- a/src/test/rbd_mirror/test_mock_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_mock_ImageReplayer.cc @@ -65,6 +65,26 @@ struct MirrorPeerClientMeta; namespace rbd { namespace mirror { +template <> +struct ImageDeleter { + static ImageDeleter* s_instance; + + static void trash_move(librados::IoCtx& local_io_ctx, + const std::string& global_image_id, bool resync, + MockContextWQ* work_queue, Context* on_finish) { + assert(s_instance != nullptr); + s_instance->trash_move(global_image_id, resync, on_finish); + } + + MOCK_METHOD3(trash_move, void(const std::string&, bool, Context*)); + + ImageDeleter() { + s_instance = this; + } +}; + +ImageDeleter* ImageDeleter::s_instance = nullptr; + template <> struct Threads { MockSafeTimer *timer; @@ -83,15 +103,6 @@ struct Threads { } }; -template <> -struct ImageDeleter { - MOCK_METHOD3(schedule_image_delete, void(const std::string&, bool, - Context*)); - MOCK_METHOD2(wait_for_scheduled_deletion, - void(const std::string&, Context*)); - MOCK_METHOD1(cancel_waiter, void(const std::string&)); -}; - template<> class InstanceWatcher { }; @@ -381,27 +392,16 @@ public: })); } - void expect_wait_for_scheduled_deletion(MockImageDeleter& mock_image_deleter, - const std::string& global_image_id, - int r) { + void expect_trash_move(MockImageDeleter& mock_image_deleter, + const std::string& global_image_id, + bool ignore_orphan, int r) { EXPECT_CALL(mock_image_deleter, - wait_for_scheduled_deletion(global_image_id, _)) - .WillOnce(WithArg<1>(Invoke([this, r](Context *ctx) { + trash_move(global_image_id, ignore_orphan, _)) + .WillOnce(WithArg<2>(Invoke([this, &mock_image_deleter, r](Context* ctx) { m_threads->work_queue->queue(ctx, r); }))); } - void expect_cancel_waiter(MockImageDeleter& mock_image_deleter) { - EXPECT_CALL(mock_image_deleter, cancel_waiter("global image id")); - } - - void expect_schedule_image_delete(MockImageDeleter& mock_image_deleter, - const std::string& global_image_id, - bool ignore_orphan) { - EXPECT_CALL(mock_image_deleter, - schedule_image_delete(global_image_id, ignore_orphan, nullptr)); - } - bufferlist encode_tag_data(const librbd::journal::TagData &tag_data) { bufferlist bl; ::encode(tag_data, bl); @@ -574,10 +574,9 @@ public: WithArg<2>(CompleteContext(on_commit_r)))); } - void create_image_replayer(MockThreads &mock_threads, - MockImageDeleter &mock_image_deleter) { + void create_image_replayer(MockThreads &mock_threads) { m_image_replayer = new MockImageReplayer( - &mock_threads, &mock_image_deleter, &m_instance_watcher, + &mock_threads, &m_instance_watcher, rbd::mirror::RadosRef(new librados::Rados(m_local_io_ctx)), "local_mirror_uuid", m_local_io_ctx.get_id(), "global image id"); m_image_replayer->add_peer("peer_uuid", m_remote_io_ctx); @@ -614,7 +613,6 @@ TEST_F(TestMockImageReplayer, StartStop) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", @@ -633,7 +631,7 @@ TEST_F(TestMockImageReplayer, StartStop) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -645,7 +643,6 @@ TEST_F(TestMockImageReplayer, StartStop) { MockCloseImageRequest mock_close_local_image_request; - expect_cancel_waiter(mock_image_deleter); expect_shut_down(mock_local_replay, true, 0); EXPECT_CALL(mock_local_journal, remove_listener(_)); EXPECT_CALL(mock_local_journal, stop_external_replay()); @@ -679,7 +676,6 @@ TEST_F(TestMockImageReplayer, LocalImagePrimary) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", @@ -688,7 +684,7 @@ TEST_F(TestMockImageReplayer, LocalImagePrimary) { EXPECT_CALL(mock_remote_journaler, remove_listener(_)); expect_shut_down(mock_remote_journaler, 0); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -713,7 +709,6 @@ TEST_F(TestMockImageReplayer, LocalImageDNE) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, "", "", -ENOENT); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", m_remote_image_ctx->id, 0); @@ -723,7 +718,7 @@ TEST_F(TestMockImageReplayer, LocalImageDNE) { EXPECT_CALL(mock_remote_journaler, remove_listener(_)); expect_shut_down(mock_remote_journaler, 0); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -745,11 +740,10 @@ TEST_F(TestMockImageReplayer, PrepareLocalImageError) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", -EINVAL); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -772,14 +766,13 @@ TEST_F(TestMockImageReplayer, GetRemoteImageIdDNE) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", "", -ENOENT); - expect_schedule_image_delete(mock_image_deleter, "global image id", false); + expect_trash_move(mock_image_deleter, "global image id", false, 0); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -802,13 +795,12 @@ TEST_F(TestMockImageReplayer, GetRemoteImageIdNonLinkedDNE) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "some other mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", "", -ENOENT); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -831,13 +823,12 @@ TEST_F(TestMockImageReplayer, GetRemoteImageIdError) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", m_remote_image_ctx->id, -EINVAL); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -863,7 +854,6 @@ TEST_F(TestMockImageReplayer, BootstrapError) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", @@ -874,7 +864,7 @@ TEST_F(TestMockImageReplayer, BootstrapError) { EXPECT_CALL(mock_remote_journaler, remove_listener(_)); expect_shut_down(mock_remote_journaler, 0); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -906,7 +896,6 @@ TEST_F(TestMockImageReplayer, StartExternalReplayError) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", @@ -930,7 +919,7 @@ TEST_F(TestMockImageReplayer, StartExternalReplayError) { EXPECT_CALL(mock_remote_journaler, remove_listener(_)); expect_shut_down(mock_remote_journaler, 0); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -964,7 +953,6 @@ TEST_F(TestMockImageReplayer, StopError) { expect_get_or_send_update(mock_replay_status_formatter); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", @@ -983,7 +971,7 @@ TEST_F(TestMockImageReplayer, StopError) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -993,7 +981,6 @@ TEST_F(TestMockImageReplayer, StopError) { MockCloseImageRequest mock_close_local_image_request; - expect_cancel_waiter(mock_image_deleter); expect_shut_down(mock_local_replay, true, -EINVAL); EXPECT_CALL(mock_local_journal, remove_listener(_)); EXPECT_CALL(mock_local_journal, stop_external_replay()); @@ -1036,7 +1023,6 @@ TEST_F(TestMockImageReplayer, Replay) { expect_committed(mock_remote_journaler, 2); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", @@ -1055,7 +1041,7 @@ TEST_F(TestMockImageReplayer, Replay) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -1103,7 +1089,6 @@ TEST_F(TestMockImageReplayer, Replay) { // STOP MockCloseImageRequest mock_close_local_image_request; - expect_cancel_waiter(mock_image_deleter); expect_shut_down(mock_local_replay, true, 0); EXPECT_CALL(mock_local_journal, remove_listener(_)); EXPECT_CALL(mock_local_journal, stop_external_replay()); @@ -1145,7 +1130,6 @@ TEST_F(TestMockImageReplayer, DecodeError) { expect_get_commit_tid_in_debug(mock_replay_entry); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", @@ -1164,7 +1148,7 @@ TEST_F(TestMockImageReplayer, DecodeError) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -1247,7 +1231,6 @@ TEST_F(TestMockImageReplayer, DelayedReplay) { expect_committed(mock_remote_journaler, 1); InSequence seq; - expect_wait_for_scheduled_deletion(mock_image_deleter, "global image id", 0); expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", 0); expect_send(mock_prepare_remote_image_request, "remote mirror uuid", @@ -1266,7 +1249,7 @@ TEST_F(TestMockImageReplayer, DelayedReplay) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_threads, mock_image_deleter); + create_image_replayer(mock_threads); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -1326,7 +1309,6 @@ TEST_F(TestMockImageReplayer, DelayedReplay) { MockCloseImageRequest mock_close_local_image_request; - expect_cancel_waiter(mock_image_deleter); expect_shut_down(mock_local_replay, true, 0); EXPECT_CALL(mock_local_journal, remove_listener(_)); EXPECT_CALL(mock_local_journal, stop_external_replay()); diff --git a/src/test/rbd_mirror/test_mock_InstanceReplayer.cc b/src/test/rbd_mirror/test_mock_InstanceReplayer.cc index 02bc0886df514..7b57b9a5ac64c 100644 --- a/src/test/rbd_mirror/test_mock_InstanceReplayer.cc +++ b/src/test/rbd_mirror/test_mock_InstanceReplayer.cc @@ -5,7 +5,6 @@ #include "test/rbd_mirror/test_mock_fixture.h" #include "test/rbd_mirror/mock/MockContextWQ.h" #include "test/rbd_mirror/mock/MockSafeTimer.h" -#include "tools/rbd_mirror/ImageDeleter.h" #include "tools/rbd_mirror/ImageReplayer.h" #include "tools/rbd_mirror/InstanceWatcher.h" #include "tools/rbd_mirror/InstanceReplayer.h" @@ -49,10 +48,6 @@ struct Threads { } }; -template <> -struct ImageDeleter { -}; - template<> struct ServiceDaemon { MOCK_METHOD3(add_or_update_attribute, @@ -71,7 +66,6 @@ struct ImageReplayer { static ImageReplayer *create( Threads *threads, - ImageDeleter* image_deleter, InstanceWatcher *instance_watcher, RadosRef local, const std::string &local_mirror_uuid, int64_t local_pool_id, const std::string &global_image_id) { @@ -132,7 +126,6 @@ using ::testing::WithArg; class TestMockInstanceReplayer : public TestMockFixture { public: typedef Threads MockThreads; - typedef ImageDeleter MockImageDeleter; typedef ImageReplayer MockImageReplayer; typedef InstanceReplayer MockInstanceReplayer; typedef InstanceWatcher MockInstanceWatcher; @@ -174,11 +167,10 @@ public: TEST_F(TestMockInstanceReplayer, AcquireReleaseImage) { MockThreads mock_threads(m_threads); MockServiceDaemon mock_service_daemon; - MockImageDeleter mock_image_deleter; MockInstanceWatcher mock_instance_watcher; MockImageReplayer mock_image_replayer; MockInstanceReplayer instance_replayer( - &mock_threads, &mock_service_daemon, &mock_image_deleter, + &mock_threads, &mock_service_daemon, rbd::mirror::RadosRef(new librados::Rados(m_local_io_ctx)), "local_mirror_uuid", m_local_io_ctx.get_id()); std::string global_image_id("global_image_id"); @@ -245,11 +237,10 @@ TEST_F(TestMockInstanceReplayer, AcquireReleaseImage) { TEST_F(TestMockInstanceReplayer, RemoveFinishedImage) { MockThreads mock_threads(m_threads); MockServiceDaemon mock_service_daemon; - MockImageDeleter mock_image_deleter; MockInstanceWatcher mock_instance_watcher; MockImageReplayer mock_image_replayer; MockInstanceReplayer instance_replayer( - &mock_threads, &mock_service_daemon, &mock_image_deleter, + &mock_threads, &mock_service_daemon, rbd::mirror::RadosRef(new librados::Rados(m_local_io_ctx)), "local_mirror_uuid", m_local_io_ctx.get_id()); std::string global_image_id("global_image_id"); diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index a8137d44843e3..af5d4ff47f307 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -258,14 +258,12 @@ void ImageReplayer::RemoteJournalerListener::handle_update( template ImageReplayer::ImageReplayer(Threads *threads, - ImageDeleter* image_deleter, InstanceWatcher *instance_watcher, RadosRef local, const std::string &local_mirror_uuid, int64_t local_pool_id, const std::string &global_image_id) : m_threads(threads), - m_image_deleter(image_deleter), m_instance_watcher(instance_watcher), m_local(local), m_local_mirror_uuid(local_mirror_uuid), @@ -391,30 +389,6 @@ void ImageReplayer::start(Context *on_finish, bool manual) return; } - wait_for_deletion(); -} - -template -void ImageReplayer::wait_for_deletion() { - dout(20) << dendl; - - Context *ctx = create_context_callback< - ImageReplayer, &ImageReplayer::handle_wait_for_deletion>(this); - m_image_deleter->wait_for_scheduled_deletion(m_global_image_id, ctx); -} - -template -void ImageReplayer::handle_wait_for_deletion(int r) { - dout(20) << "r=" << r << dendl; - - if (r == -ECANCELED) { - on_start_fail(0, ""); - return; - } else if (r < 0) { - on_start_fail(r, "error waiting for image deletion"); - return; - } - prepare_local_image(); } @@ -743,8 +717,6 @@ void ImageReplayer::stop(Context *on_finish, bool manual, int r, dout(20) << "on_finish=" << on_finish << ", manual=" << manual << ", desc=" << desc << dendl; - m_image_deleter->cancel_waiter(m_global_image_id); - image_replayer::BootstrapRequest *bootstrap_request = nullptr; bool shut_down_replay = false; bool running = true; @@ -1632,6 +1604,8 @@ template void ImageReplayer::handle_shut_down(int r) { reschedule_update_status_task(-1); + bool resync_requested = false; + bool delete_requested = false; bool unregister_asok_hook = false; { Mutex::Locker locker(m_lock); @@ -1649,22 +1623,16 @@ void ImageReplayer::handle_shut_down(int r) { return; } - bool delete_requested = false; if (m_delete_requested && !m_local_image_id.empty()) { assert(m_remote_image.image_id.empty()); dout(0) << "remote image no longer exists: scheduling deletion" << dendl; - delete_requested = true; + unregister_asok_hook = true; + std::swap(delete_requested, m_delete_requested); } - if (delete_requested || m_resync_requested) { - m_image_deleter->schedule_image_delete(m_global_image_id, - m_resync_requested, nullptr); + std::swap(resync_requested, m_resync_requested); + if (delete_requested || resync_requested) { m_local_image_id = ""; - m_resync_requested = false; - if (m_delete_requested) { - unregister_asok_hook = true; - m_delete_requested = false; - } } else if (m_last_r == -ENOENT && m_local_image_id.empty() && m_remote_image.image_id.empty()) { dout(0) << "mirror image no longer exists" << dendl; @@ -1677,6 +1645,16 @@ void ImageReplayer::handle_shut_down(int r) { unregister_admin_socket_hook(); } + if (delete_requested || resync_requested) { + dout(5) << "moving image to trash" << dendl; + auto ctx = new FunctionContext([this, r](int) { + handle_shut_down(r); + }); + ImageDeleter::trash_move(*m_local_ioctx, m_global_image_id, + resync_requested, m_threads->work_queue, ctx); + return; + } + dout(20) << "stop complete" << dendl; ReplayStatusFormatter::destroy(m_replay_status_formatter); m_replay_status_formatter = nullptr; diff --git a/src/tools/rbd_mirror/ImageReplayer.h b/src/tools/rbd_mirror/ImageReplayer.h index 525660f98d18f..2996fec1535a8 100644 --- a/src/tools/rbd_mirror/ImageReplayer.h +++ b/src/tools/rbd_mirror/ImageReplayer.h @@ -47,7 +47,6 @@ namespace journal { template class Replay; } namespace rbd { namespace mirror { -template struct ImageDeleter; template struct InstanceWatcher; template struct Threads; @@ -62,20 +61,17 @@ template class ImageReplayer { public: static ImageReplayer *create( - Threads *threads, ImageDeleter* image_deleter, - InstanceWatcher *instance_watcher, + Threads *threads, InstanceWatcher *instance_watcher, RadosRef local, const std::string &local_mirror_uuid, int64_t local_pool_id, const std::string &global_image_id) { - return new ImageReplayer(threads, image_deleter, instance_watcher, - local, local_mirror_uuid, local_pool_id, - global_image_id); + return new ImageReplayer(threads, instance_watcher, local, + local_mirror_uuid, local_pool_id, global_image_id); } void destroy() { delete this; } ImageReplayer(Threads *threads, - ImageDeleter* image_deleter, InstanceWatcher *instance_watcher, RadosRef local, const std::string &local_mirror_uuid, int64_t local_pool_id, const std::string &global_image_id); @@ -138,9 +134,6 @@ protected: * v * * * * | * - * v * - * WAIT_FOR_DELETION * - * | * * v (error) * * PREPARE_LOCAL_IMAGE * * * * * * * * * * * * * * * * * * * | * @@ -276,7 +269,6 @@ private: }; Threads *m_threads; - ImageDeleter* m_image_deleter; InstanceWatcher *m_instance_watcher; Peers m_peers; @@ -390,9 +382,6 @@ private: void handle_shut_down(int r); void handle_remote_journal_metadata_updated(); - void wait_for_deletion(); - void handle_wait_for_deletion(int r); - void prepare_local_image(); void handle_prepare_local_image(int r); diff --git a/src/tools/rbd_mirror/InstanceReplayer.cc b/src/tools/rbd_mirror/InstanceReplayer.cc index 8b7fca17ac16e..d08f54d8aa47a 100644 --- a/src/tools/rbd_mirror/InstanceReplayer.cc +++ b/src/tools/rbd_mirror/InstanceReplayer.cc @@ -34,11 +34,11 @@ using librbd::util::create_context_callback; template InstanceReplayer::InstanceReplayer( Threads *threads, ServiceDaemon* service_daemon, - ImageDeleter* image_deleter, RadosRef local_rados, - const std::string &local_mirror_uuid, int64_t local_pool_id) + RadosRef local_rados, const std::string &local_mirror_uuid, + int64_t local_pool_id) : m_threads(threads), m_service_daemon(service_daemon), - m_image_deleter(image_deleter), m_local_rados(local_rados), - m_local_mirror_uuid(local_mirror_uuid), m_local_pool_id(local_pool_id), + m_local_rados(local_rados), m_local_mirror_uuid(local_mirror_uuid), + m_local_pool_id(local_pool_id), m_lock("rbd::mirror::InstanceReplayer " + stringify(local_pool_id)) { } @@ -142,7 +142,7 @@ void InstanceReplayer::acquire_image(InstanceWatcher *instance_watcher, auto it = m_image_replayers.find(global_image_id); if (it == m_image_replayers.end()) { auto image_replayer = ImageReplayer::create( - m_threads, m_image_deleter, instance_watcher, m_local_rados, + m_threads, instance_watcher, m_local_rados, m_local_mirror_uuid, m_local_pool_id, global_image_id); dout(20) << global_image_id << ": creating replayer " << image_replayer diff --git a/src/tools/rbd_mirror/InstanceReplayer.h b/src/tools/rbd_mirror/InstanceReplayer.h index 4721f742a3ae0..96969cb62c9be 100644 --- a/src/tools/rbd_mirror/InstanceReplayer.h +++ b/src/tools/rbd_mirror/InstanceReplayer.h @@ -17,7 +17,6 @@ namespace librbd { class ImageCtx; } namespace rbd { namespace mirror { -template class ImageDeleter; template class ImageReplayer; template class InstanceWatcher; template class ServiceDaemon; @@ -29,11 +28,10 @@ public: static InstanceReplayer* create( Threads *threads, ServiceDaemon* service_daemon, - ImageDeleter* image_deleter, RadosRef local_rados, const std::string &local_mirror_uuid, int64_t local_pool_id) { - return new InstanceReplayer(threads, service_daemon, image_deleter, - local_rados, local_mirror_uuid, local_pool_id); + return new InstanceReplayer(threads, service_daemon, local_rados, + local_mirror_uuid, local_pool_id); } void destroy() { delete this; @@ -41,7 +39,6 @@ public: InstanceReplayer(Threads *threads, ServiceDaemon* service_daemon, - ImageDeleter* image_deleter, RadosRef local_rados, const std::string &local_mirror_uuid, int64_t local_pool_id); ~InstanceReplayer(); @@ -86,7 +83,6 @@ private: Threads *m_threads; ServiceDaemon* m_service_daemon; - ImageDeleter* m_image_deleter; RadosRef m_local_rados; std::string m_local_mirror_uuid; int64_t m_local_pool_id; diff --git a/src/tools/rbd_mirror/PoolReplayer.cc b/src/tools/rbd_mirror/PoolReplayer.cc index a75566c667799..cca56443ba57f 100644 --- a/src/tools/rbd_mirror/PoolReplayer.cc +++ b/src/tools/rbd_mirror/PoolReplayer.cc @@ -319,8 +319,8 @@ void PoolReplayer::init() image_deleter_ctx.wait(); m_instance_replayer.reset(InstanceReplayer<>::create( - m_threads, m_service_daemon, m_image_deleter.get(), m_local_rados, - local_mirror_uuid, m_local_pool_id)); + m_threads, m_service_daemon, m_local_rados, local_mirror_uuid, + m_local_pool_id)); m_instance_replayer->init(); m_instance_replayer->add_peer(m_peer.uuid, m_remote_io_ctx); -- 2.39.5