]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/rbd_mirror: wait for release leader lock fully complete 26049/head
authorMykola Golub <mgolub@suse.com>
Sat, 12 Jan 2019 15:55:25 +0000 (15:55 +0000)
committerPrashant D <pdhange@redhat.com>
Mon, 21 Jan 2019 01:19:11 +0000 (20:19 -0500)
Previously the wait context was completed at post_release_lock
stage, which still was not the end of the lock releasing process.

Fixes: https://tracker.ceph.com/issues/37883
Signed-off-by: Mykola Golub <mgolub@suse.com>
(cherry picked from commit f1b2c6a841ff90e48e8b602a9f0454a14b8f32f8)

src/test/rbd_mirror/test_mock_LeaderWatcher.cc

index 0cccce60ee089e520318c8561acd702277fbd734..c7dfc401192e27fcee485c8e05ace1e4b7125f86 100644 (file)
@@ -33,6 +33,7 @@ struct MockManagedLock {
   }
 
   bool m_release_lock_on_shutdown = false;
+  Context *m_on_released = nullptr;
 
   MOCK_METHOD0(construct, void());
   MOCK_METHOD0(destroy, void());
@@ -103,15 +104,21 @@ struct ManagedLock<MockTestImageCtx> {
   }
 
   void release_lock(Context *on_released) {
+    ceph_assert(MockManagedLock::get_instance().m_on_released == nullptr);
+    MockManagedLock::get_instance().m_on_released = on_released;
+
     Context *post_release_ctx = new FunctionContext(
-      [this, on_released](int r) {
-        post_release_lock_handler(false, r, on_released);
+      [this](int r) {
+        ceph_assert(MockManagedLock::get_instance().m_on_released != nullptr);
+        post_release_lock_handler(false, r,
+                                  MockManagedLock::get_instance().m_on_released);
+        MockManagedLock::get_instance().m_on_released = nullptr;
       });
 
     Context *release_ctx = new FunctionContext(
-      [on_released, post_release_ctx](int r) {
+      [this, post_release_ctx](int r) {
         if (r < 0) {
-          on_released->complete(r);
+          MockManagedLock::get_instance().m_on_released->complete(r);
         } else {
           MockManagedLock::get_instance().release_lock(post_release_ctx);
         }
@@ -333,11 +340,17 @@ public:
   void expect_release_lock(MockManagedLock &mock_managed_lock, int r,
                            Context *on_finish = nullptr) {
     EXPECT_CALL(mock_managed_lock, release_lock(_))
-      .WillOnce(Invoke([on_finish, r](Context *ctx) {
-                         ctx->complete(r);
+      .WillOnce(Invoke([on_finish, &mock_managed_lock, r](Context *ctx) {
                          if (on_finish != nullptr) {
-                           on_finish->complete(0);
+                           auto on_released = mock_managed_lock.m_on_released;
+                           ceph_assert(on_released != nullptr);
+                           mock_managed_lock.m_on_released = new FunctionContext(
+                             [on_released, on_finish](int r) {
+                               on_released->complete(r);
+                               on_finish->complete(r);
+                             });
                          }
+                         ctx->complete(r);
                        }));
   }