]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG::_scrub: account for clone_overlap on each clone
authorSamuel Just <sam.just@inktank.com>
Sun, 6 Apr 2014 19:23:52 +0000 (12:23 -0700)
committerSamuel Just <sam.just@inktank.com>
Mon, 7 Apr 2014 20:51:18 +0000 (13:51 -0700)
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 <sam.just@inktank.com>
src/osd/ReplicatedPG.cc
src/osd/osd_types.cc
src/osd/osd_types.h

index be5eaa51b0ad81bb5243ca798a35d68e3ae46d0e..b84cc01b45bb2719e91950ed7f8962d8bbb3783c 100644 (file)
@@ -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<snapid_t,interval_set<uint64_t> >::iterator q = snapset.clone_overlap.begin();
-          q != snapset.clone_overlap.end();
-          ++q) {
-       for (interval_set<uint64_t>::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())
index c183dca8e3be700e610bf19e56b835c30b2432ff..27b4859e8eb71d9f7f9679cff641b0652234d92a 100644 (file)
@@ -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<uint64_t> &overlap = clone_overlap.find(clone)->second;
+  for (interval_set<uint64_t>::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
index 0fff4ccb64b4d009f1330371d04eba8b14a2a51e..e9cde1e6f85c6173e004507e9d86f7702d91b2c4 100644 (file)
@@ -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);