From a7b59221691954aedfac88695df8c89e36e10739 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 22 Feb 2017 11:22:37 -0600 Subject: [PATCH] osd/osd_types: add clone_snaps to SnapSet Signed-off-by: Sage Weil --- src/osd/osd_types.cc | 34 +++++++++++++++++++++++++++++----- src/osd/osd_types.h | 5 +++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index f909c9e9b47..dbdea1f22ab 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -4682,25 +4682,31 @@ void OSDSuperblock::generate_test_instances(list& 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& 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) diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index f0c5db17002..2489d02ce41 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -4291,6 +4291,7 @@ struct SnapSet { vector clones; // ascending map > clone_overlap; // overlap w/ next newest map clone_size; + map> 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); -- 2.39.5