From: Sage Weil Date: Mon, 6 Jun 2016 15:10:06 +0000 (-0400) Subject: os/bluestore: make preferred csum order a function of expected_write_size X-Git-Tag: v11.0.0~160^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0e8294c9aa0c284efa3459feb8ff23a162add5d5;p=ceph.git os/bluestore: make preferred csum order a function of expected_write_size Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index e2adcf49d472..1c41b555bc38 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -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 { diff --git a/src/os/bluestore/bluestore_types.cc b/src/os/bluestore/bluestore_types.cc index 8aa11e0256f0..a8c0c8eff12d 100644 --- a/src/os/bluestore/bluestore_types.cc +++ b/src/os/bluestore/bluestore_types.cc @@ -837,6 +837,15 @@ void bluestore_onode_t::generate_test_instances(list& 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()) diff --git a/src/os/bluestore/bluestore_types.h b/src/os/bluestore/bluestore_types.h index ba581a513ac5..afecf8d5d144 100644 --- a/src/os/bluestore/bluestore_types.h +++ b/src/os/bluestore/bluestore_types.h @@ -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::iterator find_lextent(uint64_t offset) { map::iterator fp = diff --git a/src/test/objectstore/test_bluestore_types.cc b/src/test/objectstore/test_bluestore_types.cc index cd495a05b09e..beb78fdad577 100644 --- a/src/test/objectstore/test_bluestore_types.cc +++ b/src/test/objectstore/test_bluestore_types.cc @@ -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;