]>
Commit | Line | Data |
---|---|---|
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 | ||
9 | namespace rbd { | |
10 | namespace mirror { | |
11 | namespace instance_watcher { | |
12 | ||
13 | namespace { | |
14 | ||
15 | class EncodePayloadVisitor : public boost::static_visitor<void> { | |
16 | public: | |
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 | ||
26 | private: | |
27 | bufferlist &m_bl; | |
28 | }; | |
29 | ||
30 | class DecodePayloadVisitor : public boost::static_visitor<void> { | |
31 | public: | |
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 | ||
40 | private: | |
41 | __u8 m_version; | |
11fdf7f2 | 42 | bufferlist::const_iterator &m_iter; |
7c673cae FG |
43 | }; |
44 | ||
45 | class DumpPayloadVisitor : public boost::static_visitor<void> { | |
46 | public: | |
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 | ||
56 | private: | |
57 | ceph::Formatter *m_formatter; | |
58 | }; | |
59 | ||
60 | } // anonymous namespace | |
61 | ||
31f18b77 | 62 | void PayloadBase::encode(bufferlist &bl) const { |
11fdf7f2 TL |
63 | using ceph::encode; |
64 | encode(request_id, bl); | |
31f18b77 FG |
65 | } |
66 | ||
11fdf7f2 TL |
67 | void PayloadBase::decode(__u8 version, bufferlist::const_iterator &iter) { |
68 | using ceph::decode; | |
69 | decode(request_id, iter); | |
31f18b77 FG |
70 | } |
71 | ||
72 | void PayloadBase::dump(Formatter *f) const { | |
73 | f->dump_unsigned("request_id", request_id); | |
74 | } | |
75 | ||
76 | void 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 |
82 | void 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 | ||
88 | void 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 | 93 | void 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 |
100 | void 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 |
107 | void 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 | 113 | void 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 |
119 | void 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 | ||
125 | void SyncPayloadBase::dump(Formatter *f) const { | |
126 | PayloadBase::dump(f); | |
127 | f->dump_string("sync_id", sync_id); | |
128 | } | |
129 | ||
7c673cae | 130 | void UnknownPayload::encode(bufferlist &bl) const { |
11fdf7f2 | 131 | ceph_abort(); |
7c673cae FG |
132 | } |
133 | ||
11fdf7f2 | 134 | void UnknownPayload::decode(__u8 version, bufferlist::const_iterator &iter) { |
7c673cae FG |
135 | } |
136 | ||
137 | void UnknownPayload::dump(Formatter *f) const { | |
138 | } | |
139 | ||
140 | void 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 | 146 | void 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 | ||
178 | void NotifyMessage::dump(Formatter *f) const { | |
179 | apply_visitor(DumpPayloadVisitor(f), payload); | |
180 | } | |
181 | ||
182 | void 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 | ||
199 | std::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 | ||
223 | void 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 |
230 | void 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 | ||
237 | void 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 |