]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: ignore blacklist error when releasing exclusive lock
authorJason Dillaman <dillaman@redhat.com>
Wed, 4 Jan 2017 17:12:27 +0000 (12:12 -0500)
committerJason Dillaman <dillaman@redhat.com>
Wed, 11 Jan 2017 20:46:23 +0000 (15:46 -0500)
This ensures the journal and object map are properly closed so that the
image can be properly closed w/o failing any assertions.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 418dcf29cb8c450049047e09a4dad2941af87018)

src/librbd/exclusive_lock/ReleaseRequest.cc
src/test/librbd/exclusive_lock/test_mock_ReleaseRequest.cc

index 52343f85dfed11d0c854be7075d3805d19947775..dc496536cd782af3fa381a42a5643a1ba1ff0b18 100644 (file)
@@ -127,7 +127,11 @@ Context *ReleaseRequest<I>::handle_block_writes(int *ret_val) {
   CephContext *cct = m_image_ctx.cct;
   ldout(cct, 10) << __func__ << ": r=" << *ret_val << dendl;
 
-  if (*ret_val < 0) {
+  if (*ret_val == -EBLACKLISTED) {
+    // allow clean shut down if blacklisted
+    lderr(cct) << "failed to block writes: " << cpp_strerror(*ret_val) << dendl;
+    *ret_val = 0;
+  } else if (*ret_val < 0) {
     m_image_ctx.aio_work_queue->unblock_writes();
     return m_on_finish;
   }
index e2fb8420e2401631a78200d8808d91f8022f58c4..801099872f6e8b0188e0d6e04d3a7aef9294f7b6 100644 (file)
@@ -206,6 +206,43 @@ TEST_F(TestMockExclusiveLockReleaseRequest, SuccessObjectMapDisabled) {
   ASSERT_EQ(0, ctx.wait());
 }
 
+TEST_F(TestMockExclusiveLockReleaseRequest, Blacklisted) {
+  REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+  MockImageCtx mock_image_ctx(*ictx);
+  expect_op_work_queue(mock_image_ctx);
+
+  InSequence seq;
+  expect_prepare_lock(mock_image_ctx);
+  expect_cancel_op_requests(mock_image_ctx, 0);
+  expect_block_writes(mock_image_ctx, -EBLACKLISTED);
+  expect_flush_notifies(mock_image_ctx);
+
+  MockJournal *mock_journal = new MockJournal();
+  mock_image_ctx.journal = mock_journal;
+  expect_close_journal(mock_image_ctx, *mock_journal, -EBLACKLISTED);
+
+  MockObjectMap *mock_object_map = new MockObjectMap();
+  mock_image_ctx.object_map = mock_object_map;
+  expect_close_object_map(mock_image_ctx, *mock_object_map);
+
+  MockContext mock_releasing_ctx;
+  expect_complete_context(mock_releasing_ctx, 0);
+  expect_unlock(mock_image_ctx, -EBLACKLISTED);
+  expect_handle_prepare_lock_complete(mock_image_ctx);
+
+  C_SaferCond ctx;
+  MockReleaseRequest *req = MockReleaseRequest::create(mock_image_ctx,
+                                                       TEST_COOKIE,
+                                                       &mock_releasing_ctx,
+                                                       &ctx, false);
+  req->send();
+  ASSERT_EQ(0, ctx.wait());
+}
+
 TEST_F(TestMockExclusiveLockReleaseRequest, BlockWritesError) {
   REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);