From: Jason Dillaman Date: Fri, 8 Jul 2016 13:14:58 +0000 (-0400) Subject: librbd: record original snap name in snap rename journal event X-Git-Tag: ses5-milestone5~364^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f70b90c48d9520bbb4bb29058375e8205cf63771;p=ceph.git librbd: record original snap name in snap rename journal event Remote peers need a key to map snapshot ids between clusters. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/journal/Types.cc b/src/librbd/journal/Types.cc index 91a9b678e8f9..cb0b5db54b21 100644 --- a/src/librbd/journal/Types.cc +++ b/src/librbd/journal/Types.cc @@ -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 &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"))); diff --git a/src/librbd/journal/Types.h b/src/librbd/journal/Types.h index a6b9613353f0..b4630af0edf8 100644 --- a/src/librbd/journal/Types.h +++ b/src/librbd/journal/Types.h @@ -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; diff --git a/src/librbd/operation/SnapshotRenameRequest.cc b/src/librbd/operation/SnapshotRenameRequest.cc index 209a46c80bf8..c7148c8961af 100644 --- a/src/librbd/operation/SnapshotRenameRequest.cc +++ b/src/librbd/operation/SnapshotRenameRequest.cc @@ -37,6 +37,21 @@ SnapshotRenameRequest::SnapshotRenameRequest(I &image_ctx, : Request(image_ctx, on_finish), m_snap_id(snap_id), m_snap_name(snap_name) { } +template +journal::Event SnapshotRenameRequest::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 void SnapshotRenameRequest::send_op() { send_rename_snap(); diff --git a/src/librbd/operation/SnapshotRenameRequest.h b/src/librbd/operation/SnapshotRenameRequest.h index e500ec07bc3e..0b512ecb5758 100644 --- a/src/librbd/operation/SnapshotRenameRequest.h +++ b/src/librbd/operation/SnapshotRenameRequest.h @@ -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(); diff --git a/src/test/librbd/journal/test_Replay.cc b/src/test/librbd/journal/test_Replay.cc index b0acb69c0c52..87b7d08c6134 100644 --- a/src/test/librbd/journal/test_Replay.cc +++ b/src/test/librbd/journal/test_Replay.cc @@ -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); diff --git a/src/test/librbd/journal/test_mock_Replay.cc b/src/test/librbd/journal/test_mock_Replay.cc index 48c81b1d738d..b6f439523091 100644 --- a/src/test/librbd/journal/test_mock_Replay.cc +++ b/src/test/librbd/journal/test_mock_Replay.cc @@ -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());