From e0a395ee2240d7565953a9bb0a1e5c336efe6336 Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Mon, 8 Apr 2019 19:41:55 +0300 Subject: [PATCH] os/bluestore: call fault_range properly prior to looking for blob to reuse Fixes: https://tracker.ceph.com/issues/21312 Signed-off-by: Igor Fedotov --- src/os/bluestore/BlueStore.cc | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index e94d9381346e3..cc5f01928565d 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -2795,7 +2795,8 @@ void BlueStore::ExtentMap::fault_range( p->extents = decode_some(v); p->loaded = true; dout(20) << __func__ << " open shard 0x" << std::hex - << p->shard_info->offset << std::dec + << p->shard_info->offset + << " for range 0x" << offset << "~" << length << std::dec << " (" << v.length() << " bytes)" << dendl; ceph_assert(p->dirty == false); ceph_assert(v.length() == p->shard_info->bytes); @@ -11508,6 +11509,20 @@ void BlueStore::_do_write_small( bufferlist bl; blp.copy(length, bl); + auto max_bsize = std::max(wctx->target_blob_size, min_alloc_size); + auto min_off = offset >= max_bsize ? offset - max_bsize : 0; + uint32_t alloc_len = min_alloc_size; + auto offset0 = p2align(offset, alloc_len); + + bool any_change; + + // search suitable extent in both forward and reverse direction in + // [offset - target_max_blob_size, offset + target_max_blob_size] range + // then check if blob can be reused via can_reuse_blob func or apply + // direct/deferred write (the latter for extents including or higher + // than 'offset' only). + o->extent_map.fault_range(db, min_off, offset + max_bsize - min_off); + // Look for an existing mutable blob we can use. auto begin = o->extent_map.extent_map.begin(); auto end = o->extent_map.extent_map.end(); @@ -11525,18 +11540,6 @@ void BlueStore::_do_write_small( prev_ep = end; // to avoid this extent check as it's a duplicate } - auto max_bsize = std::max(wctx->target_blob_size, min_alloc_size); - auto min_off = offset >= max_bsize ? offset - max_bsize : 0; - uint32_t alloc_len = min_alloc_size; - auto offset0 = p2align(offset, alloc_len); - - bool any_change; - - // search suitable extent in both forward and reverse direction in - // [offset - target_max_blob_size, offset + target_max_blob_size] range - // then check if blob can be reused via can_reuse_blob func or apply - // direct/deferred write (the latter for extents including or higher - // than 'offset' only). do { any_change = false; -- 2.39.5