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;
(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 {
// 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())
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 =
}
}
+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;