From: Samuel Just Date: Mon, 7 Apr 2014 00:49:20 +0000 (-0700) Subject: ReplicatedPG::trim_object: account evicted prev clone for stats X-Git-Tag: v0.80-rc1~89^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=67b2342ab831044a16573e30e9b943c9f78c942e;p=ceph.git ReplicatedPG::trim_object: account evicted prev clone for stats 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 --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 724b5394cecc5..403bf0306750b 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -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::iterator n = p - 1; - interval_set 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;