From: Mykola Golub Date: Mon, 7 Dec 2020 10:40:40 +0000 (+0000) Subject: cls/rbd: add group_spec and group_snap_id to mirror snapshot X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=06f36d0decb29d816ce4507183e18428e12ac92b;p=ceph-ci.git cls/rbd: add group_spec and group_snap_id to mirror snapshot which are going to be used when creating a group mirror snapshot. Signed-off-by: Mykola Golub Signed-off-by: Prasanna Kumar Kalever --- diff --git a/src/cls/rbd/cls_rbd_types.cc b/src/cls/rbd/cls_rbd_types.cc index 4d98fe7821f..a3e18059673 100644 --- a/src/cls/rbd/cls_rbd_types.cc +++ b/src/cls/rbd/cls_rbd_types.cc @@ -1055,8 +1055,8 @@ void GroupSpec::decode(bufferlist::const_iterator &it) { } void GroupSpec::dump(Formatter *f) const { - f->dump_string("group_id", group_id); f->dump_int("pool_id", pool_id); + f->dump_string("group_id", group_id); } bool GroupSpec::is_valid() const { @@ -1080,7 +1080,8 @@ void GroupImageSnapshotNamespace::encode(bufferlist& bl) const { encode(group_snapshot_id, bl); } -void GroupImageSnapshotNamespace::decode(bufferlist::const_iterator& it) { +void GroupImageSnapshotNamespace::decode(uint8_t version, + bufferlist::const_iterator& it) { using ceph::decode; decode(group_pool, it); decode(group_id, it); @@ -1099,7 +1100,8 @@ void TrashSnapshotNamespace::encode(bufferlist& bl) const { encode(static_cast(original_snapshot_namespace_type), bl); } -void TrashSnapshotNamespace::decode(bufferlist::const_iterator& it) { +void TrashSnapshotNamespace::decode(uint8_t version, + bufferlist::const_iterator& it) { using ceph::decode; decode(original_name, it); uint32_t snap_type; @@ -1123,9 +1125,12 @@ void MirrorSnapshotNamespace::encode(bufferlist& bl) const { encode(primary_snap_id, bl); encode(last_copied_object_number, bl); encode(snap_seqs, bl); + encode(group_spec, bl); + encode(group_snap_id, bl); } -void MirrorSnapshotNamespace::decode(bufferlist::const_iterator& it) { +void MirrorSnapshotNamespace::decode(uint8_t version, + bufferlist::const_iterator& it) { using ceph::decode; decode(state, it); decode(complete, it); @@ -1134,6 +1139,10 @@ void MirrorSnapshotNamespace::decode(bufferlist::const_iterator& it) { decode(primary_snap_id, it); decode(last_copied_object_number, it); decode(snap_seqs, it); + if (version >= 2) { + decode(group_spec, it); + decode(group_snap_id, it); + } } void MirrorSnapshotNamespace::dump(Formatter *f) const { @@ -1152,6 +1161,12 @@ void MirrorSnapshotNamespace::dump(Formatter *f) const { f->dump_unsigned("last_copied_object_number", last_copied_object_number); f->dump_stream("snap_seqs") << snap_seqs; } + if (group_spec.is_valid()) { + f->open_object_section("group_spec"); + group_spec.dump(f); + f->close_section(); + f->dump_string("group_snap_id", group_snap_id); + } } class EncodeSnapshotNamespaceVisitor { @@ -1172,15 +1187,17 @@ private: class DecodeSnapshotNamespaceVisitor { public: - DecodeSnapshotNamespaceVisitor(bufferlist::const_iterator &iter) - : m_iter(iter) { + DecodeSnapshotNamespaceVisitor(uint8_t version, + bufferlist::const_iterator &iter) + : m_version(version), m_iter(iter) { } template inline void operator()(T& t) const { - t.decode(m_iter); + t.decode(m_version, m_iter); } private: + uint8_t m_version; bufferlist::const_iterator &m_iter; }; @@ -1267,14 +1284,14 @@ void SnapshotInfo::generate_test_instances(std::list &o) { } void SnapshotNamespace::encode(bufferlist& bl) const { - ENCODE_START(1, 1, bl); + ENCODE_START(2, 1, bl); visit(EncodeSnapshotNamespaceVisitor(bl)); ENCODE_FINISH(bl); } void SnapshotNamespace::decode(bufferlist::const_iterator &p) { - DECODE_START(1, p); + DECODE_START(2, p); uint32_t snap_type; decode(snap_type, p); switch (snap_type) { @@ -1294,7 +1311,7 @@ void SnapshotNamespace::decode(bufferlist::const_iterator &p) *this = UnknownSnapshotNamespace(); break; } - visit(DecodeSnapshotNamespaceVisitor(p)); + visit(DecodeSnapshotNamespaceVisitor(struct_v, p)); DECODE_FINISH(p); } @@ -1385,6 +1402,11 @@ std::ostream& operator<<(std::ostream& os, const MirrorSnapshotNamespace& ns) { << "last_copied_object_number=" << ns.last_copied_object_number << ", " << "snap_seqs=" << ns.snap_seqs; } + if (ns.group_spec.is_valid()) { + os << ", " + << "group_spec=" << ns.group_spec << ", " + << "group_snap_id=" << ns.group_snap_id; + } os << "]"; return os; } diff --git a/src/cls/rbd/cls_rbd_types.h b/src/cls/rbd/cls_rbd_types.h index 94b4e7b22aa..ddb65756e19 100644 --- a/src/cls/rbd/cls_rbd_types.h +++ b/src/cls/rbd/cls_rbd_types.h @@ -590,10 +590,27 @@ struct GroupSpec { bool is_valid() const; static void generate_test_instances(std::list &o); + + inline bool operator==(const GroupSpec& rhs) const { + return pool_id == rhs.pool_id && group_id == rhs.group_id; + } + + inline bool operator!=(const GroupSpec& rhs) const { + return !(*this == rhs); + } + + inline bool operator<(const GroupSpec& rhs) const { + if (pool_id != rhs.pool_id) { + return pool_id < rhs.pool_id; + } + return group_id < rhs.group_id; + } }; WRITE_CLASS_ENCODER(GroupSpec); +std::ostream& operator<<(std::ostream& os, const GroupSpec& group_spec); + enum SnapshotNamespaceType { SNAPSHOT_NAMESPACE_TYPE_USER = 0, SNAPSHOT_NAMESPACE_TYPE_GROUP = 1, @@ -608,7 +625,7 @@ struct UserSnapshotNamespace { UserSnapshotNamespace() {} void encode(ceph::buffer::list& bl) const {} - void decode(ceph::buffer::list::const_iterator& it) {} + void decode(uint8_t version, ceph::buffer::list::const_iterator& it) {} void dump(ceph::Formatter *f) const {} @@ -642,7 +659,7 @@ struct GroupImageSnapshotNamespace { std::string group_snapshot_id; void encode(ceph::buffer::list& bl) const; - void decode(ceph::buffer::list::const_iterator& it); + void decode(uint8_t version, ceph::buffer::list::const_iterator& it); void dump(ceph::Formatter *f) const; @@ -682,7 +699,7 @@ struct TrashSnapshotNamespace { original_snapshot_namespace_type(original_snapshot_namespace_type) {} void encode(ceph::buffer::list& bl) const; - void decode(ceph::buffer::list::const_iterator& it); + void decode(uint8_t version, ceph::buffer::list::const_iterator& it); void dump(ceph::Formatter *f) const; inline bool operator==(const TrashSnapshotNamespace& usn) const { @@ -733,6 +750,8 @@ struct MirrorSnapshotNamespace { snapid_t primary_snap_id = CEPH_NOSNAP; snapid_t clean_since_snap_id; }; + GroupSpec group_spec; + std::string group_snap_id; uint64_t last_copied_object_number = 0; SnapSeqs snap_seqs; @@ -782,7 +801,7 @@ struct MirrorSnapshotNamespace { } void encode(ceph::buffer::list& bl) const; - void decode(ceph::buffer::list::const_iterator& it); + void decode(uint8_t version, ceph::buffer::list::const_iterator& it); void dump(ceph::Formatter *f) const; @@ -792,6 +811,8 @@ struct MirrorSnapshotNamespace { mirror_peer_uuids == rhs.mirror_peer_uuids && primary_mirror_uuid == rhs.primary_mirror_uuid && primary_snap_id == rhs.primary_snap_id && + group_spec == rhs.group_spec && + group_snap_id == rhs.group_snap_id && last_copied_object_number == rhs.last_copied_object_number && snap_seqs == rhs.snap_seqs; } @@ -811,6 +832,10 @@ struct MirrorSnapshotNamespace { return primary_mirror_uuid < rhs.primary_mirror_uuid; } else if (primary_snap_id != rhs.primary_snap_id) { return primary_snap_id < rhs.primary_snap_id; + } else if (group_spec != rhs.group_spec) { + return group_spec < rhs.group_spec; + } else if (group_snap_id != rhs.group_snap_id) { + return group_snap_id < rhs.group_snap_id; } else if (last_copied_object_number != rhs.last_copied_object_number) { return last_copied_object_number < rhs.last_copied_object_number; } else { @@ -826,7 +851,7 @@ struct UnknownSnapshotNamespace { UnknownSnapshotNamespace() {} void encode(ceph::buffer::list& bl) const {} - void decode(ceph::buffer::list::const_iterator& it) {} + void decode(uint8_t version, ceph::buffer::list::const_iterator& it) {} void dump(ceph::Formatter *f) const {} inline bool operator==(const UnknownSnapshotNamespace& gsn) const {