]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: remove exclusive-lock requirement from snapshot purge
authorJason Dillaman <dillaman@redhat.com>
Tue, 10 Mar 2020 02:47:49 +0000 (22:47 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 10 Mar 2020 23:23:02 +0000 (19:23 -0400)
When using snapshot-based mirroring, there shouldn't be any need to
force the use of the exclusive-lock feature.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/image_deleter/test_mock_SnapshotPurgeRequest.cc
src/tools/rbd_mirror/image_deleter/SnapshotPurgeRequest.cc
src/tools/rbd_mirror/image_deleter/SnapshotPurgeRequest.h

index 627082e285c6763c5f8365ef6c555c9a4aa1f1ba..ef0d0afb1c08c8cecdee2d5e79c55d08678e204e 100644 (file)
@@ -159,7 +159,7 @@ public:
   librbd::ImageCtx *m_local_image_ctx;
 };
 
-TEST_F(TestMockImageDeleterSnapshotPurgeRequest, Success) {
+TEST_F(TestMockImageDeleterSnapshotPurgeRequest, SuccessJournal) {
   {
     std::unique_lock image_locker{m_local_image_ctx->image_lock};
     m_local_image_ctx->add_snap(cls::rbd::UserSnapshotNamespace{}, "snap1", 1,
@@ -207,6 +207,48 @@ TEST_F(TestMockImageDeleterSnapshotPurgeRequest, Success) {
   ASSERT_EQ(0, ctx.wait());
 }
 
+TEST_F(TestMockImageDeleterSnapshotPurgeRequest, SuccessSnapshot) {
+  {
+    std::unique_lock image_locker{m_local_image_ctx->image_lock};
+    m_local_image_ctx->add_snap(cls::rbd::UserSnapshotNamespace{}, "snap1", 1,
+                                0, {}, RBD_PROTECTION_STATUS_PROTECTED, 0, {});
+    m_local_image_ctx->add_snap(cls::rbd::UserSnapshotNamespace{}, "snap2", 2,
+                                0, {}, RBD_PROTECTION_STATUS_UNPROTECTED, 0,
+                                {});
+  }
+
+  librbd::MockTestImageCtx mock_image_ctx(*m_local_image_ctx);
+
+  InSequence seq;
+  expect_set_journal_policy(mock_image_ctx);
+  expect_open(mock_image_ctx, 0);
+
+  expect_get_snap_namespace(mock_image_ctx, 2,
+                            cls::rbd::UserSnapshotNamespace{}, 0);
+  expect_get_snap_name(mock_image_ctx, 2, "snap2", 0);
+  expect_is_snap_protected(mock_image_ctx, 2, false, 0);
+  expect_snap_remove(mock_image_ctx, cls::rbd::UserSnapshotNamespace{}, "snap2",
+                     0);
+
+  expect_get_snap_namespace(mock_image_ctx, 1,
+                            cls::rbd::UserSnapshotNamespace{}, 0);
+  expect_get_snap_name(mock_image_ctx, 1, "snap1", 0);
+  expect_is_snap_protected(mock_image_ctx, 1, true, 0);
+  expect_snap_unprotect(mock_image_ctx, cls::rbd::UserSnapshotNamespace{},
+                        "snap1", 0);
+  expect_snap_remove(mock_image_ctx, cls::rbd::UserSnapshotNamespace{}, "snap1",
+                     0);
+
+  expect_close(mock_image_ctx, 0);
+  expect_destroy(mock_image_ctx);
+
+  C_SaferCond ctx;
+  auto req = MockSnapshotPurgeRequest::create(m_local_io_ctx, mock_image_ctx.id,
+                                              &ctx);
+  req->send();
+  ASSERT_EQ(0, ctx.wait());
+}
+
 TEST_F(TestMockImageDeleterSnapshotPurgeRequest, OpenError) {
   {
     std::unique_lock image_locker{m_local_image_ctx->image_lock};
index 8280e38ba1833f340c3455fe02c1d1b7039febc4..642149c31aebffbe9ec838e872e86e14664151b5 100644 (file)
@@ -73,9 +73,7 @@ void SnapshotPurgeRequest<I>::acquire_lock() {
   if (m_image_ctx->exclusive_lock == nullptr) {
     m_image_ctx->owner_lock.unlock_shared();
 
-    derr << "exclusive lock not enabled" << dendl;
-    m_ret_val = -EINVAL;
-    close_image();
+    start_snap_unprotect();
     return;
   }
 
@@ -96,6 +94,13 @@ void SnapshotPurgeRequest<I>::handle_acquire_lock(int r) {
     return;
   }
 
+  start_snap_unprotect();
+}
+
+template <typename I>
+void SnapshotPurgeRequest<I>::start_snap_unprotect() {
+  dout(10) << dendl;
+
   {
     std::shared_lock image_locker{m_image_ctx->image_lock};
     m_snaps = m_image_ctx->snaps;
@@ -283,6 +288,9 @@ void SnapshotPurgeRequest<I>::finish(int r) {
 template <typename I>
 Context *SnapshotPurgeRequest<I>::start_lock_op(int* r) {
   std::shared_lock owner_locker{m_image_ctx->owner_lock};
+  if (m_image_ctx->exclusive_lock == nullptr) {
+    return new LambdaContext([](int r) {});
+  }
   return m_image_ctx->exclusive_lock->start_op(r);
 }
 
index b8b635fe765ae5f92f6edc198f26839baf8fc0b9..70cae851820c8ef12dceb28a38f5b80401218350 100644 (file)
@@ -79,6 +79,7 @@ private:
   void acquire_lock();
   void handle_acquire_lock(int r);
 
+  void start_snap_unprotect();
   void snap_unprotect();
   void handle_snap_unprotect(int r);