From: Samuel Just Date: Sun, 6 Apr 2014 19:23:52 +0000 (-0700) Subject: ReplicatedPG::_scrub: account for clone_overlap on each clone X-Git-Tag: v0.80-rc1~89^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=32862838a1f8018d1bf03e161fae6f4ea3d7928a;p=ceph.git ReplicatedPG::_scrub: account for clone_overlap on each clone Otherwise, we end up subtracting off clone_overlap for evicted clones whose sizes we did not add in. Fixes: #7964 Signed-off-by: Samuel Just --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index be5eaa51b0ad..b84cc01b45bb 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -11114,17 +11114,6 @@ void ReplicatedPG::_scrub(ScrubMap& scrubmap) next_clone = hobject_t(); dout(20) << " snapset " << snapset << dendl; } - - // subtract off any clone overlap - for (map >::iterator q = snapset.clone_overlap.begin(); - q != snapset.clone_overlap.end(); - ++q) { - for (interval_set::const_iterator r = q->second.begin(); - r != q->second.end(); - ++r) { - stat.num_bytes -= r.get_len(); - } - } } // basic checks. @@ -11150,7 +11139,11 @@ void ReplicatedPG::_scrub(ScrubMap& scrubmap) dout(20) << mode << " " << soid << " " << oi << dendl; - stat.num_bytes += oi.size; + if (soid.is_snap()) { + stat.num_bytes += snapset.get_clone_bytes(soid.snap); + } else { + stat.num_bytes += oi.size; + } if (!soid.is_snapdir()) { if (oi.is_dirty()) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index c183dca8e3be..27b4859e8eb7 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -3448,6 +3448,21 @@ void SnapSet::from_snap_set(const librados::snap_set_t& ss) snaps.push_back(*p); } +uint64_t SnapSet::get_clone_bytes(snapid_t clone) const +{ + assert(clone_size.count(clone)); + uint64_t size = clone_size.find(clone)->second; + assert(clone_overlap.count(clone)); + const interval_set &overlap = clone_overlap.find(clone)->second; + for (interval_set::const_iterator i = overlap.begin(); + i != overlap.end(); + ++i) { + assert(size >= i.get_len()); + size -= i.get_len(); + } + return size; +} + // -- watch_info_t -- void watch_info_t::encode(bufferlist& bl) const diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 0fff4ccb64b4..e9cde1e6f85c 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -2428,6 +2428,9 @@ struct SnapSet { /// populate SnapSet from a librados::snap_set_t void from_snap_set(const librados::snap_set_t& ss); + + /// get space accounted to clone + uint64_t get_clone_bytes(snapid_t clone) const; void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bl);