]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: honor FUA op flag for write_same() in write-around cache 44992/head
authorIlya Dryomov <idryomov@gmail.com>
Fri, 15 Oct 2021 16:13:55 +0000 (18:13 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Fri, 11 Feb 2022 17:53:04 +0000 (18:53 +0100)
WriteAroundObjectDispatch::write_same() should pass op_flags through
to dispatch_io() so that it can bypass the cache if needed.

Fixes: https://tracker.ceph.com/issues/52956
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
(cherry picked from commit 0dcea098cf4d51bed31d8646dc3b533514c08a72)

src/librbd/cache/WriteAroundObjectDispatch.cc
src/test/librbd/cache/test_mock_WriteAroundObjectDispatch.cc

index 3a6d315813d9c51e9a18d6032e2bba377fc94062..3beadd65bc9431dbaf652f3c4bfe42ea1f182030 100644 (file)
@@ -108,8 +108,8 @@ bool WriteAroundObjectDispatch<I>::write_same(
   ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " "
                  << object_off << "~" << object_len << dendl;
 
-  return dispatch_io(object_no, object_off, object_len, 0, dispatch_result,
-                     on_finish, on_dispatched);
+  return dispatch_io(object_no, object_off, object_len, op_flags,
+                     dispatch_result, on_finish, on_dispatched);
 }
 
 template <typename I>
index ee7cfc5fd3911a8aacaa9d0a52ca9b65047377be..5b3e5b956657297c9127638ec7bd617c17b45666 100644 (file)
@@ -632,7 +632,7 @@ TEST_F(TestMockCacheWriteAroundObjectDispatch, UnoptimizedIOBlockedIO) {
   finish_ctx_ptr2->complete(0);
 }
 
-TEST_F(TestMockCacheWriteAroundObjectDispatch, FUA) {
+TEST_F(TestMockCacheWriteAroundObjectDispatch, WriteFUA) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
@@ -655,5 +655,29 @@ TEST_F(TestMockCacheWriteAroundObjectDispatch, FUA) {
   ASSERT_EQ(finish_ctx_ptr, &finish_ctx);
 }
 
+TEST_F(TestMockCacheWriteAroundObjectDispatch, WriteSameFUA) {
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+  MockTestImageCtx mock_image_ctx(*ictx);
+  MockWriteAroundObjectDispatch object_dispatch(&mock_image_ctx, 16384, false);
+
+  InSequence seq;
+
+  bufferlist data;
+  data.append(std::string(512, '1'));
+
+  io::DispatchResult dispatch_result;
+  MockContext finish_ctx;
+  MockContext dispatch_ctx;
+  Context* finish_ctx_ptr = &finish_ctx;
+  ASSERT_FALSE(object_dispatch.write_same(0, 0, 8192, {{0, 8192}},
+                                          std::move(data), {},
+                                          LIBRADOS_OP_FLAG_FADVISE_FUA, {},
+                                          nullptr, nullptr, &dispatch_result,
+                                          &finish_ctx_ptr, &dispatch_ctx));
+  ASSERT_EQ(finish_ctx_ptr, &finish_ctx);
+}
+
 } // namespace cache
 } // namespace librbd