From: Sage Weil Date: Fri, 27 Dec 2013 01:51:21 +0000 (-0800) Subject: osd/osd_types: SnapSet::from_snap_set X-Git-Tag: v0.77~22^2~42 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0554735872afd0b7b7dbaecc8c8c6511efe9c0bc;p=ceph.git osd/osd_types: SnapSet::from_snap_set Signed-off-by: Sage Weil --- diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 7d89a5ef8208..ddb6243a1257 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -3062,6 +3062,49 @@ ostream& operator<<(ostream& out, const SnapSet& cs) << (cs.head_exists ? "+head":""); } +void SnapSet::from_snap_set(const librados::snap_set_t& ss) +{ + // NOTE: our reconstruction of snaps (and the snapc) is not strictly + // correct: it will not include snaps that still logically exist + // but for which there was no clone that is defined. For all + // practical purposes this doesn't matter, since we only use that + // information to clone on the OSD, and we have already moved + // forward past that part of the object history. + + seq = ss.seq; + set _snaps; + set _clones; + head_exists = false; + for (vector::const_iterator p = ss.clones.begin(); + p != ss.clones.end(); + ++p) { + if (p->cloneid == librados::SNAP_HEAD) { + head_exists = true; + } else { + _clones.insert(p->cloneid); + _snaps.insert(p->snaps.begin(), p->snaps.end()); + clone_size[p->cloneid] = p->size; + clone_overlap[p->cloneid]; // the entry must exist, even if it's empty. + for (vector >::const_iterator q = + p->overlap.begin(); q != p->overlap.end(); ++q) + clone_overlap[p->cloneid].insert(q->first, q->second); + } + } + + // ascending + clones.clear(); + clones.reserve(_clones.size()); + for (set::iterator p = _clones.begin(); p != _clones.end(); ++p) + clones.push_back(*p); + + // descending + snaps.clear(); + snaps.reserve(_snaps.size()); + for (set::reverse_iterator p = _snaps.rbegin(); + p != _snaps.rend(); ++p) + snaps.push_back(*p); +} + // -- 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 2608b529d0eb..f56d6e6b756d 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -20,6 +20,8 @@ #include #include +#include "include/rados/rados_types.hpp" + #include "msg/msg_types.h" #include "include/types.h" #include "include/utime.h" @@ -2104,6 +2106,9 @@ struct SnapSet { bufferlist::iterator p = bl.begin(); decode(p); } + + /// populate SnapSet from a librados::snap_set_t + void from_snap_set(const librados::snap_set_t& ss); void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bl);