From 0e8294c9aa0c284efa3459feb8ff23a162add5d5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 6 Jun 2016 11:10:06 -0400 Subject: [PATCH] os/bluestore: make preferred csum order a function of expected_write_size Signed-off-by: Sage Weil --- src/os/bluestore/BlueStore.cc | 3 ++- src/os/bluestore/bluestore_types.cc | 9 +++++++++ src/os/bluestore/bluestore_types.h | 3 +++ src/test/objectstore/test_bluestore_types.cc | 16 ++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index e2adcf49d4723..1c41b555bc384 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 8aa11e0256f00..a8c0c8eff12d9 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 ba581a513ac5f..afecf8d5d1445 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 cd495a05b09e7..beb78fdad5776 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; -- 2.39.5