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