]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd/osd_types: add clone_snaps to SnapSet
authorSage Weil <sage@redhat.com>
Wed, 22 Feb 2017 17:22:37 +0000 (11:22 -0600)
committerSage Weil <sage@redhat.com>
Fri, 5 May 2017 17:38:12 +0000 (13:38 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/osd_types.cc
src/osd/osd_types.h

index f909c9e9b477f2d31a51b08b6488a18d0392bfa0..dbdea1f22ab5f30e0283eef5ce47247c725312e6 100644 (file)
@@ -4682,25 +4682,31 @@ void OSDSuperblock::generate_test_instances(list<OSDSuperblock*>& o)
 
 void SnapSet::encode(bufferlist& bl) const
 {
-  ENCODE_START(2, 2, bl);
+  ENCODE_START(3, 2, bl);
   ::encode(seq, bl);
   ::encode(head_exists, bl);
   ::encode(snaps, bl);
   ::encode(clones, bl);
   ::encode(clone_overlap, bl);
   ::encode(clone_size, bl);
+  ::encode(clone_snaps, bl);
   ENCODE_FINISH(bl);
 }
 
 void SnapSet::decode(bufferlist::iterator& bl)
 {
-  DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl);
+  DECODE_START_LEGACY_COMPAT_LEN(3, 2, 2, bl);
   ::decode(seq, bl);
   ::decode(head_exists, bl);
   ::decode(snaps, bl);
   ::decode(clones, bl);
   ::decode(clone_overlap, bl);
   ::decode(clone_size, bl);
+  if (struct_v >= 3) {
+    ::decode(clone_snaps, bl);
+  } else {
+    clone_snaps.clear();
+  }
   DECODE_FINISH(bl);
 }
 
@@ -4717,6 +4723,14 @@ void SnapSet::dump(Formatter *f) const
     f->dump_unsigned("snap", *p);
     f->dump_unsigned("size", clone_size.find(*p)->second);
     f->dump_stream("overlap") << clone_overlap.find(*p)->second;
+    auto q = clone_snaps.find(*p);
+    if (q != clone_snaps.end()) {
+      f->open_array_section("snaps");
+      for (auto s : q->second) {
+       f->dump_unsigned("snap", s);
+      }
+      f->close_section();
+    }
     f->close_section();
   }
   f->close_section();
@@ -4738,13 +4752,23 @@ void SnapSet::generate_test_instances(list<SnapSet*>& o)
   o.back()->clones.push_back(12);
   o.back()->clone_size[12] = 12345;
   o.back()->clone_overlap[12];
+  o.back()->clone_snaps[12] = {12, 10, 8};
 }
 
 ostream& operator<<(ostream& out, const SnapSet& cs)
 {
-  return out << cs.seq << "=" << cs.snaps << ":"
-            << cs.clones
-            << (cs.head_exists ? "+head":"");
+  if (cs.is_legacy()) {
+    out << cs.seq << "=" << cs.snaps << ":"
+       << cs.clones
+       << (cs.head_exists ? "+head":"");
+    if (!cs.clone_snaps.empty()) {
+      out << "+stray_clone_snaps=" << cs.clone_snaps;
+    }
+    return out;
+  } else {
+    return out << cs.seq << "=" << cs.snaps << ":"
+              << cs.clone_snaps;
+  }
 }
 
 void SnapSet::from_snap_set(const librados::snap_set_t& ss)
index f0c5db17002b2fa8dd884968a9e96d809218e86a..2489d02ce415d25230b53735838becc62838b296 100644 (file)
@@ -4291,6 +4291,7 @@ struct SnapSet {
   vector<snapid_t> clones;   // ascending
   map<snapid_t, interval_set<uint64_t> > clone_overlap;  // overlap w/ next newest
   map<snapid_t, uint64_t> clone_size;
+  map<snapid_t, vector<snapid_t>> clone_snaps;
 
   SnapSet() : seq(0), head_exists(false) {}
   explicit SnapSet(bufferlist& bl) {
@@ -4298,6 +4299,10 @@ struct SnapSet {
     decode(p);
   }
 
+  bool is_legacy() const {
+    return clone_snaps.size() < clones.size() || !head_exists;
+  }
+
   /// populate SnapSet from a librados::snap_set_t
   void from_snap_set(const librados::snap_set_t& ss);