From f1b2c6a841ff90e48e8b602a9f0454a14b8f32f8 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Sat, 12 Jan 2019 15:55:25 +0000 Subject: [PATCH] test/rbd_mirror: wait for release leader lock fully complete 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 --- .../rbd_mirror/test_mock_LeaderWatcher.cc | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/test/rbd_mirror/test_mock_LeaderWatcher.cc b/src/test/rbd_mirror/test_mock_LeaderWatcher.cc index d83fe92aaa300..8074a5a5c2ae5 100644 --- a/src/test/rbd_mirror/test_mock_LeaderWatcher.cc +++ b/src/test/rbd_mirror/test_mock_LeaderWatcher.cc @@ -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 { } 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); })); } -- 2.47.3