]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: make preferred csum order a function of expected_write_size
authorSage Weil <sage@redhat.com>
Mon, 6 Jun 2016 15:10:06 +0000 (11:10 -0400)
committerSage Weil <sage@redhat.com>
Wed, 15 Jun 2016 19:25:29 +0000 (15:25 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/bluestore_types.cc
src/os/bluestore/bluestore_types.h
src/test/objectstore/test_bluestore_types.cc

index e2adcf49d4723e5348cf5876c090ba3294a9f657..1c41b555bc38429d09307e955829d2eb230e116c 100644 (file)
@@ -6085,7 +6085,7 @@ int BlueStore::_do_write(
     dout(20) << __func__ << " will do buffered write" << dendl;
     wctx.buffered = true;
   }
-  wctx.csum_order = block_size_order;
+  wctx.csum_order = MAX(block_size_order, o->onode.get_preferred_csum_order());
 
   // compression parameters
   unsigned alloc_hints = o->onode.alloc_hint_flags;
@@ -6101,6 +6101,7 @@ int BlueStore::_do_write(
       (alloc_hints & (CEPH_OSD_ALLOC_HINT_FLAG_IMMUTABLE|
                        CEPH_OSD_ALLOC_HINT_FLAG_APPEND_ONLY)) &&
       (alloc_hints & CEPH_OSD_ALLOC_HINT_FLAG_RANDOM_WRITE) == 0) {
+    dout(20) << __func__ << " will prefer large blob and csum sizes" << dendl;
     wctx.comp_blob_size = comp_max_blob_size;
     wctx.csum_order = min_alloc_size_order;
   } else {
index 8aa11e0256f00fb7f18e87c3e681814c1a4c1621..a8c0c8eff12d9cdc7f5d3f6b1776006f53f0ad05 100644 (file)
@@ -837,6 +837,15 @@ void bluestore_onode_t::generate_test_instances(list<bluestore_onode_t*>& o)
   // FIXME
 }
 
+size_t bluestore_onode_t::get_preferred_csum_order() const
+{
+  uint32_t t = expected_write_size;
+  if (!t) {
+    return 0;
+  }
+  return ctz(expected_write_size);
+}
+
 int bluestore_onode_t::compress_extent_map()
 {
   if (extent_map.empty())
index ba581a513ac5f3f5ea422850ec43b917d6d94d77..afecf8d5d144585ce8f5bee532297989c62b5323 100644 (file)
@@ -596,6 +596,9 @@ struct bluestore_onode_t {
       expected_write_size(0),
       alloc_hint_flags(0) {}
 
+  /// get preferred csum chunk size
+  size_t get_preferred_csum_order() const;
+
   /// find a lextent that includes offset
   map<uint64_t,bluestore_lextent_t>::iterator find_lextent(uint64_t offset) {
     map<uint64_t,bluestore_lextent_t>::iterator fp =
index cd495a05b09e7139b305fd7d04dad07a7188d05e..beb78fdad5776ed00a55861b804ef034496b15bd 100644 (file)
@@ -586,6 +586,22 @@ TEST(bluestore_blob_t, csum_bench)
   }
 }
 
+TEST(bluestore_onode_t, get_preferred_csum_order)
+{
+  bluestore_onode_t on;
+  ASSERT_EQ(0u, on.get_preferred_csum_order());
+  on.expected_write_size = 4096;
+  ASSERT_EQ(12u, on.get_preferred_csum_order());
+  on.expected_write_size = 4096;
+  ASSERT_EQ(12u, on.get_preferred_csum_order());
+  on.expected_write_size = 8192;
+  ASSERT_EQ(13u, on.get_preferred_csum_order());
+  on.expected_write_size = 8192 + 4096;
+  ASSERT_EQ(12u, on.get_preferred_csum_order());
+  on.expected_write_size = 1048576;
+  ASSERT_EQ(20u, on.get_preferred_csum_order());
+}
+
 TEST(bluestore_onode_t, find_lextent)
 {
   bluestore_onode_t on;