]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG::trim_object: account evicted prev clone for stats
authorSamuel Just <sam.just@inktank.com>
Mon, 7 Apr 2014 00:49:20 +0000 (17:49 -0700)
committerSamuel Just <sam.just@inktank.com>
Mon, 7 Apr 2014 21:34:01 +0000 (14:34 -0700)
If the previous clone is evicted, we shouldn't adjust the stats to
account for its new clone_overlap value.

Fixes: #7964
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/ReplicatedPG.cc

index 724b5394cecc5423e89fcfa2f4489c731c0e640f..403bf0306750b96e0d09225d14bee936112d619b 100644 (file)
@@ -2270,20 +2270,23 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid)
        break;
     assert(p != snapset.clones.end());
     object_stat_sum_t delta;
+    delta.num_bytes -= snapset.get_clone_bytes(last);
+
     if (p != snapset.clones.begin()) {
       // not the oldest... merge overlap into next older clone
       vector<snapid_t>::iterator n = p - 1;
-      interval_set<uint64_t> keep;
-      keep.union_of(
-       snapset.clone_overlap[*n],
-       snapset.clone_overlap[*p]);
-      add_interval_usage(keep, delta);  // not deallocated
+      hobject_t prev_coid = coid;
+      prev_coid.snap = *n;
+      bool adjust_prev_bytes = is_present_clone(prev_coid);
+
+      if (adjust_prev_bytes)
+       delta.num_bytes -= snapset.get_clone_bytes(*n);
+
       snapset.clone_overlap[*n].intersection_of(
        snapset.clone_overlap[*p]);
-    } else {
-      add_interval_usage(
-       snapset.clone_overlap[last],
-       delta);  // not deallocated
+
+      if (adjust_prev_bytes)
+       delta.num_bytes += snapset.get_clone_bytes(*n);
     }
     delta.num_objects--;
     if (coi.is_dirty())
@@ -2293,7 +2296,6 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid)
       delta.num_whiteouts--;
     }
     delta.num_object_clones--;
-    delta.num_bytes -= snapset.clone_size[last];
     info.stats.stats.add(delta, obc->obs.oi.category);
     obc->obs.exists = false;