]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test/rbd_mirror: race in TestMockInstanceWatcher on destroy 14453/head
authorMykola Golub <mgolub@mirantis.com>
Tue, 11 Apr 2017 09:55:59 +0000 (11:55 +0200)
committerMykola Golub <mgolub@mirantis.com>
Tue, 11 Apr 2017 09:55:59 +0000 (11:55 +0200)
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
src/test/rbd_mirror/test_mock_InstanceWatcher.cc

index 87aa65f3b3b77805d981d66ef88853d14286c2d8..42dfee4e04a816a26faeedf008b3a75996effc0c 100644 (file)
@@ -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