]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/rbd_mirror: wait for release leader lock fully complete 25935/head
authorMykola Golub <mgolub@suse.com>
Sat, 12 Jan 2019 15:55:25 +0000 (15:55 +0000)
committerMykola Golub <mgolub@suse.com>
Sat, 12 Jan 2019 16:03:31 +0000 (16:03 +0000)
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>
src/test/rbd_mirror/test_mock_LeaderWatcher.cc

index d83fe92aaa300c83f9764c4c1f770427a3f4e061..8074a5a5c2ae504ec949d05b89a6193e7125a514 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);
                        }));
   }