]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
cls/rbd: add group_spec and group_snap_id to mirror snapshot
authorMykola Golub <mgolub@suse.com>
Mon, 7 Dec 2020 10:40:40 +0000 (10:40 +0000)
committerIlya Dryomov <idryomov@gmail.com>
Sun, 28 Sep 2025 18:24:58 +0000 (20:24 +0200)
which are going to be used when creating a group mirror snapshot.

Signed-off-by: Mykola Golub <mgolub@suse.com>
Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
src/cls/rbd/cls_rbd_types.cc
src/cls/rbd/cls_rbd_types.h

index 4d98fe7821f197339a32e866ae05e988d57a974b..a3e1805967337bed4118629e8ac8d5430f443b21 100644 (file)
@@ -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<uint32_t>(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 <typename T>
   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<SnapshotInfo*> &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;
 }
index 94b4e7b22aa8eb07d89ca51b4b809850460bf745..ddb65756e19af373a202a641982b0d5f451bc8a3 100644 (file)
@@ -590,10 +590,27 @@ struct GroupSpec {
   bool is_valid() const;
 
   static void generate_test_instances(std::list<GroupSpec *> &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 {