From: Jason Dillaman Date: Fri, 5 Feb 2016 03:54:10 +0000 (-0500) Subject: librbd: initial version of journal client and tag metadata X-Git-Tag: v10.0.4~28^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8443e507108c0d66fba182c29fc1ca30cdd9636c;p=ceph.git librbd: initial version of journal client and tag metadata Signed-off-by: Jason Dillaman --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 619519c2c59..457e71ba6c8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1030,8 +1030,8 @@ if(${WITH_RBD}) librbd/image/RefreshParentRequest.cc librbd/image/RefreshRequest.cc librbd/image/SetSnapRequest.cc - librbd/journal/Entries.cc librbd/journal/Replay.cc + librbd/journal/Types.cc librbd/object_map/InvalidateRequest.cc librbd/object_map/LockRequest.cc librbd/object_map/Request.cc diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc index cba7dde1219..fc77ea73f2e 100644 --- a/src/librbd/AioImageRequest.cc +++ b/src/librbd/AioImageRequest.cc @@ -10,7 +10,7 @@ #include "librbd/ImageWatcher.h" #include "librbd/internal.h" #include "librbd/Journal.h" -#include "librbd/journal/Entries.h" +#include "librbd/journal/Types.h" #include "include/rados/librados.hpp" #include "osdc/Striper.h" diff --git a/src/librbd/Journal.cc b/src/librbd/Journal.cc index 0b0e453272c..8454a390b5b 100644 --- a/src/librbd/Journal.cc +++ b/src/librbd/Journal.cc @@ -7,8 +7,8 @@ #include "librbd/AioObjectRequest.h" #include "librbd/ExclusiveLock.h" #include "librbd/ImageCtx.h" -#include "librbd/journal/Entries.h" #include "librbd/journal/Replay.h" +#include "librbd/journal/Types.h" #include "librbd/Utils.h" #include "journal/Journaler.h" #include "journal/ReplayEntry.h" diff --git a/src/librbd/Makefile.am b/src/librbd/Makefile.am index 775d7027551..7248f82cfee 100644 --- a/src/librbd/Makefile.am +++ b/src/librbd/Makefile.am @@ -1,5 +1,5 @@ librbd_types_la_SOURCES = \ - librbd/journal/Entries.cc \ + librbd/journal/Types.cc \ librbd/WatchNotifyTypes.cc noinst_LTLIBRARIES += librbd_types.la @@ -115,7 +115,7 @@ noinst_HEADERS += \ librbd/image/RefreshRequest.h \ librbd/image/SetSnapRequest.h \ librbd/journal/Replay.h \ - librbd/journal/Entries.h \ + librbd/journal/Types.h \ librbd/object_map/InvalidateRequest.h \ librbd/object_map/LockRequest.h \ librbd/object_map/Request.h \ diff --git a/src/librbd/journal/Entries.cc b/src/librbd/journal/Entries.cc deleted file mode 100644 index 5ed5cf3d071..00000000000 --- a/src/librbd/journal/Entries.cc +++ /dev/null @@ -1,371 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#include "librbd/journal/Entries.h" -#include "include/assert.h" -#include "include/stringify.h" -#include "common/Formatter.h" - -namespace librbd { -namespace journal { - -namespace { - -class GetEventTypeVistor : public boost::static_visitor { -public: - template - inline EventType operator()(const Event &event) const { - return Event::EVENT_TYPE; - } -}; - -class EncodeEventVisitor : public boost::static_visitor { -public: - explicit EncodeEventVisitor(bufferlist &bl) : m_bl(bl) { - } - - template - inline void operator()(const Event &event) const { - ::encode(static_cast(Event::EVENT_TYPE), m_bl); - event.encode(m_bl); - } -private: - bufferlist &m_bl; -}; - -class DecodeEventVisitor : public boost::static_visitor { -public: - DecodeEventVisitor(__u8 version, bufferlist::iterator &iter) - : m_version(version), m_iter(iter) { - } - - template - inline void operator()(Event &event) const { - event.decode(m_version, m_iter); - } -private: - __u8 m_version; - bufferlist::iterator &m_iter; -}; - -class DumpEventVisitor : public boost::static_visitor { -public: - explicit DumpEventVisitor(Formatter *formatter) : m_formatter(formatter) {} - - template - inline void operator()(const Event &event) const { - EventType event_type = Event::EVENT_TYPE; - m_formatter->dump_string("event_type", stringify(event_type)); - event.dump(m_formatter); - } -private: - ceph::Formatter *m_formatter; -}; - -} // anonymous namespace - -void AioDiscardEvent::encode(bufferlist& bl) const { - ::encode(offset, bl); - ::encode(length, bl); -} - -void AioDiscardEvent::decode(__u8 version, bufferlist::iterator& it) { - ::decode(offset, it); - ::decode(length, it); -} - -void AioDiscardEvent::dump(Formatter *f) const { - f->dump_unsigned("offset", offset); - f->dump_unsigned("length", length); -} - -void AioWriteEvent::encode(bufferlist& bl) const { - ::encode(offset, bl); - ::encode(length, bl); - ::encode(data, bl); -} - -void AioWriteEvent::decode(__u8 version, bufferlist::iterator& it) { - ::decode(offset, it); - ::decode(length, it); - ::decode(data, it); -} - -void AioWriteEvent::dump(Formatter *f) const { - f->dump_unsigned("offset", offset); - f->dump_unsigned("length", length); -} - -void AioFlushEvent::encode(bufferlist& bl) const { -} - -void AioFlushEvent::decode(__u8 version, bufferlist::iterator& it) { -} - -void AioFlushEvent::dump(Formatter *f) const { -} - -void OpEventBase::encode(bufferlist& bl) const { - ::encode(op_tid, bl); -} - -void OpEventBase::decode(__u8 version, bufferlist::iterator& it) { - ::decode(op_tid, it); -} - -void OpEventBase::dump(Formatter *f) const { - f->dump_unsigned("op_tid", op_tid); -} - -void OpFinishEvent::encode(bufferlist& bl) const { - OpEventBase::encode(bl); - ::encode(op_tid, bl); - ::encode(r, bl); -} - -void OpFinishEvent::decode(__u8 version, bufferlist::iterator& it) { - OpEventBase::decode(version, it); - ::decode(op_tid, it); - ::decode(r, it); -} - -void OpFinishEvent::dump(Formatter *f) const { - OpEventBase::dump(f); - f->dump_unsigned("op_tid", op_tid); - f->dump_int("result", r); -} - -void SnapEventBase::encode(bufferlist& bl) const { - OpEventBase::encode(bl); - ::encode(snap_name, bl); -} - -void SnapEventBase::decode(__u8 version, bufferlist::iterator& it) { - OpEventBase::decode(version, it); - ::decode(snap_name, it); -} - -void SnapEventBase::dump(Formatter *f) const { - OpEventBase::dump(f); - f->dump_string("snap_name", snap_name); -} - -void SnapRenameEvent::encode(bufferlist& bl) const { - SnapEventBase::encode(bl); - ::encode(snap_id, bl); -} - -void SnapRenameEvent::decode(__u8 version, bufferlist::iterator& it) { - SnapEventBase::decode(version, it); - ::decode(snap_id, it); -} - -void SnapRenameEvent::dump(Formatter *f) const { - SnapEventBase::dump(f); - f->dump_unsigned("src_snap_id", snap_id); - f->dump_string("dest_snap_name", snap_name); -} - -void RenameEvent::encode(bufferlist& bl) const { - OpEventBase::encode(bl); - ::encode(image_name, bl); -} - -void RenameEvent::decode(__u8 version, bufferlist::iterator& it) { - OpEventBase::decode(version, it); - ::decode(image_name, it); -} - -void RenameEvent::dump(Formatter *f) const { - OpEventBase::dump(f); - f->dump_string("image_name", image_name); -} - -void ResizeEvent::encode(bufferlist& bl) const { - OpEventBase::encode(bl); - ::encode(size, bl); -} - -void ResizeEvent::decode(__u8 version, bufferlist::iterator& it) { - OpEventBase::decode(version, it); - ::decode(size, it); -} - -void ResizeEvent::dump(Formatter *f) const { - OpEventBase::dump(f); - f->dump_unsigned("size", size); -} - -void UnknownEvent::encode(bufferlist& bl) const { - assert(false); -} - -void UnknownEvent::decode(__u8 version, bufferlist::iterator& it) { -} - -void UnknownEvent::dump(Formatter *f) const { -} - -EventType EventEntry::get_event_type() const { - return boost::apply_visitor(GetEventTypeVistor(), event); -} - -void EventEntry::encode(bufferlist& bl) const { - ENCODE_START(1, 1, bl); - boost::apply_visitor(EncodeEventVisitor(bl), event); - ENCODE_FINISH(bl); -} - -void EventEntry::decode(bufferlist::iterator& it) { - DECODE_START(1, it); - - uint32_t event_type; - ::decode(event_type, it); - - // select the correct payload variant based upon the encoded op - switch (event_type) { - case EVENT_TYPE_AIO_DISCARD: - event = AioDiscardEvent(); - break; - case EVENT_TYPE_AIO_WRITE: - event = AioWriteEvent(); - break; - case EVENT_TYPE_AIO_FLUSH: - event = AioFlushEvent(); - break; - case EVENT_TYPE_OP_FINISH: - event = OpFinishEvent(); - break; - case EVENT_TYPE_SNAP_CREATE: - event = SnapCreateEvent(); - break; - case EVENT_TYPE_SNAP_REMOVE: - event = SnapRemoveEvent(); - break; - case EVENT_TYPE_SNAP_RENAME: - event = SnapRenameEvent(); - break; - case EVENT_TYPE_SNAP_PROTECT: - event = SnapProtectEvent(); - break; - case EVENT_TYPE_SNAP_UNPROTECT: - event = SnapUnprotectEvent(); - break; - case EVENT_TYPE_SNAP_ROLLBACK: - event = SnapRollbackEvent(); - break; - case EVENT_TYPE_RENAME: - event = RenameEvent(); - break; - case EVENT_TYPE_RESIZE: - event = ResizeEvent(); - break; - case EVENT_TYPE_FLATTEN: - event = FlattenEvent(); - break; - default: - event = UnknownEvent(); - break; - } - - boost::apply_visitor(DecodeEventVisitor(struct_v, it), event); - DECODE_FINISH(it); -} - -void EventEntry::dump(Formatter *f) const { - boost::apply_visitor(DumpEventVisitor(f), event); -} - -void EventEntry::generate_test_instances(std::list &o) { - o.push_back(new EventEntry(AioDiscardEvent())); - o.push_back(new EventEntry(AioDiscardEvent(123, 345))); - - bufferlist bl; - bl.append(std::string(32, '1')); - o.push_back(new EventEntry(AioWriteEvent())); - o.push_back(new EventEntry(AioWriteEvent(123, 456, bl))); - - o.push_back(new EventEntry(AioFlushEvent())); - - o.push_back(new EventEntry(OpFinishEvent(123, -1))); - - o.push_back(new EventEntry(SnapCreateEvent())); - o.push_back(new EventEntry(SnapCreateEvent(234, "snap"))); - - o.push_back(new EventEntry(SnapRemoveEvent())); - 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(SnapProtectEvent())); - o.push_back(new EventEntry(SnapProtectEvent(567, "snap"))); - - o.push_back(new EventEntry(SnapUnprotectEvent())); - o.push_back(new EventEntry(SnapUnprotectEvent(678, "snap"))); - - o.push_back(new EventEntry(SnapRollbackEvent())); - o.push_back(new EventEntry(SnapRollbackEvent(789, "snap"))); - - o.push_back(new EventEntry(RenameEvent())); - o.push_back(new EventEntry(RenameEvent(890, "image name"))); - - o.push_back(new EventEntry(ResizeEvent())); - o.push_back(new EventEntry(ResizeEvent(901, 1234))); - - o.push_back(new EventEntry(FlattenEvent(123))); -} - -} // namespace journal -} // namespace librbd - -std::ostream &operator<<(std::ostream &out, - const librbd::journal::EventType &type) { - using namespace librbd::journal; - - switch (type) { - case EVENT_TYPE_AIO_DISCARD: - out << "AioDiscard"; - break; - case EVENT_TYPE_AIO_WRITE: - out << "AioWrite"; - break; - case EVENT_TYPE_AIO_FLUSH: - out << "AioFlush"; - break; - case EVENT_TYPE_OP_FINISH: - out << "OpFinish"; - break; - case EVENT_TYPE_SNAP_CREATE: - out << "SnapCreate"; - break; - case EVENT_TYPE_SNAP_REMOVE: - out << "SnapRemove"; - break; - case EVENT_TYPE_SNAP_RENAME: - out << "SnapRename"; - break; - case EVENT_TYPE_SNAP_PROTECT: - out << "SnapProtect"; - break; - case EVENT_TYPE_SNAP_UNPROTECT: - out << "SnapUnprotect"; - break; - case EVENT_TYPE_SNAP_ROLLBACK: - out << "SnapRollback"; - break; - case EVENT_TYPE_RENAME: - out << "Rename"; - break; - case EVENT_TYPE_RESIZE: - out << "Resize"; - break; - case EVENT_TYPE_FLATTEN: - out << "Flatten"; - break; - default: - out << "Unknown (" << static_cast(type) << ")"; - break; - } - return out; -} diff --git a/src/librbd/journal/Entries.h b/src/librbd/journal/Entries.h deleted file mode 100644 index 09218be7497..00000000000 --- a/src/librbd/journal/Entries.h +++ /dev/null @@ -1,304 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#ifndef CEPH_LIBRBD_JOURNAL_ENTRIES_H -#define CEPH_LIBRBD_JOURNAL_ENTRIES_H - -#include "include/int_types.h" -#include "include/buffer.h" -#include "include/encoding.h" -#include "include/types.h" -#include -#include - -namespace ceph { -class Formatter; -} - -namespace librbd { -namespace journal { - -enum EventType { - EVENT_TYPE_AIO_DISCARD = 0, - EVENT_TYPE_AIO_WRITE = 1, - EVENT_TYPE_AIO_FLUSH = 2, - EVENT_TYPE_OP_FINISH = 3, - EVENT_TYPE_SNAP_CREATE = 4, - EVENT_TYPE_SNAP_REMOVE = 5, - EVENT_TYPE_SNAP_RENAME = 6, - EVENT_TYPE_SNAP_PROTECT = 7, - EVENT_TYPE_SNAP_UNPROTECT = 8, - EVENT_TYPE_SNAP_ROLLBACK = 9, - EVENT_TYPE_RENAME = 10, - EVENT_TYPE_RESIZE = 11, - EVENT_TYPE_FLATTEN = 12 -}; - -struct AioDiscardEvent { - static const EventType EVENT_TYPE = EVENT_TYPE_AIO_DISCARD; - - uint64_t offset; - size_t length; - - AioDiscardEvent() : offset(0), length(0) { - } - AioDiscardEvent(uint64_t _offset, size_t _length) - : offset(_offset), length(_length) { - } - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -struct AioWriteEvent { - static const EventType EVENT_TYPE = EVENT_TYPE_AIO_WRITE; - - uint64_t offset; - size_t length; - bufferlist data; - - AioWriteEvent() : offset(0), length(0) { - } - AioWriteEvent(uint64_t _offset, size_t _length, const bufferlist &_data) - : offset(_offset), length(_length), data(_data) { - } - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -struct AioFlushEvent { - static const EventType EVENT_TYPE = EVENT_TYPE_AIO_FLUSH; - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -struct OpEventBase { - uint64_t op_tid; - -protected: - OpEventBase() : op_tid(0) { - } - OpEventBase(uint64_t op_tid) : op_tid(op_tid) { - } - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -struct OpFinishEvent : public OpEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_OP_FINISH; - - int r; - - OpFinishEvent() : r(0) { - } - OpFinishEvent(uint64_t op_tid, int r) : OpEventBase(op_tid), r(r) { - } - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -struct SnapEventBase : public OpEventBase { - std::string snap_name; - -protected: - SnapEventBase() { - } - SnapEventBase(uint64_t op_tid, const std::string &_snap_name) - : OpEventBase(op_tid), snap_name(_snap_name) { - } - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -struct SnapCreateEvent : public SnapEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_SNAP_CREATE; - - SnapCreateEvent() { - } - SnapCreateEvent(uint64_t op_tid, const std::string &snap_name) - : SnapEventBase(op_tid, snap_name) { - } - - using SnapEventBase::encode; - using SnapEventBase::decode; - using SnapEventBase::dump; -}; - -struct SnapRemoveEvent : public SnapEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_SNAP_REMOVE; - - SnapRemoveEvent() { - } - SnapRemoveEvent(uint64_t op_tid, const std::string &snap_name) - : SnapEventBase(op_tid, snap_name) { - } - - using SnapEventBase::encode; - using SnapEventBase::decode; - using SnapEventBase::dump; -}; - -struct SnapRenameEvent : public SnapEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_SNAP_RENAME; - - uint64_t snap_id; - - SnapRenameEvent() : snap_id(CEPH_NOSNAP) { - } - SnapRenameEvent(uint64_t op_tid, uint64_t src_snap_id, - const std::string &dest_snap_name) - : SnapEventBase(op_tid, dest_snap_name), snap_id(src_snap_id) { - } - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -struct SnapProtectEvent : public SnapEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_SNAP_PROTECT; - - SnapProtectEvent() { - } - SnapProtectEvent(uint64_t op_tid, const std::string &snap_name) - : SnapEventBase(op_tid, snap_name) { - } - - using SnapEventBase::encode; - using SnapEventBase::decode; - using SnapEventBase::dump; -}; - -struct SnapUnprotectEvent : public SnapEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_SNAP_UNPROTECT; - - SnapUnprotectEvent() { - } - SnapUnprotectEvent(uint64_t op_tid, const std::string &snap_name) - : SnapEventBase(op_tid, snap_name) { - } - - using SnapEventBase::encode; - using SnapEventBase::decode; - using SnapEventBase::dump; -}; - -struct SnapRollbackEvent : public SnapEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_SNAP_ROLLBACK; - - SnapRollbackEvent() { - } - SnapRollbackEvent(uint64_t op_tid, const std::string &snap_name) - : SnapEventBase(op_tid, snap_name) { - } - - using SnapEventBase::encode; - using SnapEventBase::decode; - using SnapEventBase::dump; -}; - -struct RenameEvent : public OpEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_RENAME; - - std::string image_name; - - RenameEvent() { - } - RenameEvent(uint64_t op_tid, const std::string &_image_name) - : OpEventBase(op_tid), image_name(_image_name) { - } - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -struct ResizeEvent : public OpEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_RESIZE; - - uint64_t size; - - ResizeEvent() : size(0) { - } - ResizeEvent(uint64_t op_tid, uint64_t _size) - : OpEventBase(op_tid), size(_size) { - } - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -struct FlattenEvent : public OpEventBase { - static const EventType EVENT_TYPE = EVENT_TYPE_FLATTEN; - - FlattenEvent() { - } - FlattenEvent(uint64_t op_tid) : OpEventBase(op_tid) { - } - - using OpEventBase::encode; - using OpEventBase::decode; - using OpEventBase::dump; -}; - -struct UnknownEvent { - static const EventType EVENT_TYPE = static_cast(-1); - - void encode(bufferlist& bl) const; - void decode(__u8 version, bufferlist::iterator& it); - void dump(Formatter *f) const; -}; - -typedef boost::variant Event; - -struct EventEntry { - EventEntry() : event(UnknownEvent()) { - } - EventEntry(const Event &_event) : event(_event) { - } - - Event event; - - EventType get_event_type() const; - - void encode(bufferlist& bl) const; - void decode(bufferlist::iterator& it); - void dump(Formatter *f) const; - - static void generate_test_instances(std::list &o); -}; - -} // namespace journal -} // namespace librbd - -std::ostream &operator<<(std::ostream &out, - const librbd::journal::EventType &type); - -WRITE_CLASS_ENCODER(librbd::journal::EventEntry); - -#endif // CEPH_LIBRBD_JOURNAL_ENTRIES_H diff --git a/src/librbd/journal/Replay.h b/src/librbd/journal/Replay.h index 96333e363c9..e0fad8a36fc 100644 --- a/src/librbd/journal/Replay.h +++ b/src/librbd/journal/Replay.h @@ -9,7 +9,7 @@ #include "include/Context.h" #include "include/rbd/librbd.hpp" #include "common/Mutex.h" -#include "librbd/journal/Entries.h" +#include "librbd/journal/Types.h" #include #include #include diff --git a/src/librbd/journal/Types.cc b/src/librbd/journal/Types.cc new file mode 100644 index 00000000000..781f793b933 --- /dev/null +++ b/src/librbd/journal/Types.cc @@ -0,0 +1,526 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "librbd/journal/Types.h" +#include "include/assert.h" +#include "include/stringify.h" +#include "common/Formatter.h" + +namespace librbd { +namespace journal { + +namespace { + +template +class GetTypeVisitor : public boost::static_visitor { +public: + template + inline E operator()(const T&) const { + return T::TYPE; + } +}; + +class EncodeVisitor : public boost::static_visitor { +public: + explicit EncodeVisitor(bufferlist &bl) : m_bl(bl) { + } + + template + inline void operator()(const T& t) const { + ::encode(static_cast(T::TYPE), m_bl); + t.encode(m_bl); + } +private: + bufferlist &m_bl; +}; + +class DecodeVisitor : public boost::static_visitor { +public: + DecodeVisitor(__u8 version, bufferlist::iterator &iter) + : m_version(version), m_iter(iter) { + } + + template + inline void operator()(T& t) const { + t.decode(m_version, m_iter); + } +private: + __u8 m_version; + bufferlist::iterator &m_iter; +}; + +class DumpVisitor : public boost::static_visitor { +public: + explicit DumpVisitor(Formatter *formatter, const std::string &key) + : m_formatter(formatter), m_key(key) {} + + template + inline void operator()(const T& t) const { + auto type = T::TYPE; + m_formatter->dump_string(m_key.c_str(), stringify(type)); + t.dump(m_formatter); + } +private: + ceph::Formatter *m_formatter; + std::string m_key; +}; + +} // anonymous namespace + +void AioDiscardEvent::encode(bufferlist& bl) const { + ::encode(offset, bl); + ::encode(length, bl); +} + +void AioDiscardEvent::decode(__u8 version, bufferlist::iterator& it) { + ::decode(offset, it); + ::decode(length, it); +} + +void AioDiscardEvent::dump(Formatter *f) const { + f->dump_unsigned("offset", offset); + f->dump_unsigned("length", length); +} + +void AioWriteEvent::encode(bufferlist& bl) const { + ::encode(offset, bl); + ::encode(length, bl); + ::encode(data, bl); +} + +void AioWriteEvent::decode(__u8 version, bufferlist::iterator& it) { + ::decode(offset, it); + ::decode(length, it); + ::decode(data, it); +} + +void AioWriteEvent::dump(Formatter *f) const { + f->dump_unsigned("offset", offset); + f->dump_unsigned("length", length); +} + +void AioFlushEvent::encode(bufferlist& bl) const { +} + +void AioFlushEvent::decode(__u8 version, bufferlist::iterator& it) { +} + +void AioFlushEvent::dump(Formatter *f) const { +} + +void OpEventBase::encode(bufferlist& bl) const { + ::encode(op_tid, bl); +} + +void OpEventBase::decode(__u8 version, bufferlist::iterator& it) { + ::decode(op_tid, it); +} + +void OpEventBase::dump(Formatter *f) const { + f->dump_unsigned("op_tid", op_tid); +} + +void OpFinishEvent::encode(bufferlist& bl) const { + OpEventBase::encode(bl); + ::encode(op_tid, bl); + ::encode(r, bl); +} + +void OpFinishEvent::decode(__u8 version, bufferlist::iterator& it) { + OpEventBase::decode(version, it); + ::decode(op_tid, it); + ::decode(r, it); +} + +void OpFinishEvent::dump(Formatter *f) const { + OpEventBase::dump(f); + f->dump_unsigned("op_tid", op_tid); + f->dump_int("result", r); +} + +void SnapEventBase::encode(bufferlist& bl) const { + OpEventBase::encode(bl); + ::encode(snap_name, bl); +} + +void SnapEventBase::decode(__u8 version, bufferlist::iterator& it) { + OpEventBase::decode(version, it); + ::decode(snap_name, it); +} + +void SnapEventBase::dump(Formatter *f) const { + OpEventBase::dump(f); + f->dump_string("snap_name", snap_name); +} + +void SnapRenameEvent::encode(bufferlist& bl) const { + SnapEventBase::encode(bl); + ::encode(snap_id, bl); +} + +void SnapRenameEvent::decode(__u8 version, bufferlist::iterator& it) { + SnapEventBase::decode(version, it); + ::decode(snap_id, it); +} + +void SnapRenameEvent::dump(Formatter *f) const { + SnapEventBase::dump(f); + f->dump_unsigned("src_snap_id", snap_id); + f->dump_string("dest_snap_name", snap_name); +} + +void RenameEvent::encode(bufferlist& bl) const { + OpEventBase::encode(bl); + ::encode(image_name, bl); +} + +void RenameEvent::decode(__u8 version, bufferlist::iterator& it) { + OpEventBase::decode(version, it); + ::decode(image_name, it); +} + +void RenameEvent::dump(Formatter *f) const { + OpEventBase::dump(f); + f->dump_string("image_name", image_name); +} + +void ResizeEvent::encode(bufferlist& bl) const { + OpEventBase::encode(bl); + ::encode(size, bl); +} + +void ResizeEvent::decode(__u8 version, bufferlist::iterator& it) { + OpEventBase::decode(version, it); + ::decode(size, it); +} + +void ResizeEvent::dump(Formatter *f) const { + OpEventBase::dump(f); + f->dump_unsigned("size", size); +} + +void UnknownEvent::encode(bufferlist& bl) const { + assert(false); +} + +void UnknownEvent::decode(__u8 version, bufferlist::iterator& it) { +} + +void UnknownEvent::dump(Formatter *f) const { +} + +EventType EventEntry::get_event_type() const { + return boost::apply_visitor(GetTypeVisitor(), event); +} + +void EventEntry::encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + boost::apply_visitor(EncodeVisitor(bl), event); + ENCODE_FINISH(bl); +} + +void EventEntry::decode(bufferlist::iterator& it) { + DECODE_START(1, it); + + uint32_t event_type; + ::decode(event_type, it); + + // select the correct payload variant based upon the encoded op + switch (event_type) { + case EVENT_TYPE_AIO_DISCARD: + event = AioDiscardEvent(); + break; + case EVENT_TYPE_AIO_WRITE: + event = AioWriteEvent(); + break; + case EVENT_TYPE_AIO_FLUSH: + event = AioFlushEvent(); + break; + case EVENT_TYPE_OP_FINISH: + event = OpFinishEvent(); + break; + case EVENT_TYPE_SNAP_CREATE: + event = SnapCreateEvent(); + break; + case EVENT_TYPE_SNAP_REMOVE: + event = SnapRemoveEvent(); + break; + case EVENT_TYPE_SNAP_RENAME: + event = SnapRenameEvent(); + break; + case EVENT_TYPE_SNAP_PROTECT: + event = SnapProtectEvent(); + break; + case EVENT_TYPE_SNAP_UNPROTECT: + event = SnapUnprotectEvent(); + break; + case EVENT_TYPE_SNAP_ROLLBACK: + event = SnapRollbackEvent(); + break; + case EVENT_TYPE_RENAME: + event = RenameEvent(); + break; + case EVENT_TYPE_RESIZE: + event = ResizeEvent(); + break; + case EVENT_TYPE_FLATTEN: + event = FlattenEvent(); + break; + default: + event = UnknownEvent(); + break; + } + + boost::apply_visitor(DecodeVisitor(struct_v, it), event); + DECODE_FINISH(it); +} + +void EventEntry::dump(Formatter *f) const { + boost::apply_visitor(DumpVisitor(f, "event_type"), event); +} + +void EventEntry::generate_test_instances(std::list &o) { + o.push_back(new EventEntry(AioDiscardEvent())); + o.push_back(new EventEntry(AioDiscardEvent(123, 345))); + + bufferlist bl; + bl.append(std::string(32, '1')); + o.push_back(new EventEntry(AioWriteEvent())); + o.push_back(new EventEntry(AioWriteEvent(123, 456, bl))); + + o.push_back(new EventEntry(AioFlushEvent())); + + o.push_back(new EventEntry(OpFinishEvent(123, -1))); + + o.push_back(new EventEntry(SnapCreateEvent())); + o.push_back(new EventEntry(SnapCreateEvent(234, "snap"))); + + o.push_back(new EventEntry(SnapRemoveEvent())); + 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(SnapProtectEvent())); + o.push_back(new EventEntry(SnapProtectEvent(567, "snap"))); + + o.push_back(new EventEntry(SnapUnprotectEvent())); + o.push_back(new EventEntry(SnapUnprotectEvent(678, "snap"))); + + o.push_back(new EventEntry(SnapRollbackEvent())); + o.push_back(new EventEntry(SnapRollbackEvent(789, "snap"))); + + o.push_back(new EventEntry(RenameEvent())); + o.push_back(new EventEntry(RenameEvent(890, "image name"))); + + o.push_back(new EventEntry(ResizeEvent())); + o.push_back(new EventEntry(ResizeEvent(901, 1234))); + + o.push_back(new EventEntry(FlattenEvent(123))); +} + +// Journal Client + +void ImageClientMeta::encode(bufferlist& bl) const { + ::encode(tag_class, bl); +} + +void ImageClientMeta::decode(__u8 version, bufferlist::iterator& it) { + ::decode(tag_class, it); +} + +void ImageClientMeta::dump(Formatter *f) const { + f->dump_unsigned("tag_class", tag_class); +} + +void MirrorPeerClientMeta::encode(bufferlist& bl) const { + ::encode(cluster_id, bl); + ::encode(pool_id, bl); + ::encode(image_id, bl); +} + +void MirrorPeerClientMeta::decode(__u8 version, bufferlist::iterator& it) { + ::decode(cluster_id, it); + ::decode(pool_id, it); + ::decode(image_id, 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()); +} + +void CliClientMeta::encode(bufferlist& bl) const { +} + +void CliClientMeta::decode(__u8 version, bufferlist::iterator& it) { +} + +void CliClientMeta::dump(Formatter *f) const { +} + +void UnknownClientMeta::encode(bufferlist& bl) const { + assert(false); +} + +void UnknownClientMeta::decode(__u8 version, bufferlist::iterator& it) { +} + +void UnknownClientMeta::dump(Formatter *f) const { +} + +ClientMetaType ClientData::get_client_meta_type() const { + return boost::apply_visitor(GetTypeVisitor(), client_meta); +} + +void ClientData::encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + boost::apply_visitor(EncodeVisitor(bl), client_meta); + ENCODE_FINISH(bl); +} + +void ClientData::decode(bufferlist::iterator& it) { + DECODE_START(1, it); + + uint32_t client_meta_type; + ::decode(client_meta_type, it); + + // select the correct payload variant based upon the encoded op + switch (client_meta_type) { + case IMAGE_CLIENT_META_TYPE: + client_meta = ImageClientMeta(); + break; + case MIRROR_PEER_CLIENT_META_TYPE: + client_meta = MirrorPeerClientMeta(); + break; + case CLI_CLIENT_META_TYPE: + client_meta = CliClientMeta(); + break; + default: + client_meta = UnknownClientMeta(); + break; + } + + boost::apply_visitor(DecodeVisitor(struct_v, it), client_meta); + DECODE_FINISH(it); +} + +void ClientData::dump(Formatter *f) const { + boost::apply_visitor(DumpVisitor(f, "client_meta_type"), client_meta); +} + +void ClientData::generate_test_instances(std::list &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(CliClientMeta())); +} + +// Journal Tag + +void TagData::encode(bufferlist& bl) const { + ::encode(cluster_id, bl); + ::encode(pool_id, bl); + ::encode(image_id, 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(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_unsigned("predecessor_tag_tid", predecessor_tag_tid); + f->dump_unsigned("predecessor_entry_tid", predecessor_entry_tid); +} + +void TagData::generate_test_instances(std::list &o) { + o.push_back(new TagData()); + o.push_back(new TagData("cluster_id", 123, "image_id")); +} + +} // namespace journal +} // namespace librbd + +std::ostream &operator<<(std::ostream &out, + const librbd::journal::EventType &type) { + using namespace librbd::journal; + + switch (type) { + case EVENT_TYPE_AIO_DISCARD: + out << "AioDiscard"; + break; + case EVENT_TYPE_AIO_WRITE: + out << "AioWrite"; + break; + case EVENT_TYPE_AIO_FLUSH: + out << "AioFlush"; + break; + case EVENT_TYPE_OP_FINISH: + out << "OpFinish"; + break; + case EVENT_TYPE_SNAP_CREATE: + out << "SnapCreate"; + break; + case EVENT_TYPE_SNAP_REMOVE: + out << "SnapRemove"; + break; + case EVENT_TYPE_SNAP_RENAME: + out << "SnapRename"; + break; + case EVENT_TYPE_SNAP_PROTECT: + out << "SnapProtect"; + break; + case EVENT_TYPE_SNAP_UNPROTECT: + out << "SnapUnprotect"; + break; + case EVENT_TYPE_SNAP_ROLLBACK: + out << "SnapRollback"; + break; + case EVENT_TYPE_RENAME: + out << "Rename"; + break; + case EVENT_TYPE_RESIZE: + out << "Resize"; + break; + case EVENT_TYPE_FLATTEN: + out << "Flatten"; + break; + default: + out << "Unknown (" << static_cast(type) << ")"; + break; + } + return out; +} + +std::ostream &operator<<(std::ostream &out, + const librbd::journal::ClientMetaType &type) { + using namespace librbd::journal; + + switch (type) { + case IMAGE_CLIENT_META_TYPE: + out << "Master Image"; + break; + case MIRROR_PEER_CLIENT_META_TYPE: + out << "Mirror Peer"; + break; + case CLI_CLIENT_META_TYPE: + out << "CLI Tool"; + break; + default: + out << "Unknown (" << static_cast(type) << ")"; + break; + } + return out; + +} diff --git a/src/librbd/journal/Types.h b/src/librbd/journal/Types.h new file mode 100644 index 00000000000..cf4a6429686 --- /dev/null +++ b/src/librbd/journal/Types.h @@ -0,0 +1,414 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef CEPH_LIBRBD_JOURNAL_TYPES_H +#define CEPH_LIBRBD_JOURNAL_TYPES_H + +#include "include/int_types.h" +#include "include/buffer.h" +#include "include/encoding.h" +#include "include/types.h" +#include +#include + +namespace ceph { +class Formatter; +} + +namespace librbd { +namespace journal { + +enum EventType { + EVENT_TYPE_AIO_DISCARD = 0, + EVENT_TYPE_AIO_WRITE = 1, + EVENT_TYPE_AIO_FLUSH = 2, + EVENT_TYPE_OP_FINISH = 3, + EVENT_TYPE_SNAP_CREATE = 4, + EVENT_TYPE_SNAP_REMOVE = 5, + EVENT_TYPE_SNAP_RENAME = 6, + EVENT_TYPE_SNAP_PROTECT = 7, + EVENT_TYPE_SNAP_UNPROTECT = 8, + EVENT_TYPE_SNAP_ROLLBACK = 9, + EVENT_TYPE_RENAME = 10, + EVENT_TYPE_RESIZE = 11, + EVENT_TYPE_FLATTEN = 12 +}; + +struct AioDiscardEvent { + static const EventType TYPE = EVENT_TYPE_AIO_DISCARD; + + uint64_t offset; + size_t length; + + AioDiscardEvent() : offset(0), length(0) { + } + AioDiscardEvent(uint64_t _offset, size_t _length) + : offset(_offset), length(_length) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct AioWriteEvent { + static const EventType TYPE = EVENT_TYPE_AIO_WRITE; + + uint64_t offset; + size_t length; + bufferlist data; + + AioWriteEvent() : offset(0), length(0) { + } + AioWriteEvent(uint64_t _offset, size_t _length, const bufferlist &_data) + : offset(_offset), length(_length), data(_data) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct AioFlushEvent { + static const EventType TYPE = EVENT_TYPE_AIO_FLUSH; + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct OpEventBase { + uint64_t op_tid; + +protected: + OpEventBase() : op_tid(0) { + } + OpEventBase(uint64_t op_tid) : op_tid(op_tid) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct OpFinishEvent : public OpEventBase { + static const EventType TYPE = EVENT_TYPE_OP_FINISH; + + int r; + + OpFinishEvent() : r(0) { + } + OpFinishEvent(uint64_t op_tid, int r) : OpEventBase(op_tid), r(r) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct SnapEventBase : public OpEventBase { + std::string snap_name; + +protected: + SnapEventBase() { + } + SnapEventBase(uint64_t op_tid, const std::string &_snap_name) + : OpEventBase(op_tid), snap_name(_snap_name) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct SnapCreateEvent : public SnapEventBase { + static const EventType TYPE = EVENT_TYPE_SNAP_CREATE; + + SnapCreateEvent() { + } + SnapCreateEvent(uint64_t op_tid, const std::string &snap_name) + : SnapEventBase(op_tid, snap_name) { + } + + using SnapEventBase::encode; + using SnapEventBase::decode; + using SnapEventBase::dump; +}; + +struct SnapRemoveEvent : public SnapEventBase { + static const EventType TYPE = EVENT_TYPE_SNAP_REMOVE; + + SnapRemoveEvent() { + } + SnapRemoveEvent(uint64_t op_tid, const std::string &snap_name) + : SnapEventBase(op_tid, snap_name) { + } + + using SnapEventBase::encode; + using SnapEventBase::decode; + using SnapEventBase::dump; +}; + +struct SnapRenameEvent : public SnapEventBase { + static const EventType TYPE = EVENT_TYPE_SNAP_RENAME; + + uint64_t snap_id; + + SnapRenameEvent() : snap_id(CEPH_NOSNAP) { + } + SnapRenameEvent(uint64_t op_tid, uint64_t src_snap_id, + const std::string &dest_snap_name) + : SnapEventBase(op_tid, dest_snap_name), snap_id(src_snap_id) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct SnapProtectEvent : public SnapEventBase { + static const EventType TYPE = EVENT_TYPE_SNAP_PROTECT; + + SnapProtectEvent() { + } + SnapProtectEvent(uint64_t op_tid, const std::string &snap_name) + : SnapEventBase(op_tid, snap_name) { + } + + using SnapEventBase::encode; + using SnapEventBase::decode; + using SnapEventBase::dump; +}; + +struct SnapUnprotectEvent : public SnapEventBase { + static const EventType TYPE = EVENT_TYPE_SNAP_UNPROTECT; + + SnapUnprotectEvent() { + } + SnapUnprotectEvent(uint64_t op_tid, const std::string &snap_name) + : SnapEventBase(op_tid, snap_name) { + } + + using SnapEventBase::encode; + using SnapEventBase::decode; + using SnapEventBase::dump; +}; + +struct SnapRollbackEvent : public SnapEventBase { + static const EventType TYPE = EVENT_TYPE_SNAP_ROLLBACK; + + SnapRollbackEvent() { + } + SnapRollbackEvent(uint64_t op_tid, const std::string &snap_name) + : SnapEventBase(op_tid, snap_name) { + } + + using SnapEventBase::encode; + using SnapEventBase::decode; + using SnapEventBase::dump; +}; + +struct RenameEvent : public OpEventBase { + static const EventType TYPE = EVENT_TYPE_RENAME; + + std::string image_name; + + RenameEvent() { + } + RenameEvent(uint64_t op_tid, const std::string &_image_name) + : OpEventBase(op_tid), image_name(_image_name) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct ResizeEvent : public OpEventBase { + static const EventType TYPE = EVENT_TYPE_RESIZE; + + uint64_t size; + + ResizeEvent() : size(0) { + } + ResizeEvent(uint64_t op_tid, uint64_t _size) + : OpEventBase(op_tid), size(_size) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct FlattenEvent : public OpEventBase { + static const EventType TYPE = EVENT_TYPE_FLATTEN; + + FlattenEvent() { + } + FlattenEvent(uint64_t op_tid) : OpEventBase(op_tid) { + } + + using OpEventBase::encode; + using OpEventBase::decode; + using OpEventBase::dump; +}; + +struct UnknownEvent { + static const EventType TYPE = static_cast(-1); + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +typedef boost::variant Event; + +struct EventEntry { + EventEntry() : event(UnknownEvent()) { + } + EventEntry(const Event &_event) : event(_event) { + } + + Event event; + + EventType get_event_type() const; + + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator& it); + void dump(Formatter *f) const; + + static void generate_test_instances(std::list &o); +}; + +// Journal Client data structures + +enum ClientMetaType { + IMAGE_CLIENT_META_TYPE = 0, + MIRROR_PEER_CLIENT_META_TYPE = 1, + CLI_CLIENT_META_TYPE = 2 +}; + +struct ImageClientMeta { + static const ClientMetaType TYPE = IMAGE_CLIENT_META_TYPE; + + uint64_t tag_class = 0; + + ImageClientMeta() { + } + ImageClientMeta(uint64_t tag_class) : tag_class(tag_class) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct MirrorPeerClientMeta { + static const ClientMetaType TYPE = MIRROR_PEER_CLIENT_META_TYPE; + + std::string cluster_id; + int64_t pool_id = 0; + std::string image_id; + + MirrorPeerClientMeta() { + } + MirrorPeerClientMeta(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) { + } + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct CliClientMeta { + static const ClientMetaType TYPE = CLI_CLIENT_META_TYPE; + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +struct UnknownClientMeta { + static const ClientMetaType TYPE = static_cast(-1); + + void encode(bufferlist& bl) const; + void decode(__u8 version, bufferlist::iterator& it); + void dump(Formatter *f) const; +}; + +typedef boost::variant ClientMeta; + +struct ClientData { + ClientData() { + } + ClientData(const ClientMeta &client_meta) : client_meta(client_meta) { + } + + ClientMeta client_meta; + + ClientMetaType get_client_meta_type() const; + + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator& it); + void dump(Formatter *f) const; + + static void generate_test_instances(std::list &o); +}; + +// Journal Tag data structures + +struct TagData { + // owner of the tag (exclusive lock epoch) + std::string cluster_id; + int64_t pool_id = 0; + std::string image_id; + + // mapping to last committed record of previous tag + 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) { + } + + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator& it); + void dump(Formatter *f) const; + + static void generate_test_instances(std::list &o); +}; + +} // namespace journal +} // namespace librbd + +std::ostream &operator<<(std::ostream &out, + const librbd::journal::EventType &type); +std::ostream &operator<<(std::ostream &out, + const librbd::journal::ClientMetaType &type); + +WRITE_CLASS_ENCODER(librbd::journal::EventEntry); +WRITE_CLASS_ENCODER(librbd::journal::ClientData); +WRITE_CLASS_ENCODER(librbd::journal::TagData); + +#endif // CEPH_LIBRBD_JOURNAL_TYPES_H diff --git a/src/librbd/operation/Request.h b/src/librbd/operation/Request.h index 54d8281d4a2..44ff5e2eab2 100644 --- a/src/librbd/operation/Request.h +++ b/src/librbd/operation/Request.h @@ -9,7 +9,7 @@ #include "common/RWLock.h" #include "librbd/Utils.h" #include "librbd/Journal.h" -#include "librbd/journal/Entries.h" +#include "librbd/journal/Types.h" namespace librbd { diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index 1622a53a9b7..41796f4f70b 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -239,8 +239,10 @@ TYPE(ETableServer) TYPE(EUpdate) #ifdef WITH_RBD -#include "librbd/journal/Entries.h" +#include "librbd/journal/Types.h" TYPE(librbd::journal::EventEntry) +TYPE(librbd::journal::ClientData) +TYPE(librbd::journal::TagData) #include "librbd/WatchNotifyTypes.h" TYPE(librbd::watch_notify::NotifyMessage) TYPE(librbd::watch_notify::ResponseMessage) diff --git a/src/test/librbd/journal/test_Entries.cc b/src/test/librbd/journal/test_Entries.cc index 28598c0b0ff..91c5c78a8b8 100644 --- a/src/test/librbd/journal/test_Entries.cc +++ b/src/test/librbd/journal/test_Entries.cc @@ -7,7 +7,7 @@ #include "librbd/AioImageRequestWQ.h" #include "librbd/internal.h" #include "librbd/Journal.h" -#include "librbd/journal/Entries.h" +#include "librbd/journal/Types.h" #include "journal/Journaler.h" #include "journal/ReplayEntry.h" #include "journal/ReplayHandler.h" diff --git a/src/test/librbd/journal/test_Replay.cc b/src/test/librbd/journal/test_Replay.cc index f0f04094183..c144cbf2d35 100644 --- a/src/test/librbd/journal/test_Replay.cc +++ b/src/test/librbd/journal/test_Replay.cc @@ -10,7 +10,7 @@ #include "librbd/ImageCtx.h" #include "librbd/ImageWatcher.h" #include "librbd/Journal.h" -#include "librbd/journal/Entries.h" +#include "librbd/journal/Types.h" void register_test_journal_replay() { } diff --git a/src/test/librbd/journal/test_mock_Replay.cc b/src/test/librbd/journal/test_mock_Replay.cc index 81e8dd152a5..5302b8f94ba 100644 --- a/src/test/librbd/journal/test_mock_Replay.cc +++ b/src/test/librbd/journal/test_mock_Replay.cc @@ -5,8 +5,8 @@ #include "test/librbd/test_support.h" #include "test/librbd/mock/MockImageCtx.h" #include "librbd/AioImageRequest.h" -#include "librbd/journal/Entries.h" #include "librbd/journal/Replay.h" +#include "librbd/journal/Types.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include diff --git a/src/test/librbd/mock/MockJournal.h b/src/test/librbd/mock/MockJournal.h index b71505ee641..9fe35185060 100644 --- a/src/test/librbd/mock/MockJournal.h +++ b/src/test/librbd/mock/MockJournal.h @@ -6,7 +6,7 @@ #include "gmock/gmock.h" #include "librbd/Journal.h" -#include "librbd/journal/Entries.h" +#include "librbd/journal/Types.h" namespace librbd { diff --git a/src/test/librbd/test_mock_Journal.cc b/src/test/librbd/test_mock_Journal.cc index df842d3aedf..56fd1e62f4e 100644 --- a/src/test/librbd/test_mock_Journal.cc +++ b/src/test/librbd/test_mock_Journal.cc @@ -8,8 +8,8 @@ #include "common/Mutex.h" #include "librbd/Journal.h" #include "librbd/Utils.h" -#include "librbd/journal/Entries.h" #include "librbd/journal/Replay.h" +#include "librbd/journal/Types.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include diff --git a/src/tools/rbd/action/Journal.cc b/src/tools/rbd/action/Journal.cc index d15e6543ee7..2c556a6d505 100644 --- a/src/tools/rbd/action/Journal.cc +++ b/src/tools/rbd/action/Journal.cc @@ -21,7 +21,7 @@ #include "journal/ReplayEntry.h" #include "journal/ReplayHandler.h" //#include "librbd/Journal.h" // XXXMG: for librbd::Journal::reset() -#include "librbd/journal/Entries.h" +#include "librbd/journal/Types.h" namespace rbd { namespace action {