]> git.proxmox.com Git - ceph.git/blame - ceph/src/tools/rbd_mirror/instance_watcher/Types.cc
bump version to 18.2.2-pve1
[ceph.git] / ceph / src / tools / rbd_mirror / instance_watcher / Types.cc
CommitLineData
7c673cae
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
4#include "Types.h"
11fdf7f2 5#include "include/ceph_assert.h"
7c673cae
FG
6#include "include/stringify.h"
7#include "common/Formatter.h"
8
9namespace rbd {
10namespace mirror {
11namespace instance_watcher {
12
13namespace {
14
15class EncodePayloadVisitor : public boost::static_visitor<void> {
16public:
17 explicit EncodePayloadVisitor(bufferlist &bl) : m_bl(bl) {}
18
19 template <typename Payload>
20 inline void operator()(const Payload &payload) const {
11fdf7f2
TL
21 using ceph::encode;
22 encode(static_cast<uint32_t>(Payload::NOTIFY_OP), m_bl);
7c673cae
FG
23 payload.encode(m_bl);
24 }
25
26private:
27 bufferlist &m_bl;
28};
29
30class DecodePayloadVisitor : public boost::static_visitor<void> {
31public:
11fdf7f2 32 DecodePayloadVisitor(__u8 version, bufferlist::const_iterator &iter)
7c673cae
FG
33 : m_version(version), m_iter(iter) {}
34
35 template <typename Payload>
36 inline void operator()(Payload &payload) const {
37 payload.decode(m_version, m_iter);
38 }
39
40private:
41 __u8 m_version;
11fdf7f2 42 bufferlist::const_iterator &m_iter;
7c673cae
FG
43};
44
45class DumpPayloadVisitor : public boost::static_visitor<void> {
46public:
47 explicit DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {}
48
49 template <typename Payload>
50 inline void operator()(const Payload &payload) const {
51 NotifyOp notify_op = Payload::NOTIFY_OP;
52 m_formatter->dump_string("notify_op", stringify(notify_op));
53 payload.dump(m_formatter);
54 }
55
56private:
57 ceph::Formatter *m_formatter;
58};
59
60} // anonymous namespace
61
31f18b77 62void PayloadBase::encode(bufferlist &bl) const {
11fdf7f2
TL
63 using ceph::encode;
64 encode(request_id, bl);
31f18b77
FG
65}
66
11fdf7f2
TL
67void PayloadBase::decode(__u8 version, bufferlist::const_iterator &iter) {
68 using ceph::decode;
69 decode(request_id, iter);
31f18b77
FG
70}
71
72void PayloadBase::dump(Formatter *f) const {
73 f->dump_unsigned("request_id", request_id);
74}
75
76void ImagePayloadBase::encode(bufferlist &bl) const {
11fdf7f2 77 using ceph::encode;
31f18b77 78 PayloadBase::encode(bl);
11fdf7f2 79 encode(global_image_id, bl);
7c673cae
FG
80}
81
11fdf7f2
TL
82void ImagePayloadBase::decode(__u8 version, bufferlist::const_iterator &iter) {
83 using ceph::decode;
31f18b77 84 PayloadBase::decode(version, iter);
11fdf7f2 85 decode(global_image_id, iter);
7c673cae
FG
86}
87
88void ImagePayloadBase::dump(Formatter *f) const {
31f18b77 89 PayloadBase::dump(f);
7c673cae 90 f->dump_string("global_image_id", global_image_id);
7c673cae
FG
91}
92
d2e6a577 93void PeerImageRemovedPayload::encode(bufferlist &bl) const {
11fdf7f2 94 using ceph::encode;
d2e6a577 95 PayloadBase::encode(bl);
11fdf7f2
TL
96 encode(global_image_id, bl);
97 encode(peer_mirror_uuid, bl);
7c673cae
FG
98}
99
11fdf7f2
TL
100void PeerImageRemovedPayload::decode(__u8 version, bufferlist::const_iterator &iter) {
101 using ceph::decode;
d2e6a577 102 PayloadBase::decode(version, iter);
11fdf7f2
TL
103 decode(global_image_id, iter);
104 decode(peer_mirror_uuid, iter);
7c673cae
FG
105}
106
d2e6a577
FG
107void PeerImageRemovedPayload::dump(Formatter *f) const {
108 PayloadBase::dump(f);
109 f->dump_string("global_image_id", global_image_id);
110 f->dump_string("peer_mirror_uuid", peer_mirror_uuid);
7c673cae
FG
111}
112
31f18b77 113void SyncPayloadBase::encode(bufferlist &bl) const {
11fdf7f2 114 using ceph::encode;
31f18b77 115 PayloadBase::encode(bl);
11fdf7f2 116 encode(sync_id, bl);
31f18b77
FG
117}
118
11fdf7f2
TL
119void SyncPayloadBase::decode(__u8 version, bufferlist::const_iterator &iter) {
120 using ceph::decode;
31f18b77 121 PayloadBase::decode(version, iter);
11fdf7f2 122 decode(sync_id, iter);
31f18b77
FG
123}
124
125void SyncPayloadBase::dump(Formatter *f) const {
126 PayloadBase::dump(f);
127 f->dump_string("sync_id", sync_id);
128}
129
7c673cae 130void UnknownPayload::encode(bufferlist &bl) const {
11fdf7f2 131 ceph_abort();
7c673cae
FG
132}
133
11fdf7f2 134void UnknownPayload::decode(__u8 version, bufferlist::const_iterator &iter) {
7c673cae
FG
135}
136
137void UnknownPayload::dump(Formatter *f) const {
138}
139
140void NotifyMessage::encode(bufferlist& bl) const {
d2e6a577 141 ENCODE_START(2, 2, bl);
7c673cae
FG
142 boost::apply_visitor(EncodePayloadVisitor(bl), payload);
143 ENCODE_FINISH(bl);
144}
145
11fdf7f2 146void NotifyMessage::decode(bufferlist::const_iterator& iter) {
d2e6a577 147 DECODE_START(2, iter);
7c673cae
FG
148
149 uint32_t notify_op;
11fdf7f2 150 decode(notify_op, iter);
7c673cae
FG
151
152 // select the correct payload variant based upon the encoded op
153 switch (notify_op) {
154 case NOTIFY_OP_IMAGE_ACQUIRE:
155 payload = ImageAcquirePayload();
156 break;
157 case NOTIFY_OP_IMAGE_RELEASE:
158 payload = ImageReleasePayload();
159 break;
d2e6a577
FG
160 case NOTIFY_OP_PEER_IMAGE_REMOVED:
161 payload = PeerImageRemovedPayload();
162 break;
31f18b77
FG
163 case NOTIFY_OP_SYNC_REQUEST:
164 payload = SyncRequestPayload();
165 break;
166 case NOTIFY_OP_SYNC_START:
167 payload = SyncStartPayload();
168 break;
7c673cae
FG
169 default:
170 payload = UnknownPayload();
171 break;
172 }
173
174 apply_visitor(DecodePayloadVisitor(struct_v, iter), payload);
175 DECODE_FINISH(iter);
176}
177
178void NotifyMessage::dump(Formatter *f) const {
179 apply_visitor(DumpPayloadVisitor(f), payload);
180}
181
182void NotifyMessage::generate_test_instances(std::list<NotifyMessage *> &o) {
183 o.push_back(new NotifyMessage(ImageAcquirePayload()));
d2e6a577 184 o.push_back(new NotifyMessage(ImageAcquirePayload(1, "gid")));
7c673cae
FG
185
186 o.push_back(new NotifyMessage(ImageReleasePayload()));
d2e6a577
FG
187 o.push_back(new NotifyMessage(ImageReleasePayload(1, "gid")));
188
189 o.push_back(new NotifyMessage(PeerImageRemovedPayload()));
190 o.push_back(new NotifyMessage(PeerImageRemovedPayload(1, "gid", "uuid")));
31f18b77
FG
191
192 o.push_back(new NotifyMessage(SyncRequestPayload()));
193 o.push_back(new NotifyMessage(SyncRequestPayload(1, "sync_id")));
194
195 o.push_back(new NotifyMessage(SyncStartPayload()));
196 o.push_back(new NotifyMessage(SyncStartPayload(1, "sync_id")));
7c673cae
FG
197}
198
199std::ostream &operator<<(std::ostream &out, const NotifyOp &op) {
200 switch (op) {
201 case NOTIFY_OP_IMAGE_ACQUIRE:
202 out << "ImageAcquire";
203 break;
204 case NOTIFY_OP_IMAGE_RELEASE:
205 out << "ImageRelease";
206 break;
d2e6a577
FG
207 case NOTIFY_OP_PEER_IMAGE_REMOVED:
208 out << "PeerImageRemoved";
209 break;
31f18b77
FG
210 case NOTIFY_OP_SYNC_REQUEST:
211 out << "SyncRequest";
212 break;
213 case NOTIFY_OP_SYNC_START:
214 out << "SyncStart";
215 break;
7c673cae
FG
216 default:
217 out << "Unknown (" << static_cast<uint32_t>(op) << ")";
218 break;
219 }
220 return out;
221}
222
223void NotifyAckPayload::encode(bufferlist &bl) const {
11fdf7f2
TL
224 using ceph::encode;
225 encode(instance_id, bl);
226 encode(request_id, bl);
227 encode(ret_val, bl);
7c673cae
FG
228}
229
11fdf7f2
TL
230void NotifyAckPayload::decode(bufferlist::const_iterator &iter) {
231 using ceph::decode;
232 decode(instance_id, iter);
233 decode(request_id, iter);
234 decode(ret_val, iter);
7c673cae
FG
235}
236
237void NotifyAckPayload::dump(Formatter *f) const {
238 f->dump_string("instance_id", instance_id);
239 f->dump_unsigned("request_id", request_id);
240 f->dump_int("request_id", ret_val);
241}
242
243} // namespace instance_watcher
244} // namespace mirror
245} // namespace rbd