]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: record original snap name in snap rename journal event
authorJason Dillaman <dillaman@redhat.com>
Fri, 8 Jul 2016 13:14:58 +0000 (09:14 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 19 Jul 2016 13:28:00 +0000 (09:28 -0400)
Remote peers need a key to map snapshot ids between clusters.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/journal/Types.cc
src/librbd/journal/Types.h
src/librbd/operation/SnapshotRenameRequest.cc
src/librbd/operation/SnapshotRenameRequest.h
src/test/librbd/journal/test_Replay.cc
src/test/librbd/journal/test_mock_Replay.cc

index 91a9b678e8f932c7eb550c550464eaacd79d3d9a..cb0b5db54b2136bdd6f9daa54dfe5ecdedc77e76 100644 (file)
@@ -172,16 +172,21 @@ void SnapLimitEvent::dump(Formatter *f) const {
 void SnapRenameEvent::encode(bufferlist& bl) const {
   SnapEventBase::encode(bl);
   ::encode(snap_id, bl);
+  ::encode(src_snap_name, bl);
 }
 
 void SnapRenameEvent::decode(__u8 version, bufferlist::iterator& it) {
   SnapEventBase::decode(version, it);
   ::decode(snap_id, it);
+  if (version >= 2) {
+    ::decode(src_snap_name, it);
+  }
 }
 
 void SnapRenameEvent::dump(Formatter *f) const {
   SnapEventBase::dump(f);
   f->dump_unsigned("src_snap_id", snap_id);
+  f->dump_string("src_snap_name", src_snap_name);
   f->dump_string("dest_snap_name", snap_name);
 }
 
@@ -239,7 +244,7 @@ EventType EventEntry::get_event_type() const {
 }
 
 void EventEntry::encode(bufferlist& bl) const {
-  ENCODE_START(1, 1, bl);
+  ENCODE_START(2, 1, bl);
   boost::apply_visitor(EncodeVisitor(bl), event);
   ENCODE_FINISH(bl);
 }
@@ -327,7 +332,7 @@ void EventEntry::generate_test_instances(std::list<EventEntry *> &o) {
   o.push_back(new EventEntry(SnapRemoveEvent(345, "snap")));
 
   o.push_back(new EventEntry(SnapRenameEvent()));
-  o.push_back(new EventEntry(SnapRenameEvent(456, 1, "snap")));
+  o.push_back(new EventEntry(SnapRenameEvent(456, 1, "src snap", "dest snap")));
 
   o.push_back(new EventEntry(SnapProtectEvent()));
   o.push_back(new EventEntry(SnapProtectEvent(567, "snap")));
index a6b9613353f0492b70bd569fae3ba86a9a8322ca..b4630af0edf83767d9ecdbad9589a68250472899 100644 (file)
@@ -162,12 +162,15 @@ struct SnapRenameEvent : public SnapEventBase {
   static const EventType TYPE = EVENT_TYPE_SNAP_RENAME;
 
   uint64_t snap_id;
+  std::string src_snap_name;
 
   SnapRenameEvent() : snap_id(CEPH_NOSNAP) {
   }
   SnapRenameEvent(uint64_t op_tid, uint64_t src_snap_id,
+                  const std::string &src_snap_name,
                   const std::string &dest_snap_name)
-    : SnapEventBase(op_tid, dest_snap_name), snap_id(src_snap_id) {
+    : SnapEventBase(op_tid, dest_snap_name), snap_id(src_snap_id),
+      src_snap_name(src_snap_name) {
   }
 
   void encode(bufferlist& bl) const;
index 209a46c80bf8dddcc692a1f4aeb859bfa31cb307..c7148c8961af0a5ce9807593f48378fd2bcab5ae 100644 (file)
@@ -37,6 +37,21 @@ SnapshotRenameRequest<I>::SnapshotRenameRequest(I &image_ctx,
   : Request<I>(image_ctx, on_finish), m_snap_id(snap_id), m_snap_name(snap_name) {
 }
 
+template <typename I>
+journal::Event SnapshotRenameRequest<I>::create_event(uint64_t op_tid) const {
+  I &image_ctx = this->m_image_ctx;
+  assert(image_ctx.snap_lock.is_locked());
+
+  std::string src_snap_name;
+  auto snap_info_it = image_ctx.snap_info.find(m_snap_id);
+  if (snap_info_it != image_ctx.snap_info.end()) {
+    src_snap_name = snap_info_it->second.name;
+  }
+
+  return journal::SnapRenameEvent(op_tid, m_snap_id, src_snap_name,
+                                  m_snap_name);
+}
+
 template <typename I>
 void SnapshotRenameRequest<I>::send_op() {
   send_rename_snap();
index e500ec07bc3ed5cdf96783ae771f5fd897e646cf..0b512ecb57585d087764d5a4b32d3092cc43aa50 100644 (file)
@@ -41,9 +41,7 @@ public:
   SnapshotRenameRequest(ImageCtxT &image_ctx, Context *on_finish,
                         uint64_t snap_id, const std::string &snap_name);
 
-  virtual journal::Event create_event(uint64_t op_tid) const {
-    return journal::SnapRenameEvent(op_tid, m_snap_id, m_snap_name);
-  }
+  virtual journal::Event create_event(uint64_t op_tid) const;
 
 protected:
   virtual void send_op();
index b0acb69c0c5288fd7a47d6484fdb095ccb9b86ec..87b7d08c6134fce7d5edf65da3311f2a61b51fa6 100644 (file)
@@ -452,7 +452,8 @@ TEST_F(TestJournalReplay, SnapRename) {
   get_journal_commit_position(ictx, &initial_tag, &initial_entry);
 
   // inject snapshot ops into journal
-  inject_into_journal(ictx, librbd::journal::SnapRenameEvent(1, snap_id, "snap2"));
+  inject_into_journal(ictx, librbd::journal::SnapRenameEvent(1, snap_id, "snap",
+                                                             "snap2"));
   inject_into_journal(ictx, librbd::journal::OpFinishEvent(1, 0));
   close_image(ictx);
 
index 48c81b1d738d08ab6170b8db8f079f035515e35c..b6f439523091f5d9dd91535067e97ae4694960bb 100644 (file)
@@ -829,7 +829,7 @@ TEST_F(TestMockJournalReplay, SnapRenameEvent) {
   C_SaferCond on_start_ready;
   C_SaferCond on_start_safe;
   when_process(mock_journal_replay,
-               EventEntry{SnapRenameEvent(123, 234, "snap")},
+               EventEntry{SnapRenameEvent(123, 234, "snap1", "snap")},
                &on_start_ready, &on_start_safe);
   ASSERT_EQ(0, on_start_ready.wait());
 
@@ -862,7 +862,7 @@ TEST_F(TestMockJournalReplay, SnapRenameEventExists) {
   C_SaferCond on_start_ready;
   C_SaferCond on_start_safe;
   when_process(mock_journal_replay,
-               EventEntry{SnapRenameEvent(123, 234, "snap")},
+               EventEntry{SnapRenameEvent(123, 234, "snap1", "snap")},
                &on_start_ready, &on_start_safe);
   ASSERT_EQ(0, on_start_ready.wait());