1 #include "scrub_types.h"
3 using namespace librados;
5 void object_id_wrapper::encode(bufferlist& bl) const
7 ENCODE_START(1, 1, bl);
10 ::encode(locator, bl);
15 void object_id_wrapper::decode(bufferlist::iterator& bp)
20 ::decode(locator, bp);
25 static void encode(const object_id_t& obj, bufferlist& bl)
27 reinterpret_cast<const object_id_wrapper&>(obj).encode(bl);
30 void osd_shard_wrapper::encode(bufferlist& bl) const
32 ENCODE_START(1, 1, bl);
38 void osd_shard_wrapper::decode(bufferlist::iterator& bp)
47 static void encode(const osd_shard_t& shard, bufferlist& bl)
49 reinterpret_cast<const osd_shard_wrapper&>(shard).encode(bl);
53 void shard_info_wrapper::set_object(const ScrubMap::object& object)
55 for (auto attr : object.attrs) {
57 bl.push_back(attr.second);
58 attrs.insert(std::make_pair(attr.first, std::move(bl)));
61 if (object.omap_digest_present) {
62 omap_digest_present = true;
63 omap_digest = object.omap_digest;
65 if (object.digest_present) {
66 data_digest_present = true;
67 data_digest = object.digest;
71 void shard_info_wrapper::encode(bufferlist& bl) const
73 ENCODE_START(3, 3, bl);
75 ::encode(primary, bl);
76 if (has_shard_missing()) {
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);
89 void shard_info_wrapper::decode(bufferlist::iterator& bp)
93 ::decode(primary, bp);
94 if (has_shard_missing()) {
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);
107 inconsistent_obj_wrapper::inconsistent_obj_wrapper(const hobject_t& hoid)
108 : inconsistent_obj_t{librados::object_id_t{hoid.oid.name,
110 hoid.get_key(), hoid.snap}}
113 void inconsistent_obj_wrapper::add_shard(const pg_shard_t& pgs,
114 const shard_info_wrapper& shard)
116 union_shards.errors |= shard.errors;
117 shards.emplace(osd_shard_t{pgs.osd, int8_t(pgs.shard)}, shard);
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)
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();
133 shard_map[pg_map.first].set_object(oid_object->second);
134 if (shard_map[pg_map.first].has_deep_errors())
136 else if (shard_map[pg_map.first].has_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]);
144 static void encode(const shard_info_t& shard, bufferlist& bl)
146 reinterpret_cast<const shard_info_wrapper&>(shard).encode(bl);
150 void inconsistent_obj_wrapper::encode(bufferlist& bl) const
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);
161 void inconsistent_obj_wrapper::decode(bufferlist::iterator& bp)
165 ::decode(errors, bp);
166 ::decode(object, bp);
167 ::decode(version, bp);
168 ::decode(shards, bp);
169 ::decode(union_shards.errors, bp);
173 inconsistent_snapset_wrapper::inconsistent_snapset_wrapper(const hobject_t& hoid)
174 : inconsistent_snapset_t{object_id_t{hoid.oid.name,
180 using inc_snapset_t = inconsistent_snapset_t;
182 void inconsistent_snapset_wrapper::set_headless()
184 errors |= inc_snapset_t::HEADLESS_CLONE;
187 void inconsistent_snapset_wrapper::set_ss_attr_missing()
189 errors |= inc_snapset_t::SNAPSET_MISSING;
192 void inconsistent_snapset_wrapper::set_oi_attr_missing()
194 errors |= inc_snapset_t::OI_MISSING;
197 void inconsistent_snapset_wrapper::set_ss_attr_corrupted()
199 errors |= inc_snapset_t::SNAPSET_CORRUPTED;
202 void inconsistent_snapset_wrapper::set_oi_attr_corrupted()
204 errors |= inc_snapset_t::OI_CORRUPTED;
207 void inconsistent_snapset_wrapper::set_clone_missing(snapid_t snap)
209 errors |= inc_snapset_t::CLONE_MISSING;
210 missing.push_back(snap);
213 void inconsistent_snapset_wrapper::set_clone(snapid_t snap)
215 errors |= inc_snapset_t::EXTRA_CLONES;
216 clones.push_back(snap);
219 void inconsistent_snapset_wrapper::set_snapset_mismatch()
221 errors |= inc_snapset_t::SNAP_MISMATCH;
224 void inconsistent_snapset_wrapper::set_head_mismatch()
226 errors |= inc_snapset_t::HEAD_MISMATCH;
229 void inconsistent_snapset_wrapper::set_size_mismatch()
231 errors |= inc_snapset_t::SIZE_MISMATCH;
234 void inconsistent_snapset_wrapper::encode(bufferlist& bl) const
236 ENCODE_START(1, 1, bl);
237 ::encode(errors, bl);
238 ::encode(object, bl);
239 ::encode(clones, bl);
240 ::encode(missing, bl);
244 void inconsistent_snapset_wrapper::decode(bufferlist::iterator& bp)
247 ::decode(errors, bp);
248 ::decode(object, bp);
249 ::decode(clones, bp);
250 ::decode(missing, bp);
254 void scrub_ls_arg_t::encode(bufferlist& bl) const
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);
266 void scrub_ls_arg_t::decode(bufferlist::iterator& 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);
278 void scrub_ls_result_t::encode(bufferlist& bl) const
280 ENCODE_START(1, 1, bl);
281 ::encode(interval, bl);
286 void scrub_ls_result_t::decode(bufferlist::iterator& bp)
289 ::decode(interval, bp);