]>
git.proxmox.com Git - ceph.git/blob - ceph/src/common/scrub_types.cc
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
);