]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: update journal client and tag data structures
authorJason Dillaman <dillaman@redhat.com>
Thu, 25 Feb 2016 19:43:37 +0000 (14:43 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 8 Mar 2016 14:03:43 +0000 (09:03 -0500)
The mirror peer now holds remote's image id as well as a collection
of bootstrap sync points.  The tag now contains uuids to map back
to the owning pool.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/Journal.cc
src/librbd/journal/Types.cc
src/librbd/journal/Types.h

index c07ba02b9f7d1d239cd854d044ce9aca2fdf2310..af82c6cf5fb301accec5086b15f6d0a8e18f8d07 100644 (file)
@@ -119,16 +119,9 @@ int Journal<I>::create(librados::IoCtx &io_ctx, const std::string &image_id,
     return r;
   }
 
-  std::string cluster_id;
-  r = rados.cluster_fsid(&cluster_id);
-  if (r < 0) {
-    lderr(cct) << "failed to retrieve cluster id: " << cpp_strerror(r) << dendl;
-    return r;
-  }
-
   // create tag class for this image's journal events
   bufferlist tag_data;
-  ::encode(journal::TagData{cluster_id, pool_id, image_id}, tag_data);
+  ::encode(journal::TagData(), tag_data);
 
   C_SaferCond tag_ctx;
   cls::journal::Tag tag;
index f082e0268c87fc958aaeb089bb2e2b92ccec0b3a..2be074d267a28533f4de0820ee1491be073939fc 100644 (file)
@@ -333,25 +333,49 @@ void ImageClientMeta::dump(Formatter *f) const {
   f->dump_unsigned("tag_class", tag_class);
 }
 
+void MirrorPeerSyncPoint::encode(bufferlist& bl) const {
+  ::encode(snap_name, bl);
+  ::encode(object_number, bl);
+}
+
+void MirrorPeerSyncPoint::decode(__u8 version, bufferlist::iterator& it) {
+  ::decode(snap_name, it);
+  ::decode(object_number, it);
+}
+
+void MirrorPeerSyncPoint::dump(Formatter *f) const {
+  f->dump_string("snap_name", snap_name);
+  if (object_number) {
+    f->dump_unsigned("object_number", *object_number);
+  }
+}
+
 void MirrorPeerClientMeta::encode(bufferlist& bl) const {
-  ::encode(cluster_id, bl);
-  ::encode(pool_id, bl);
   ::encode(image_id, bl);
-  ::encode(snap_name, bl);
+  ::encode(static_cast<uint32_t>(sync_points.size()), bl);
+  for (auto &sync_point : sync_points) {
+    sync_point.encode(bl);
+  }
 }
 
 void MirrorPeerClientMeta::decode(__u8 version, bufferlist::iterator& it) {
-  ::decode(cluster_id, it);
-  ::decode(pool_id, it);
   ::decode(image_id, it);
-  ::decode(snap_name, it);
+
+  uint32_t sync_point_count;
+  ::decode(sync_point_count, it);
+  sync_points.resize(sync_point_count);
+  for (auto &sync_point : sync_points) {
+    sync_point.decode(version, it);
+  }
 }
 
 void MirrorPeerClientMeta::dump(Formatter *f) const {
-  f->dump_string("cluster_id", cluster_id.c_str());
-  f->dump_int("pool_id", pool_id);
-  f->dump_string("image_id", image_id.c_str());
-  f->dump_string("snap_name", snap_name.c_str());
+  f->dump_string("image_id", image_id);
+  f->open_array_section("sync_points");
+  for (auto &sync_point : sync_points) {
+    sync_point.dump(f);
+  }
+  f->close_section();
 }
 
 void CliClientMeta::encode(bufferlist& bl) const {
@@ -417,39 +441,41 @@ void ClientData::generate_test_instances(std::list<ClientData *> &o) {
   o.push_back(new ClientData(ImageClientMeta()));
   o.push_back(new ClientData(ImageClientMeta(123)));
   o.push_back(new ClientData(MirrorPeerClientMeta()));
-  o.push_back(new ClientData(MirrorPeerClientMeta("cluster_id", 123, "image_id")));
+  o.push_back(new ClientData(MirrorPeerClientMeta("image_id", {{"snap 1", 123}})));
   o.push_back(new ClientData(CliClientMeta()));
 }
 
 // Journal Tag
 
 void TagData::encode(bufferlist& bl) const {
-  ::encode(cluster_id, bl);
-  ::encode(pool_id, bl);
-  ::encode(image_id, bl);
+  ::encode(mirror_uuid, bl);
+  ::encode(predecessor_mirror_uuid, bl);
+  ::encode(predecessor_commit_valid, bl);
   ::encode(predecessor_tag_tid, bl);
   ::encode(predecessor_entry_tid, bl);
 }
 
 void TagData::decode(bufferlist::iterator& it) {
-  ::decode(cluster_id, it);
-  ::decode(pool_id, it);
-  ::decode(image_id, it);
+  ::decode(mirror_uuid, it);
+  ::decode(predecessor_mirror_uuid, it);
+  ::decode(predecessor_commit_valid, it);
   ::decode(predecessor_tag_tid, it);
   ::decode(predecessor_entry_tid, it);
 }
 
 void TagData::dump(Formatter *f) const {
-  f->dump_string("cluster_id", cluster_id.c_str());
-  f->dump_int("pool_id", pool_id);
-  f->dump_string("image_id", image_id.c_str());
+  f->dump_string("mirror_uuid", mirror_uuid);
+  f->dump_string("predecessor_mirror_uuid", predecessor_mirror_uuid);
+  f->dump_string("predecessor_commit_valid",
+                 predecessor_commit_valid ? "true" : "false");
   f->dump_unsigned("predecessor_tag_tid", predecessor_tag_tid);
   f->dump_unsigned("predecessor_entry_tid", predecessor_entry_tid);
 }
 
 void TagData::generate_test_instances(std::list<TagData *> &o) {
   o.push_back(new TagData());
-  o.push_back(new TagData("cluster_id", 123, "image_id"));
+  o.push_back(new TagData("mirror-uuid"));
+  o.push_back(new TagData("mirror-uuid", "remote-mirror-uuid", true, 123, 234));
 }
 
 } // namespace journal
index 5e3a5c0e161471f7fcf33f51aebf29920dd3620c..e355060065b89bfa7b2a6527c17b9661607beda7 100644 (file)
@@ -9,6 +9,9 @@
 #include "include/encoding.h"
 #include "include/types.h"
 #include <iosfwd>
+#include <list>
+#include <boost/none.hpp>
+#include <boost/optional.hpp>
 #include <boost/variant.hpp>
 
 namespace ceph {
@@ -316,21 +319,37 @@ struct ImageClientMeta {
   void dump(Formatter *f) const;
 };
 
+struct MirrorPeerSyncPoint {
+  typedef boost::optional<uint64_t> ObjectNumber;
+
+  std::string snap_name;
+  ObjectNumber object_number;
+
+  MirrorPeerSyncPoint() : object_number(boost::none) {
+  }
+  MirrorPeerSyncPoint(const std::string &snap_name,
+                      const ObjectNumber &object_number)
+    : snap_name(snap_name), object_number(object_number) {
+  }
+
+  void encode(bufferlist& bl) const;
+  void decode(__u8 version, bufferlist::iterator& it);
+  void dump(Formatter *f) const;
+};
+
 struct MirrorPeerClientMeta {
+  typedef std::list<MirrorPeerSyncPoint> SyncPoints;
+
   static const ClientMetaType TYPE = MIRROR_PEER_CLIENT_META_TYPE;
 
-  std::string cluster_id;
-  int64_t pool_id = 0;
   std::string image_id;
-  std::string snap_name;
+  SyncPoints sync_points;
 
   MirrorPeerClientMeta() {
   }
-  MirrorPeerClientMeta(const std::string &cluster_id, int64_t pool_id,
-                       const std::string &image_id,
-                       const std::string &snap_name = "")
-    : cluster_id(cluster_id), pool_id(pool_id), image_id(image_id),
-      snap_name(snap_name) {
+  MirrorPeerClientMeta(const std::string &image_id,
+                       const SyncPoints &sync_points = SyncPoints())
+    : image_id(image_id), sync_points(sync_points) {
   }
 
   void encode(bufferlist& bl) const;
@@ -380,19 +399,27 @@ struct ClientData {
 
 struct TagData {
   // owner of the tag (exclusive lock epoch)
-  std::string cluster_id;
-  int64_t pool_id = 0;
-  std::string image_id;
+  std::string mirror_uuid; // empty if local
 
   // mapping to last committed record of previous tag
+  std::string predecessor_mirror_uuid; // empty if local
+  bool predecessor_commit_valid = false;
   uint64_t predecessor_tag_tid = 0;
   uint64_t predecessor_entry_tid = 0;
 
   TagData() {
   }
-  TagData(const std::string &cluster_id, int64_t pool_id,
-          const std::string &image_id)
-    : cluster_id(cluster_id), pool_id(pool_id), image_id(image_id) {
+  TagData(const std::string &mirror_uuid) : mirror_uuid(mirror_uuid) {
+  }
+  TagData(const std::string &mirror_uuid,
+          const std::string &predecessor_mirror_uuid,
+          bool predecessor_commit_valid,
+          uint64_t predecessor_tag_tid, uint64_t predecessor_entry_tid)
+    : mirror_uuid(mirror_uuid),
+      predecessor_mirror_uuid(predecessor_mirror_uuid),
+      predecessor_commit_valid(predecessor_commit_valid),
+      predecessor_tag_tid(predecessor_tag_tid),
+      predecessor_entry_tid(predecessor_entry_tid) {
   }
 
   void encode(bufferlist& bl) const;