From: Mykola Golub Date: Tue, 11 Apr 2017 09:55:59 +0000 (+0200) Subject: test/rbd_mirror: race in TestMockInstanceWatcher on destroy X-Git-Tag: v12.0.2~113^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F14453%2Fhead;p=ceph.git test/rbd_mirror: race in TestMockInstanceWatcher on destroy Signed-off-by: Mykola Golub --- diff --git a/src/test/rbd_mirror/test_mock_InstanceWatcher.cc b/src/test/rbd_mirror/test_mock_InstanceWatcher.cc index 87aa65f3b3b..42dfee4e04a 100644 --- a/src/test/rbd_mirror/test_mock_InstanceWatcher.cc +++ b/src/test/rbd_mirror/test_mock_InstanceWatcher.cc @@ -115,8 +115,14 @@ public: EXPECT_CALL(mock_managed_lock, shut_down(_)).WillOnce(CompleteContext(r)); } - void expect_destroy_lock(MockManagedLock &mock_managed_lock) { - EXPECT_CALL(mock_managed_lock, destroy()); + void expect_destroy_lock(MockManagedLock &mock_managed_lock, + Context *ctx = nullptr) { + EXPECT_CALL(mock_managed_lock, destroy()) + .WillOnce(Invoke([ctx]() { + if (ctx != nullptr) { + ctx->complete(0); + } + })); } void expect_get_locker(MockManagedLock &mock_managed_lock, @@ -218,12 +224,14 @@ TEST_F(TestMockInstanceWatcher, Remove) { expect_get_locker(mock_managed_lock, locker, 0); expect_break_lock(mock_managed_lock, locker, 0); expect_unregister_instance(mock_io_ctx, 0); - expect_destroy_lock(mock_managed_lock); + C_SaferCond on_destroy; + expect_destroy_lock(mock_managed_lock, &on_destroy); C_SaferCond on_remove; MockInstanceWatcher::remove_instance(m_local_io_ctx, m_threads->work_queue, "instance_id", &on_remove); ASSERT_EQ(0, on_remove.wait()); + ASSERT_EQ(0, on_destroy.wait()); } TEST_F(TestMockInstanceWatcher, RemoveNoent) { @@ -234,12 +242,14 @@ TEST_F(TestMockInstanceWatcher, RemoveNoent) { expect_get_locker(mock_managed_lock, librbd::managed_lock::Locker(), -ENOENT); expect_unregister_instance(mock_io_ctx, 0); - expect_destroy_lock(mock_managed_lock); + C_SaferCond on_destroy; + expect_destroy_lock(mock_managed_lock, &on_destroy); C_SaferCond on_remove; MockInstanceWatcher::remove_instance(m_local_io_ctx, m_threads->work_queue, "instance_id", &on_remove); ASSERT_EQ(0, on_remove.wait()); + ASSERT_EQ(0, on_destroy.wait()); } } // namespace mirror