From 25c2ffe145becf6e32dd88682673f9761ee62fa8 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 27 Feb 2020 14:50:59 -0500 Subject: [PATCH] librbd: acquire exclusive lock from peer when removing This solves an issue with snapshot-based mirroring when the rbd-mirror daemon is the exclusive lock owner. For other cases, it still checks for watchers before proceeding. Signed-off-by: Jason Dillaman --- src/librbd/image/PreRemoveRequest.cc | 6 ++--- .../image/test_mock_PreRemoveRequest.cc | 24 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/librbd/image/PreRemoveRequest.cc b/src/librbd/image/PreRemoveRequest.cc index ccd2e369dd6..a75b971f7ce 100644 --- a/src/librbd/image/PreRemoveRequest.cc +++ b/src/librbd/image/PreRemoveRequest.cc @@ -82,9 +82,9 @@ void PreRemoveRequest::acquire_exclusive_lock() { m_exclusive_lock = m_image_ctx->exclusive_lock; auto ctx = create_context_callback< - PreRemoveRequest, &PreRemoveRequest::handle_exclusive_lock>(this, m_exclusive_lock); - - m_exclusive_lock->try_acquire_lock(ctx); + PreRemoveRequest, + &PreRemoveRequest::handle_exclusive_lock>(this, m_exclusive_lock); + m_exclusive_lock->acquire_lock(ctx); } template diff --git a/src/test/librbd/image/test_mock_PreRemoveRequest.cc b/src/test/librbd/image/test_mock_PreRemoveRequest.cc index a438be8f187..08c6eb1627c 100644 --- a/src/test/librbd/image/test_mock_PreRemoveRequest.cc +++ b/src/test/librbd/image/test_mock_PreRemoveRequest.cc @@ -142,11 +142,11 @@ public: } } - void expect_try_acquire_exclusive_lock(MockTestImageCtx &mock_image_ctx, - MockExclusiveLock &mock_exclusive_lock, - int r) { + void expect_acquire_exclusive_lock(MockTestImageCtx &mock_image_ctx, + MockExclusiveLock &mock_exclusive_lock, + int r) { if (m_mock_imctx->exclusive_lock != nullptr) { - EXPECT_CALL(mock_exclusive_lock, try_acquire_lock(_)) + EXPECT_CALL(mock_exclusive_lock, acquire_lock(_)) .WillOnce(CompleteContext(r, mock_image_ctx.image_ctx->op_work_queue)); } } @@ -213,7 +213,7 @@ TEST_F(TestMockImagePreRemoveRequest, Success) { InSequence seq; expect_set_journal_policy(*m_mock_imctx); - expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); + expect_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); expect_is_exclusive_lock_owner(*m_mock_imctx, mock_exclusive_lock, true); MockListWatchersRequest mock_list_watchers_request; @@ -251,7 +251,7 @@ TEST_F(TestMockImagePreRemoveRequest, ExclusiveLockTryAcquireFailed) { InSequence seq; expect_set_journal_policy(*m_mock_imctx); - expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, + expect_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, -EINVAL); C_SaferCond ctx; @@ -272,7 +272,7 @@ TEST_F(TestMockImagePreRemoveRequest, ExclusiveLockTryAcquireNotLockOwner) { InSequence seq; expect_set_journal_policy(*m_mock_imctx); - expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); + expect_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); expect_is_exclusive_lock_owner(*m_mock_imctx, mock_exclusive_lock, false); C_SaferCond ctx; @@ -293,7 +293,7 @@ TEST_F(TestMockImagePreRemoveRequest, Force) { InSequence seq; expect_set_journal_policy(*m_mock_imctx); - expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, + expect_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, -EINVAL); expect_shut_down_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); @@ -320,7 +320,7 @@ TEST_F(TestMockImagePreRemoveRequest, ExclusiveLockShutDownFailed) { InSequence seq; expect_set_journal_policy(*m_mock_imctx); - expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, -EINVAL); + expect_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, -EINVAL); expect_shut_down_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, -EINVAL); C_SaferCond ctx; @@ -366,7 +366,7 @@ TEST_F(TestMockImagePreRemoveRequest, Watchers) { InSequence seq; expect_set_journal_policy(*m_mock_imctx); - expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); + expect_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); expect_is_exclusive_lock_owner(*m_mock_imctx, mock_exclusive_lock, true); MockListWatchersRequest mock_list_watchers_request; @@ -393,7 +393,7 @@ TEST_F(TestMockImagePreRemoveRequest, GroupError) { InSequence seq; expect_set_journal_policy(*m_mock_imctx); - expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); + expect_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); expect_is_exclusive_lock_owner(*m_mock_imctx, mock_exclusive_lock, true); MockListWatchersRequest mock_list_watchers_request; @@ -424,7 +424,7 @@ TEST_F(TestMockImagePreRemoveRequest, AutoDeleteSnapshots) { InSequence seq; expect_set_journal_policy(*m_mock_imctx); - expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); + expect_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0); expect_is_exclusive_lock_owner(*m_mock_imctx, mock_exclusive_lock, true); MockListWatchersRequest mock_list_watchers_request; -- 2.39.5