Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / common / scrub_types.cc
1 #include "scrub_types.h"
2
3 using namespace librados;
4
5 void object_id_wrapper::encode(bufferlist& bl) const
6 {
7   ENCODE_START(1, 1, bl);
8   ::encode(name, bl);
9   ::encode(nspace, bl);
10   ::encode(locator, bl);
11   ::encode(snap, bl);
12   ENCODE_FINISH(bl);
13 }
14
15 void object_id_wrapper::decode(bufferlist::iterator& bp)
16 {
17   DECODE_START(1, bp);
18   ::decode(name, bp);
19   ::decode(nspace, bp);
20   ::decode(locator, bp);
21   ::decode(snap, bp);
22   DECODE_FINISH(bp);
23 }
24
25 static void encode(const object_id_t& obj, bufferlist& bl)
26 {
27   reinterpret_cast<const object_id_wrapper&>(obj).encode(bl);
28 }
29
30 void osd_shard_wrapper::encode(bufferlist& bl) const
31 {
32   ENCODE_START(1, 1, bl);
33   ::encode(osd, bl);
34   ::encode(shard, bl);
35   ENCODE_FINISH(bl);
36 }
37
38 void osd_shard_wrapper::decode(bufferlist::iterator& bp)
39 {
40   DECODE_START(1, bp);
41   ::decode(osd, bp);
42   ::decode(shard, bp);
43   DECODE_FINISH(bp);
44 }
45
46 namespace librados {
47   static void encode(const osd_shard_t& shard, bufferlist& bl)
48   {
49     reinterpret_cast<const osd_shard_wrapper&>(shard).encode(bl);
50   }
51 }
52
53 void shard_info_wrapper::set_object(const ScrubMap::object& object)
54 {
55   for (auto attr : object.attrs) {
56     bufferlist bl;
57     bl.push_back(attr.second);
58     attrs.insert(std::make_pair(attr.first, std::move(bl)));
59   }
60   size = object.size;
61   if (object.omap_digest_present) {
62     omap_digest_present = true;
63     omap_digest = object.omap_digest;
64   }
65   if (object.digest_present) {
66     data_digest_present = true;
67     data_digest = object.digest;
68   }
69 }
70
71 void shard_info_wrapper::encode(bufferlist& bl) const
72 {
73   ENCODE_START(3, 3, bl);
74   ::encode(errors, bl);
75   ::encode(primary, bl);
76   if (has_shard_missing()) {
77     return;
78   }
79   ::encode(attrs, bl);
80   ::encode(size, bl);
81   ::encode(omap_digest_present, bl);
82   ::encode(omap_digest, bl);
83   ::encode(data_digest_present, bl);
84   ::encode(data_digest, bl);
85   ::encode(selected_oi, bl);
86   ENCODE_FINISH(bl);
87 }
88
89 void shard_info_wrapper::decode(bufferlist::iterator& bp)
90 {
91   DECODE_START(3, bp);
92   ::decode(errors, bp);
93   ::decode(primary, bp);
94   if (has_shard_missing()) {
95     return;
96   }
97   ::decode(attrs, bp);
98   ::decode(size, bp);
99   ::decode(omap_digest_present, bp);
100   ::decode(omap_digest, bp);
101   ::decode(data_digest_present, bp);
102   ::decode(data_digest, bp);
103   ::decode(selected_oi, bp);
104   DECODE_FINISH(bp);
105 }
106
107 inconsistent_obj_wrapper::inconsistent_obj_wrapper(const hobject_t& hoid)
108   : inconsistent_obj_t{librados::object_id_t{hoid.oid.name,
109                                  hoid.nspace,
110                                  hoid.get_key(), hoid.snap}}
111 {}
112
113 void inconsistent_obj_wrapper::add_shard(const pg_shard_t& pgs,
114                                          const shard_info_wrapper& shard)
115 {
116   union_shards.errors |= shard.errors;
117   shards.emplace(osd_shard_t{pgs.osd, int8_t(pgs.shard)}, shard);
118 }
119
120 void
121 inconsistent_obj_wrapper::set_auth_missing(const hobject_t& hoid,
122                                            const map<pg_shard_t, ScrubMap*>& maps,
123                                            map<pg_shard_t, shard_info_wrapper> &shard_map,
124                                            int &shallow_errors, int &deep_errors,
125                                            const pg_shard_t &primary)
126 {
127   for (auto pg_map : maps) {
128     auto oid_object = pg_map.second->objects.find(hoid);
129     shard_map[pg_map.first].primary = (pg_map.first == primary);
130     if (oid_object == pg_map.second->objects.end())
131       shard_map[pg_map.first].set_missing();
132     else
133       shard_map[pg_map.first].set_object(oid_object->second);
134     if (shard_map[pg_map.first].has_deep_errors())
135       ++deep_errors;
136     else if (shard_map[pg_map.first].has_shallow_errors())
137       ++shallow_errors;
138     union_shards.errors |= shard_map[pg_map.first].errors;
139     shards.emplace(osd_shard_t{pg_map.first.osd, pg_map.first.shard}, shard_map[pg_map.first]);
140   }
141 }
142
143 namespace librados {
144   static void encode(const shard_info_t& shard, bufferlist& bl)
145   {
146     reinterpret_cast<const shard_info_wrapper&>(shard).encode(bl);
147   }
148 }
149
150 void inconsistent_obj_wrapper::encode(bufferlist& bl) const
151 {
152   ENCODE_START(2, 2, bl);
153   ::encode(errors, bl);
154   ::encode(object, bl);
155   ::encode(version, bl);
156   ::encode(shards, bl);
157   ::encode(union_shards.errors, bl);
158   ENCODE_FINISH(bl);
159 }
160
161 void inconsistent_obj_wrapper::decode(bufferlist::iterator& bp)
162 {
163   DECODE_START(2, bp);
164   DECODE_OLDEST(2);
165   ::decode(errors, bp);
166   ::decode(object, bp);
167   ::decode(version, bp);
168   ::decode(shards, bp);
169   ::decode(union_shards.errors, bp);
170   DECODE_FINISH(bp);
171 }
172
173 inconsistent_snapset_wrapper::inconsistent_snapset_wrapper(const hobject_t& hoid)
174   : inconsistent_snapset_t{object_id_t{hoid.oid.name,
175                                        hoid.nspace,
176                                        hoid.get_key(),
177                                        hoid.snap}}
178 {}
179
180 using inc_snapset_t = inconsistent_snapset_t;
181
182 void inconsistent_snapset_wrapper::set_headless()
183 {
184   errors |= inc_snapset_t::HEADLESS_CLONE;
185 }
186
187 void inconsistent_snapset_wrapper::set_ss_attr_missing()
188 {
189   errors |= inc_snapset_t::SNAPSET_MISSING;
190 }
191
192 void inconsistent_snapset_wrapper::set_oi_attr_missing()
193 {
194   errors |= inc_snapset_t::OI_MISSING;
195 }
196
197 void inconsistent_snapset_wrapper::set_ss_attr_corrupted()
198 {
199   errors |= inc_snapset_t::SNAPSET_CORRUPTED;
200 }
201
202 void inconsistent_snapset_wrapper::set_oi_attr_corrupted()
203 {
204   errors |= inc_snapset_t::OI_CORRUPTED;
205 }
206
207 void inconsistent_snapset_wrapper::set_clone_missing(snapid_t snap)
208 {
209   errors |= inc_snapset_t::CLONE_MISSING;
210   missing.push_back(snap);
211 }
212
213 void inconsistent_snapset_wrapper::set_clone(snapid_t snap)
214 {
215   errors |= inc_snapset_t::EXTRA_CLONES;
216   clones.push_back(snap);
217 }
218
219 void inconsistent_snapset_wrapper::set_snapset_mismatch()
220 {
221   errors |= inc_snapset_t::SNAP_MISMATCH;
222 }
223
224 void inconsistent_snapset_wrapper::set_head_mismatch()
225 {
226   errors |= inc_snapset_t::HEAD_MISMATCH;
227 }
228
229 void inconsistent_snapset_wrapper::set_size_mismatch()
230 {
231   errors |= inc_snapset_t::SIZE_MISMATCH;
232 }
233
234 void inconsistent_snapset_wrapper::encode(bufferlist& bl) const
235 {
236   ENCODE_START(1, 1, bl);
237   ::encode(errors, bl);
238   ::encode(object, bl);
239   ::encode(clones, bl);
240   ::encode(missing, bl);
241   ENCODE_FINISH(bl);
242 }
243
244 void inconsistent_snapset_wrapper::decode(bufferlist::iterator& bp)
245 {
246   DECODE_START(1, bp);
247   ::decode(errors, bp);
248   ::decode(object, bp);
249   ::decode(clones, bp);
250   ::decode(missing, bp);
251   DECODE_FINISH(bp);
252 }
253
254 void scrub_ls_arg_t::encode(bufferlist& bl) const
255 {
256   ENCODE_START(1, 1, bl);
257   ::encode(interval, bl);
258   ::encode(get_snapsets, bl);
259   ::encode(start_after.name, bl);
260   ::encode(start_after.nspace, bl);
261   ::encode(start_after.snap, bl);
262   ::encode(max_return, bl);
263   ENCODE_FINISH(bl);
264 }
265
266 void scrub_ls_arg_t::decode(bufferlist::iterator& bp)
267 {
268   DECODE_START(1, bp);
269   ::decode(interval, bp);
270   ::decode(get_snapsets, bp);
271   ::decode(start_after.name, bp);
272   ::decode(start_after.nspace, bp);
273   ::decode(start_after.snap, bp);
274   ::decode(max_return, bp);
275   DECODE_FINISH(bp);
276 }
277
278 void scrub_ls_result_t::encode(bufferlist& bl) const
279 {
280   ENCODE_START(1, 1, bl);
281   ::encode(interval, bl);
282   ::encode(vals, bl);
283   ENCODE_FINISH(bl);
284 }
285
286 void scrub_ls_result_t::decode(bufferlist::iterator& bp)
287 {
288   DECODE_START(1, bp);
289   ::decode(interval, bp);
290   ::decode(vals, bp);
291   DECODE_FINISH(bp);
292 }