]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: _do_clone_range:: narrow dirty range
authorxie xingguo <xie.xingguo@zte.com.cn>
Tue, 27 Jun 2017 07:02:08 +0000 (15:02 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Wed, 5 Jul 2017 00:25:26 +0000 (08:25 +0800)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/os/bluestore/BlueStore.cc

index 2a296aebca7c001cffecd861b5448c8390e74164..84a4da26d19f16802a3943411cc1294fd8bc74d7 100644 (file)
@@ -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);