From eba021c151f252a80a7d117f144216b6e2c9460f Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 21 Jul 2017 15:40:03 -0400 Subject: [PATCH] rbd-mirror: ensure threads are mockable for testing Signed-off-by: Jason Dillaman --- src/test/journal/mock/MockJournaler.h | 8 +- src/test/rbd_mirror/mock/MockSafeTimer.h | 2 +- .../rbd_mirror/test_mock_ImageReplayer.cc | 134 +++++++++++++++--- .../rbd_mirror/test_mock_InstanceReplayer.cc | 79 ++++++++--- src/tools/rbd_mirror/ImageReplayer.cc | 2 +- src/tools/rbd_mirror/ImageReplayer.h | 6 +- 6 files changed, 182 insertions(+), 49 deletions(-) diff --git a/src/test/journal/mock/MockJournaler.h b/src/test/journal/mock/MockJournaler.h index e37d3550ba612..2182c8db4fc1a 100644 --- a/src/test/journal/mock/MockJournaler.h +++ b/src/test/journal/mock/MockJournaler.h @@ -13,9 +13,7 @@ #include class Context; -class ContextWQ; class Mutex; -class SafeTimer; namespace journal { @@ -146,8 +144,10 @@ struct MockJournalerProxy { MockJournaler::get_instance().construct(); } - MockJournalerProxy(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock, - librados::IoCtx &header_ioctx, const std::string &journal_id, + template + MockJournalerProxy(WorkQueue *work_queue, Timer *timer, Mutex *timer_lock, + librados::IoCtx &header_ioctx, + const std::string &journal_id, const std::string &client_id, const Settings&) { MockJournaler::get_instance().construct(); } diff --git a/src/test/rbd_mirror/mock/MockSafeTimer.h b/src/test/rbd_mirror/mock/MockSafeTimer.h index 4926660b9ea36..3de5fbcdbf5cc 100644 --- a/src/test/rbd_mirror/mock/MockSafeTimer.h +++ b/src/test/rbd_mirror/mock/MockSafeTimer.h @@ -10,7 +10,7 @@ struct Context; struct MockSafeTimer { MOCK_METHOD2(add_event_after, void(double, Context*)); - MOCK_METHOD1(cancel_event, void(Context *)); + MOCK_METHOD1(cancel_event, bool(Context *)); }; #endif // CEPH_MOCK_SAFE_TIMER_H diff --git a/src/test/rbd_mirror/test_mock_ImageReplayer.cc b/src/test/rbd_mirror/test_mock_ImageReplayer.cc index 8344fc6deade7..cb0e464bba2ce 100644 --- a/src/test/rbd_mirror/test_mock_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_mock_ImageReplayer.cc @@ -7,6 +7,7 @@ #include "tools/rbd_mirror/ImageDeleter.h" #include "tools/rbd_mirror/ImageReplayer.h" #include "tools/rbd_mirror/InstanceWatcher.h" +#include "tools/rbd_mirror/Threads.h" #include "tools/rbd_mirror/image_replayer/BootstrapRequest.h" #include "tools/rbd_mirror/image_replayer/CloseImageRequest.h" #include "tools/rbd_mirror/image_replayer/EventPreprocessor.h" @@ -16,6 +17,8 @@ #include "test/journal/mock/MockJournaler.h" #include "test/librbd/mock/MockImageCtx.h" #include "test/librbd/mock/MockJournal.h" +#include "test/rbd_mirror/mock/MockContextWQ.h" +#include "test/rbd_mirror/mock/MockSafeTimer.h" namespace librbd { @@ -62,6 +65,24 @@ struct MirrorPeerClientMeta; namespace rbd { namespace mirror { +template <> +struct Threads { + MockSafeTimer *timer; + Mutex &timer_lock; + + MockContextWQ *work_queue; + + Threads(Threads *threads) + : timer(new MockSafeTimer()), + timer_lock(threads->timer_lock), + work_queue(new MockContextWQ()) { + } + ~Threads() { + delete timer; + delete work_queue; + } +}; + template <> struct ImageDeleter { MOCK_METHOD4(schedule_image_delete, void(RadosRef, int64_t, @@ -98,7 +119,7 @@ struct PrepareLocalImageRequest { const std::string &global_image_id, std::string *local_image_id, std::string *tag_owner, - ContextWQ *work_queue, + MockContextWQ *work_queue, Context *on_finish) { assert(s_instance != nullptr); s_instance->local_image_id = local_image_id; @@ -152,8 +173,9 @@ struct BootstrapRequest { rbd::mirror::InstanceWatcher *instance_watcher, librbd::MockTestImageCtx **local_image_ctx, const std::string &local_image_name, const std::string &remote_image_id, - const std::string &global_image_id, ContextWQ *work_queue, - SafeTimer *timer, Mutex *timer_lock, const std::string &local_mirror_uuid, + const std::string &global_image_id, MockContextWQ *work_queue, + MockSafeTimer *timer, Mutex *timer_lock, + const std::string &local_mirror_uuid, const std::string &remote_mirror_uuid, ::journal::MockJournalerProxy *journaler, librbd::journal::MirrorPeerClientMeta *client_meta, @@ -225,7 +247,7 @@ struct EventPreprocessor { ::journal::MockJournalerProxy &remote_journaler, const std::string &local_mirror_uuid, librbd::journal::MirrorPeerClientMeta *client_meta, - ContextWQ *work_queue) { + MockContextWQ *work_queue) { assert(s_instance != nullptr); return s_instance; } @@ -292,6 +314,7 @@ namespace mirror { class TestMockImageReplayer : public TestMockFixture { public: + typedef Threads MockThreads; typedef ImageDeleter MockImageDeleter; typedef BootstrapRequest MockBootstrapRequest; typedef CloseImageRequest MockCloseImageRequest; @@ -323,6 +346,26 @@ public: ASSERT_EQ(0, open_image(m_local_io_ctx, m_image_name, &m_local_image_ctx)); } + void expect_work_queue_repeatedly(MockThreads &mock_threads) { + EXPECT_CALL(*mock_threads.work_queue, queue(_, _)) + .WillRepeatedly(Invoke([this](Context *ctx, int r) { + m_threads->work_queue->queue(ctx, r); + })); + } + + void expect_add_event_after_repeatedly(MockThreads &mock_threads) { + EXPECT_CALL(*mock_threads.timer, add_event_after(_, _)) + .WillRepeatedly( + Invoke([this](double seconds, Context *ctx) { + m_threads->timer->add_event_after(seconds, ctx); + })); + EXPECT_CALL(*mock_threads.timer, cancel_event(_)) + .WillRepeatedly( + Invoke([this](Context *ctx) { + return m_threads->timer->cancel_event(ctx); + })); + } + void expect_wait_for_scheduled_deletion(MockImageDeleter& mock_image_deleter, const std::string& global_image_id, int r) { @@ -506,9 +549,10 @@ public: WithArg<2>(CompleteContext(on_commit_r)))); } - void create_image_replayer(MockImageDeleter &mock_image_deleter) { + void create_image_replayer(MockThreads &mock_threads, + MockImageDeleter &mock_image_deleter) { m_image_replayer = new MockImageReplayer( - m_threads, &mock_image_deleter, &m_instance_watcher, + &mock_threads, &mock_image_deleter, &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); @@ -530,6 +574,10 @@ TEST_F(TestMockImageReplayer, StartStop) { mock_local_image_ctx.journal = &mock_local_journal; journal::MockJournaler mock_remote_journaler; + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -560,7 +608,7 @@ TEST_F(TestMockImageReplayer, StartStop) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -593,6 +641,10 @@ TEST_F(TestMockImageReplayer, LocalImagePrimary) { create_local_image(); librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx); + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockReplayStatusFormatter mock_replay_status_formatter; @@ -604,7 +656,7 @@ TEST_F(TestMockImageReplayer, LocalImagePrimary) { expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "", 0); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -616,6 +668,10 @@ TEST_F(TestMockImageReplayer, LocalImageDNE) { librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx); journal::MockJournaler mock_remote_journaler; + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -635,7 +691,7 @@ TEST_F(TestMockImageReplayer, LocalImageDNE) { EXPECT_CALL(mock_remote_journaler, remove_listener(_)); expect_shut_down(mock_remote_journaler, 0); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -646,6 +702,10 @@ TEST_F(TestMockImageReplayer, PrepareLocalImageError) { create_local_image(); librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx); + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockReplayStatusFormatter mock_replay_status_formatter; @@ -657,7 +717,7 @@ TEST_F(TestMockImageReplayer, PrepareLocalImageError) { expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id, "remote mirror uuid", -EINVAL); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -668,6 +728,10 @@ TEST_F(TestMockImageReplayer, GetRemoteImageIdDNE) { create_local_image(); librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx); + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -682,7 +746,7 @@ TEST_F(TestMockImageReplayer, GetRemoteImageIdDNE) { expect_send(mock_prepare_remote_image_request, "remote mirror uuid", "", -ENOENT); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -693,6 +757,10 @@ TEST_F(TestMockImageReplayer, GetRemoteImageIdNonLinkedDNE) { create_local_image(); librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx); + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -707,7 +775,7 @@ TEST_F(TestMockImageReplayer, GetRemoteImageIdNonLinkedDNE) { expect_send(mock_prepare_remote_image_request, "remote mirror uuid", "", -ENOENT); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -718,6 +786,10 @@ TEST_F(TestMockImageReplayer, GetRemoteImageIdError) { create_local_image(); librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx); + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -732,7 +804,7 @@ TEST_F(TestMockImageReplayer, GetRemoteImageIdError) { expect_send(mock_prepare_remote_image_request, "remote mirror uuid", m_remote_image_ctx->id, -EINVAL); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -745,6 +817,10 @@ TEST_F(TestMockImageReplayer, BootstrapError) { librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx); journal::MockJournaler mock_remote_journaler; + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -765,7 +841,7 @@ TEST_F(TestMockImageReplayer, BootstrapError) { EXPECT_CALL(mock_remote_journaler, remove_listener(_)); expect_shut_down(mock_remote_journaler, 0); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -782,6 +858,10 @@ TEST_F(TestMockImageReplayer, StartExternalReplayError) { mock_local_image_ctx.journal = &mock_local_journal; journal::MockJournaler mock_remote_journaler; + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -817,7 +897,7 @@ TEST_F(TestMockImageReplayer, StartExternalReplayError) { EXPECT_CALL(mock_remote_journaler, remove_listener(_)); expect_shut_down(mock_remote_journaler, 0); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -836,6 +916,10 @@ TEST_F(TestMockImageReplayer, StopError) { mock_local_image_ctx.journal = &mock_local_journal; journal::MockJournaler mock_remote_journaler; + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -866,7 +950,7 @@ TEST_F(TestMockImageReplayer, StopError) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -901,6 +985,10 @@ TEST_F(TestMockImageReplayer, Replay) { mock_local_image_ctx.journal = &mock_local_journal; journal::MockJournaler mock_remote_journaler; + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -934,7 +1022,7 @@ TEST_F(TestMockImageReplayer, Replay) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -1007,6 +1095,10 @@ TEST_F(TestMockImageReplayer, DecodeError) { mock_local_image_ctx.journal = &mock_local_journal; journal::MockJournaler mock_remote_journaler; + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -1039,7 +1131,7 @@ TEST_F(TestMockImageReplayer, DecodeError) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); @@ -1104,6 +1196,10 @@ TEST_F(TestMockImageReplayer, DelayedReplay) { mock_local_image_ctx.journal = &mock_local_journal; journal::MockJournaler mock_remote_journaler; + MockThreads mock_threads(m_threads); + expect_work_queue_repeatedly(mock_threads); + expect_add_event_after_repeatedly(mock_threads); + MockImageDeleter mock_image_deleter; MockPrepareLocalImageRequest mock_prepare_local_image_request; MockPrepareRemoteImageRequest mock_prepare_remote_image_request; @@ -1137,7 +1233,7 @@ TEST_F(TestMockImageReplayer, DelayedReplay) { EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _)); - create_image_replayer(mock_image_deleter); + create_image_replayer(mock_threads, mock_image_deleter); C_SaferCond start_ctx; m_image_replayer->start(&start_ctx); diff --git a/src/test/rbd_mirror/test_mock_InstanceReplayer.cc b/src/test/rbd_mirror/test_mock_InstanceReplayer.cc index f12fcf2989eff..21bf07a87dd8e 100644 --- a/src/test/rbd_mirror/test_mock_InstanceReplayer.cc +++ b/src/test/rbd_mirror/test_mock_InstanceReplayer.cc @@ -3,6 +3,8 @@ #include "test/librbd/mock/MockImageCtx.h" #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" @@ -30,13 +32,20 @@ namespace mirror { template <> struct Threads { + MockSafeTimer *timer; Mutex &timer_lock; - SafeTimer *timer; - ContextWQ *work_queue; + Cond timer_cond; + + MockContextWQ *work_queue; Threads(Threads *threads) - : timer_lock(threads->timer_lock), timer(threads->timer), - work_queue(threads->work_queue) { + : timer(new MockSafeTimer()), + timer_lock(threads->timer_lock), + work_queue(new MockContextWQ()) { + } + ~Threads() { + delete timer; + delete work_queue; } }; @@ -117,57 +126,75 @@ using ::testing::WithArg; class TestMockInstanceReplayer : public TestMockFixture { public: + typedef Threads MockThreads; typedef ImageDeleter MockImageDeleter; typedef ImageReplayer MockImageReplayer; typedef InstanceReplayer MockInstanceReplayer; typedef InstanceWatcher MockInstanceWatcher; typedef ServiceDaemon MockServiceDaemon; - typedef Threads MockThreads; - - void SetUp() override { - TestMockFixture::SetUp(); - m_mock_threads = new MockThreads(m_threads); + void expect_work_queue(MockThreads &mock_threads) { + EXPECT_CALL(*mock_threads.work_queue, queue(_, _)) + .WillOnce(Invoke([this](Context *ctx, int r) { + m_threads->work_queue->queue(ctx, r); + })); } - void TearDown() override { - delete m_mock_threads; - TestMockFixture::TearDown(); + void expect_add_event_after(MockThreads &mock_threads, + Context** timer_ctx = nullptr) { + EXPECT_CALL(*mock_threads.timer, add_event_after(_, _)) + .WillOnce(WithArg<1>( + Invoke([this, &mock_threads, timer_ctx](Context *ctx) { + assert(mock_threads.timer_lock.is_locked()); + if (timer_ctx != nullptr) { + *timer_ctx = ctx; + mock_threads.timer_cond.SignalOne(); + } else { + m_threads->work_queue->queue( + new FunctionContext([&mock_threads, ctx](int) { + Mutex::Locker timer_lock(mock_threads.timer_lock); + ctx->complete(0); + }), 0); + } + }))); } - MockThreads *m_mock_threads; + void expect_cancel_event(MockThreads &mock_threads, bool canceled) { + EXPECT_CALL(*mock_threads.timer, cancel_event(_)) + .WillOnce(Return(canceled)); + } }; 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( - m_mock_threads, &mock_service_daemon, &mock_image_deleter, + &mock_threads, &mock_service_daemon, &mock_image_deleter, 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"); EXPECT_CALL(mock_image_replayer, get_global_image_id()) .WillRepeatedly(ReturnRef(global_image_id)); - EXPECT_CALL(mock_image_replayer, is_blacklisted()) - .WillRepeatedly(Return(false)); InSequence seq; - + expect_work_queue(mock_threads); + Context *timer_ctx = nullptr; + expect_add_event_after(mock_threads, &timer_ctx); instance_replayer.init(); instance_replayer.add_peer("peer_uuid", m_remote_io_ctx); // Acquire C_SaferCond on_acquire; - EXPECT_CALL(mock_image_replayer, add_peer("peer_uuid", _)); - EXPECT_CALL(mock_image_replayer, is_stopped()) - .WillOnce(Return(true)); + EXPECT_CALL(mock_image_replayer, is_stopped()).WillOnce(Return(true)); + EXPECT_CALL(mock_image_replayer, is_blacklisted()).WillOnce(Return(false)); EXPECT_CALL(mock_image_replayer, start(nullptr, false)); + expect_work_queue(mock_threads); instance_replayer.acquire_image(&mock_instance_watcher, global_image_id, &on_acquire); @@ -181,20 +208,30 @@ TEST_F(TestMockInstanceReplayer, AcquireReleaseImage) { .WillOnce(Return(false)); EXPECT_CALL(mock_image_replayer, is_running()) .WillOnce(Return(false)); + expect_work_queue(mock_threads); + expect_add_event_after(mock_threads); + expect_work_queue(mock_threads); EXPECT_CALL(mock_image_replayer, is_stopped()) .WillOnce(Return(false)); EXPECT_CALL(mock_image_replayer, is_running()) .WillOnce(Return(true)); EXPECT_CALL(mock_image_replayer, stop(_, false)) .WillOnce(CompleteContext(0)); + expect_work_queue(mock_threads); EXPECT_CALL(mock_image_replayer, is_stopped()) .WillOnce(Return(true)); + expect_work_queue(mock_threads); EXPECT_CALL(mock_image_replayer, destroy()); instance_replayer.release_image("global_image_id", &on_release); ASSERT_EQ(0, on_release.wait()); + expect_work_queue(mock_threads); + expect_cancel_event(mock_threads, true); + expect_work_queue(mock_threads); instance_replayer.shut_down(); + ASSERT_TRUE(timer_ctx != nullptr); + delete timer_ctx; } } // namespace mirror diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index 2cba8ed06193c..4de783e15616f 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -272,7 +272,7 @@ void ImageReplayer::RemoteJournalerListener::handle_update( } template -ImageReplayer::ImageReplayer(Threads *threads, +ImageReplayer::ImageReplayer(Threads *threads, ImageDeleter* image_deleter, InstanceWatcher *instance_watcher, RadosRef local, diff --git a/src/tools/rbd_mirror/ImageReplayer.h b/src/tools/rbd_mirror/ImageReplayer.h index c0d7cd17a43b4..8705fc09ac219 100644 --- a/src/tools/rbd_mirror/ImageReplayer.h +++ b/src/tools/rbd_mirror/ImageReplayer.h @@ -62,7 +62,7 @@ template class ImageReplayer { public: static ImageReplayer *create( - Threads *threads, ImageDeleter* image_deleter, + 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) { @@ -74,7 +74,7 @@ public: delete this; } - ImageReplayer(Threads *threads, + ImageReplayer(Threads *threads, ImageDeleter* image_deleter, InstanceWatcher *instance_watcher, RadosRef local, const std::string &local_mirror_uuid, @@ -265,7 +265,7 @@ private: ImageReplayer *replayer; }; - Threads *m_threads; + Threads *m_threads; ImageDeleter* m_image_deleter; InstanceWatcher *m_instance_watcher; -- 2.39.5