Skip to content

Commit

Permalink
librbd: acquire exclusive lock from peer when removing
Browse files Browse the repository at this point in the history
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 <dillaman@redhat.com>
  • Loading branch information
Jason Dillaman committed Mar 2, 2020
1 parent 5cd074b commit 25c2ffe
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 15 deletions.
6 changes: 3 additions & 3 deletions src/librbd/image/PreRemoveRequest.cc
Expand Up @@ -82,9 +82,9 @@ void PreRemoveRequest<I>::acquire_exclusive_lock() {
m_exclusive_lock = m_image_ctx->exclusive_lock;

auto ctx = create_context_callback<
PreRemoveRequest<I>, &PreRemoveRequest<I>::handle_exclusive_lock>(this, m_exclusive_lock);

m_exclusive_lock->try_acquire_lock(ctx);
PreRemoveRequest<I>,
&PreRemoveRequest<I>::handle_exclusive_lock>(this, m_exclusive_lock);
m_exclusive_lock->acquire_lock(ctx);
}

template <typename I>
Expand Down
24 changes: 12 additions & 12 deletions src/test/librbd/image/test_mock_PreRemoveRequest.cc
Expand Up @@ -142,11 +142,11 @@ class TestMockImagePreRemoveRequest : public TestMockFixture {
}
}

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));
}
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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);

Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 25c2ffe

Please sign in to comment.