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.
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())
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
/// 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);