]>
git.proxmox.com Git - ceph.git/blob - ceph/src/tools/rbd_mirror/leader_watcher/Types.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
5 #include "include/assert.h"
6 #include "include/stringify.h"
7 #include "common/Formatter.h"
11 namespace leader_watcher
{
15 class EncodePayloadVisitor
: public boost::static_visitor
<void> {
17 explicit EncodePayloadVisitor(bufferlist
&bl
) : m_bl(bl
) {}
19 template <typename Payload
>
20 inline void operator()(const Payload
&payload
) const {
21 ::encode(static_cast<uint32_t>(Payload::NOTIFY_OP
), m_bl
);
29 class DecodePayloadVisitor
: public boost::static_visitor
<void> {
31 DecodePayloadVisitor(__u8 version
, bufferlist::iterator
&iter
)
32 : m_version(version
), m_iter(iter
) {}
34 template <typename Payload
>
35 inline void operator()(Payload
&payload
) const {
36 payload
.decode(m_version
, m_iter
);
41 bufferlist::iterator
&m_iter
;
44 class DumpPayloadVisitor
: public boost::static_visitor
<void> {
46 explicit DumpPayloadVisitor(Formatter
*formatter
) : m_formatter(formatter
) {}
48 template <typename Payload
>
49 inline void operator()(const Payload
&payload
) const {
50 NotifyOp notify_op
= Payload::NOTIFY_OP
;
51 m_formatter
->dump_string("notify_op", stringify(notify_op
));
52 payload
.dump(m_formatter
);
56 ceph::Formatter
*m_formatter
;
59 } // anonymous namespace
61 void HeartbeatPayload::encode(bufferlist
&bl
) const {
64 void HeartbeatPayload::decode(__u8 version
, bufferlist::iterator
&iter
) {
67 void HeartbeatPayload::dump(Formatter
*f
) const {
70 void LockAcquiredPayload::encode(bufferlist
&bl
) const {
73 void LockAcquiredPayload::decode(__u8 version
, bufferlist::iterator
&iter
) {
76 void LockAcquiredPayload::dump(Formatter
*f
) const {
79 void LockReleasedPayload::encode(bufferlist
&bl
) const {
82 void LockReleasedPayload::decode(__u8 version
, bufferlist::iterator
&iter
) {
85 void LockReleasedPayload::dump(Formatter
*f
) const {
88 void UnknownPayload::encode(bufferlist
&bl
) const {
92 void UnknownPayload::decode(__u8 version
, bufferlist::iterator
&iter
) {
95 void UnknownPayload::dump(Formatter
*f
) const {
98 void NotifyMessage::encode(bufferlist
& bl
) const {
99 ENCODE_START(1, 1, bl
);
100 boost::apply_visitor(EncodePayloadVisitor(bl
), payload
);
104 void NotifyMessage::decode(bufferlist::iterator
& iter
) {
105 DECODE_START(1, iter
);
108 ::decode(notify_op
, iter
);
110 // select the correct payload variant based upon the encoded op
112 case NOTIFY_OP_HEARTBEAT
:
113 payload
= HeartbeatPayload();
115 case NOTIFY_OP_LOCK_ACQUIRED
:
116 payload
= LockAcquiredPayload();
118 case NOTIFY_OP_LOCK_RELEASED
:
119 payload
= LockReleasedPayload();
122 payload
= UnknownPayload();
126 apply_visitor(DecodePayloadVisitor(struct_v
, iter
), payload
);
130 void NotifyMessage::dump(Formatter
*f
) const {
131 apply_visitor(DumpPayloadVisitor(f
), payload
);
134 void NotifyMessage::generate_test_instances(std::list
<NotifyMessage
*> &o
) {
135 o
.push_back(new NotifyMessage(HeartbeatPayload()));
136 o
.push_back(new NotifyMessage(LockAcquiredPayload()));
137 o
.push_back(new NotifyMessage(LockReleasedPayload()));
140 std::ostream
&operator<<(std::ostream
&out
, const NotifyOp
&op
) {
142 case NOTIFY_OP_HEARTBEAT
:
145 case NOTIFY_OP_LOCK_ACQUIRED
:
146 out
<< "LockAcquired";
148 case NOTIFY_OP_LOCK_RELEASED
:
149 out
<< "LockReleased";
152 out
<< "Unknown (" << static_cast<uint32_t>(op
) << ")";
158 } // namespace leader_watcher
159 } // namespace mirror
160 } // namespace librbd