]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: update clone_overlap even the clone have been evicted 22572/head
authorYunchuan Wen <yunchuan.wen@kylin-cloud.com>
Fri, 15 Jun 2018 05:59:30 +0000 (13:59 +0800)
committerYunchuan Wen <yunchuan.wen@kylin-cloud.com>
Fri, 22 Jun 2018 13:55:41 +0000 (21:55 +0800)
the clone_overlap is difference of range between head and clones.
if the clone have been evicted, the clone_overlap is still exist in the
snapset, so we should update the clone_overlap to make it sense.

Signed-off-by: Yunchuan Wen <yunchuan.wen@kylin-cloud.com>
src/osd/PrimaryLogPG.cc

index 03b974274f1f183c4c6a8def4ea414e72f510e05..775ed0c589b3b29282d969bc349ade924661e709 100644 (file)
@@ -8075,18 +8075,21 @@ void PrimaryLogPG::make_writeable(OpContext *ctx)
 
   // update most recent clone_overlap and usage stats
   if (ctx->new_snapset.clones.size() > 0) {
+    // the clone_overlap is difference of range between head and clones.
     // we need to check whether the most recent clone exists, if it's
-    // been evicted, it's not included in the stats
+    // been evicted, it's not included in the stats, but the clone_overlap
+    // is still exist in the snapset, so we should update the
+    // clone_overlap to make it sense.
     hobject_t last_clone_oid = soid;
     last_clone_oid.snap = ctx->new_snapset.clone_overlap.rbegin()->first;
+    interval_set<uint64_t> &newest_overlap =
+      ctx->new_snapset.clone_overlap.rbegin()->second;
+    ctx->modified_ranges.intersection_of(newest_overlap);
     if (is_present_clone(last_clone_oid)) {
-      interval_set<uint64_t> &newest_overlap =
-       ctx->new_snapset.clone_overlap.rbegin()->second;
-      ctx->modified_ranges.intersection_of(newest_overlap);
       // modified_ranges is still in use by the clone
       ctx->delta_stats.num_bytes += ctx->modified_ranges.size();
-      newest_overlap.subtract(ctx->modified_ranges);
     }
+    newest_overlap.subtract(ctx->modified_ranges);
   }
   
   if (snapc.seq > ctx->new_snapset.seq) {