]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: acquire exclusive lock from peer when removing
authorJason Dillaman <dillaman@redhat.com>
Thu, 27 Feb 2020 19:50:59 +0000 (14:50 -0500)
committerJason Dillaman <dillaman@redhat.com>
Mon, 2 Mar 2020 15:53:44 +0000 (10:53 -0500)
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>
src/librbd/image/PreRemoveRequest.cc
src/test/librbd/image/test_mock_PreRemoveRequest.cc

index ccd2e369dd6ac6fa086e2bc477b41bfb19996fe6..a75b971f7ced40df9b2aea5d3a0a0091188f784d 100644 (file)
@@ -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>
index a438be8f187f8f2848b7668400d54ff0a318bc28..08c6eb1627caf2d568c726e4e5d3f0a432f70278 100644 (file)
@@ -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;