From: xie xingguo Date: Tue, 27 Jun 2017 07:02:08 +0000 (+0800) Subject: os/bluestore: _do_clone_range:: narrow dirty range X-Git-Tag: v12.1.1~121^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0ae5d92d42500e5ab08253a00bda47b957767ebc;p=ceph.git os/bluestore: _do_clone_range:: narrow dirty range Signed-off-by: xie xingguo --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 2a296aebca7c..84a4da26d19f 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -10827,7 +10827,9 @@ int BlueStore::_do_clone_range( CollectionRef& c, OnodeRef& oldo, OnodeRef& newo, - uint64_t srcoff, uint64_t length, uint64_t dstoff) + uint64_t srcoff, + uint64_t length, + uint64_t dstoff) { dout(15) << __func__ << " " << c->cid << " " << oldo->oid << " -> " << newo->oid @@ -10844,8 +10846,9 @@ int BlueStore::_do_clone_range( e.blob->last_encoded_id = -1; } int n = 0; - bool dirtied_oldo = false; uint64_t end = srcoff + length; + uint32_t dirty_range_begin = 0; + uint32_t dirty_range_end = 0; for (auto ep = oldo->extent_map.seek_lextent(srcoff); ep != oldo->extent_map.extent_map.end(); ++ep) { @@ -10866,7 +10869,12 @@ int BlueStore::_do_clone_range( // make sure it is shared if (!blob.is_shared()) { c->make_blob_shared(_assign_blobid(txc), e.blob); - dirtied_oldo = true; // fixme: overkill + if (dirty_range_begin == 0) { + dirty_range_begin = e.logical_offset; + } + assert(e.logical_end() > 0); + // -1 to exclude next potential shard + dirty_range_end = e.logical_end() - 1; } else { c->load_shared_blob(e.blob->shared_blob); } @@ -10913,8 +10921,9 @@ int BlueStore::_do_clone_range( dout(20) << __func__ << " dst " << *ne << dendl; ++n; } - if (dirtied_oldo) { - oldo->extent_map.dirty_range(srcoff, length); // overkill + if (dirty_range_end > dirty_range_begin) { + oldo->extent_map.dirty_range(dirty_range_begin, + dirty_range_end - dirty_range_begin); txc->write_onode(oldo); } txc->write_onode(newo);