]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/osd_types: SnapSet::from_snap_set
authorSage Weil <sage@inktank.com>
Fri, 27 Dec 2013 01:51:21 +0000 (17:51 -0800)
committerSage Weil <sage@inktank.com>
Tue, 14 Jan 2014 00:19:39 +0000 (16:19 -0800)
Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/osd_types.cc
src/osd/osd_types.h

index 7d89a5ef82086bc0a241ad7d78b8ae0803f65b6f..ddb6243a1257f1e6f70e32bd2c2213e045d56c2b 100644 (file)
@@ -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<snapid_t> _snaps;
+  set<snapid_t> _clones;
+  head_exists = false;
+  for (vector<librados::clone_info_t>::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<pair<uint64_t, uint64_t> >::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<snapid_t>::iterator p = _clones.begin(); p != _clones.end(); ++p)
+    clones.push_back(*p);
+
+  // descending
+  snaps.clear();
+  snaps.reserve(_snaps.size());
+  for (set<snapid_t>::reverse_iterator p = _snaps.rbegin();
+       p != _snaps.rend(); ++p)
+    snaps.push_back(*p);
+}
+
 // -- watch_info_t --
 
 void watch_info_t::encode(bufferlist& bl) const
index 2608b529d0eb2ce5f3f0c2925b2ccb55f4f6784b..f56d6e6b756d31d23a89e8510b1605410314141c 100644 (file)
@@ -20,6 +20,8 @@
 #include <memory>
 #include <boost/scoped_ptr.hpp>
 
+#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);