]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: initial version of journal client and tag metadata
authorJason Dillaman <dillaman@redhat.com>
Fri, 5 Feb 2016 03:54:10 +0000 (22:54 -0500)
committerJason Dillaman <dillaman@redhat.com>
Fri, 5 Feb 2016 20:21:28 +0000 (15:21 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
17 files changed:
src/CMakeLists.txt
src/librbd/AioImageRequest.cc
src/librbd/Journal.cc
src/librbd/Makefile.am
src/librbd/journal/Entries.cc [deleted file]
src/librbd/journal/Entries.h [deleted file]
src/librbd/journal/Replay.h
src/librbd/journal/Types.cc [new file with mode: 0644]
src/librbd/journal/Types.h [new file with mode: 0644]
src/librbd/operation/Request.h
src/test/encoding/types.h
src/test/librbd/journal/test_Entries.cc
src/test/librbd/journal/test_Replay.cc
src/test/librbd/journal/test_mock_Replay.cc
src/test/librbd/mock/MockJournal.h
src/test/librbd/test_mock_Journal.cc
src/tools/rbd/action/Journal.cc

index 619519c2c599a3450bca828eba4b04f59fecfc59..457e71ba6c802ca7e78d2ee081529888b31e6830 100644 (file)
@@ -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
index cba7dde121972345cbbc7c62015dcade642169ad..fc77ea73f2e7277570262e3540e65c6bbac84bc9 100644 (file)
@@ -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"
 
index 0b0e453272cad69b78c9a804552b75d8c1d5c81c..8454a390b5be57a36ace71896dc3341aadacbd74 100644 (file)
@@ -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"
index 775d7027551efdfd129ed17d91eadc254822249b..7248f82cfeed036b841851c515342ce9dacfa60b 100644 (file)
@@ -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 (file)
index 5ed5cf3..0000000
+++ /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<EventType> {
-public:
-  template <typename Event>
-  inline EventType operator()(const Event &event) const {
-    return Event::EVENT_TYPE;
-  }
-};
-
-class EncodeEventVisitor : public boost::static_visitor<void> {
-public:
-  explicit EncodeEventVisitor(bufferlist &bl) : m_bl(bl) {
-  }
-
-  template <typename Event>
-  inline void operator()(const Event &event) const {
-    ::encode(static_cast<uint32_t>(Event::EVENT_TYPE), m_bl);
-    event.encode(m_bl);
-  }
-private:
-  bufferlist &m_bl;
-};
-
-class DecodeEventVisitor : public boost::static_visitor<void> {
-public:
-  DecodeEventVisitor(__u8 version, bufferlist::iterator &iter)
-    : m_version(version), m_iter(iter) {
-  }
-
-  template <typename Event>
-  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<void> {
-public:
-  explicit DumpEventVisitor(Formatter *formatter) : m_formatter(formatter) {}
-
-  template <typename Event>
-  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<EventEntry *> &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<uint32_t>(type) << ")";
-    break;
-  }
-  return out;
-}
diff --git a/src/librbd/journal/Entries.h b/src/librbd/journal/Entries.h
deleted file mode 100644 (file)
index 09218be..0000000
+++ /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 <iosfwd>
-#include <boost/variant.hpp>
-
-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<EventType>(-1);
-
-  void encode(bufferlist& bl) const;
-  void decode(__u8 version, bufferlist::iterator& it);
-  void dump(Formatter *f) const;
-};
-
-typedef boost::variant<AioDiscardEvent,
-                       AioWriteEvent,
-                       AioFlushEvent,
-                       OpFinishEvent,
-                       SnapCreateEvent,
-                       SnapRemoveEvent,
-                       SnapRenameEvent,
-                       SnapProtectEvent,
-                       SnapUnprotectEvent,
-                       SnapRollbackEvent,
-                       RenameEvent,
-                       ResizeEvent,
-                       FlattenEvent,
-                       UnknownEvent> 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<EventEntry *> &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
index 96333e363c9703e933fca44cd64a88b389d76f20..e0fad8a36fc64fde26c89585edecff102939f22f 100644 (file)
@@ -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 <boost/variant.hpp>
 #include <list>
 #include <set>
diff --git a/src/librbd/journal/Types.cc b/src/librbd/journal/Types.cc
new file mode 100644 (file)
index 0000000..781f793
--- /dev/null
@@ -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 <typename E>
+class GetTypeVisitor : public boost::static_visitor<E> {
+public:
+  template <typename T>
+  inline E operator()(const T&) const {
+    return T::TYPE;
+  }
+};
+
+class EncodeVisitor : public boost::static_visitor<void> {
+public:
+  explicit EncodeVisitor(bufferlist &bl) : m_bl(bl) {
+  }
+
+  template <typename T>
+  inline void operator()(const T& t) const {
+    ::encode(static_cast<uint32_t>(T::TYPE), m_bl);
+    t.encode(m_bl);
+  }
+private:
+  bufferlist &m_bl;
+};
+
+class DecodeVisitor : public boost::static_visitor<void> {
+public:
+  DecodeVisitor(__u8 version, bufferlist::iterator &iter)
+    : m_version(version), m_iter(iter) {
+  }
+
+  template <typename T>
+  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<void> {
+public:
+  explicit DumpVisitor(Formatter *formatter, const std::string &key)
+    : m_formatter(formatter), m_key(key) {}
+
+  template <typename T>
+  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<EventType>(), 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<EventEntry *> &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<ClientMetaType>(), 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<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(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<TagData *> &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<uint32_t>(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<uint32_t>(type) << ")";
+    break;
+  }
+  return out;
+
+}
diff --git a/src/librbd/journal/Types.h b/src/librbd/journal/Types.h
new file mode 100644 (file)
index 0000000..cf4a642
--- /dev/null
@@ -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 <iosfwd>
+#include <boost/variant.hpp>
+
+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<EventType>(-1);
+
+  void encode(bufferlist& bl) const;
+  void decode(__u8 version, bufferlist::iterator& it);
+  void dump(Formatter *f) const;
+};
+
+typedef boost::variant<AioDiscardEvent,
+                       AioWriteEvent,
+                       AioFlushEvent,
+                       OpFinishEvent,
+                       SnapCreateEvent,
+                       SnapRemoveEvent,
+                       SnapRenameEvent,
+                       SnapProtectEvent,
+                       SnapUnprotectEvent,
+                       SnapRollbackEvent,
+                       RenameEvent,
+                       ResizeEvent,
+                       FlattenEvent,
+                       UnknownEvent> 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<EventEntry *> &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<ClientMetaType>(-1);
+
+  void encode(bufferlist& bl) const;
+  void decode(__u8 version, bufferlist::iterator& it);
+  void dump(Formatter *f) const;
+};
+
+typedef boost::variant<ImageClientMeta,
+                       MirrorPeerClientMeta,
+                       CliClientMeta,
+                       UnknownClientMeta> 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<ClientData *> &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<TagData *> &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
index 54d8281d4a23c4756736117b11526cf60b56be3a..44ff5e2eab21e60d6988c4b1bbca6cfe3790d195 100644 (file)
@@ -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 {
 
index 1622a53a9b7a2a964d1dafb594c08fa181c05174..41796f4f70bc70e024c06c1f64eaa7aeaed5b792 100644 (file)
@@ -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)
index 28598c0b0ffd871115b57459af18398d4468bce3..91c5c78a8b8c2eb5297345889f98a2789ca749bb 100644 (file)
@@ -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"
index f0f0409418394b272fa4b2e1788344ea3ca4dc80..c144cbf2d3544912afcd685939be04955e3d5902 100644 (file)
@@ -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() {
 }
index 81e8dd152a5ebdbdb1def8bcd889b26d96004118..5302b8f94ba51046b08887311bc12e89cfe48211 100644 (file)
@@ -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 <boost/scope_exit.hpp>
index b71505ee6415728e406250fca4a7d7402c9df73e..9fe3518506004d50a4c93dfe39f79b42d69eb371 100644 (file)
@@ -6,7 +6,7 @@
 
 #include "gmock/gmock.h"
 #include "librbd/Journal.h"
-#include "librbd/journal/Entries.h"
+#include "librbd/journal/Types.h"
 
 namespace librbd {
 
index df842d3aedfbb74e8cf272f120d980a8ce857528..56fd1e62f4ee79fedcc8f880de4579fc024baab5 100644 (file)
@@ -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 <functional>
index d15e6543ee7188c5c95e618cf92b374eb060a002..2c556a6d50593e5be53473c29b2b7f524d1febc9 100644 (file)
@@ -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 {