1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_SCRUB_TYPES_H
5 #define CEPH_SCRUB_TYPES_H
7 #include "osd/osd_types.h"
9 // wrappers around scrub types to offer the necessary bits other than
10 // the minimal set that the lirados requires
11 struct object_id_wrapper
: public librados::object_id_t
{
12 object_id_wrapper(const hobject_t
& hoid
)
13 : object_id_t
{hoid
.oid
.name
, hoid
.nspace
, hoid
.get_key(), hoid
.snap
}
15 void encode(bufferlist
& bl
) const;
16 void decode(bufferlist::iterator
& bl
);
19 WRITE_CLASS_ENCODER(object_id_wrapper
)
21 inline void decode(librados::object_id_t
& obj
, bufferlist::iterator
& bp
) {
22 reinterpret_cast<object_id_wrapper
&>(obj
).decode(bp
);
25 struct osd_shard_wrapper
: public librados::osd_shard_t
{
26 void encode(bufferlist
& bl
) const;
27 void decode(bufferlist::iterator
& bp
);
30 WRITE_CLASS_ENCODER(osd_shard_wrapper
)
33 inline void decode(librados::osd_shard_t
& shard
, bufferlist::iterator
& bp
) {
34 reinterpret_cast<osd_shard_wrapper
&>(shard
).decode(bp
);
38 struct shard_info_wrapper
: public librados::shard_info_t
{
40 shard_info_wrapper() = default;
41 shard_info_wrapper(const ScrubMap::object
& object
) {
44 void set_object(const ScrubMap::object
& object
);
46 errors
|= err_t::SHARD_MISSING
;
48 void set_omap_digest_mismatch_info() {
49 errors
|= err_t::OMAP_DIGEST_MISMATCH_INFO
;
51 void set_size_mismatch_info() {
52 errors
|= err_t::SIZE_MISMATCH_INFO
;
54 void set_data_digest_mismatch_info() {
55 errors
|= err_t::DATA_DIGEST_MISMATCH_INFO
;
57 void set_read_error() {
58 errors
|= err_t::SHARD_READ_ERR
;
60 void set_stat_error() {
61 errors
|= err_t::SHARD_STAT_ERR
;
63 void set_ec_hash_mismatch() {
64 errors
|= err_t::SHARD_EC_HASH_MISMATCH
;
66 void set_ec_size_mismatch() {
67 errors
|= err_t::SHARD_EC_SIZE_MISMATCH
;
69 void set_info_missing() {
70 errors
|= err_t::INFO_MISSING
;
72 void set_info_corrupted() {
73 errors
|= err_t::INFO_CORRUPTED
;
75 void set_snapset_missing() {
76 errors
|= err_t::SNAPSET_MISSING
;
78 void set_snapset_corrupted() {
79 errors
|= err_t::SNAPSET_CORRUPTED
;
81 void set_obj_size_info_mismatch() {
82 errors
|= err_t::OBJ_SIZE_INFO_MISMATCH
;
84 void set_hinfo_missing() {
85 errors
|= err_t::HINFO_MISSING
;
87 void set_hinfo_corrupted() {
88 errors
|= err_t::HINFO_CORRUPTED
;
90 bool only_data_digest_mismatch_info() const {
91 return errors
== err_t::DATA_DIGEST_MISMATCH_INFO
;
93 void clear_data_digest_mismatch_info() {
94 errors
&= ~err_t::DATA_DIGEST_MISMATCH_INFO
;
96 void encode(bufferlist
& bl
) const;
97 void decode(bufferlist::iterator
& bp
);
100 WRITE_CLASS_ENCODER(shard_info_wrapper
)
103 inline void decode(librados::shard_info_t
& shard
,
104 bufferlist::iterator
& bp
) {
105 reinterpret_cast<shard_info_wrapper
&>(shard
).decode(bp
);
109 struct inconsistent_obj_wrapper
: librados::inconsistent_obj_t
{
110 inconsistent_obj_wrapper(const hobject_t
& hoid
);
112 void set_object_info_inconsistency() {
113 errors
|= obj_err_t::OBJECT_INFO_INCONSISTENCY
;
115 void set_omap_digest_mismatch() {
116 errors
|= obj_err_t::OMAP_DIGEST_MISMATCH
;
118 void set_data_digest_mismatch() {
119 errors
|= obj_err_t::DATA_DIGEST_MISMATCH
;
121 void set_size_mismatch() {
122 errors
|= obj_err_t::SIZE_MISMATCH
;
124 void set_attr_value_mismatch() {
125 errors
|= obj_err_t::ATTR_VALUE_MISMATCH
;
127 void set_attr_name_mismatch() {
128 errors
|= obj_err_t::ATTR_NAME_MISMATCH
;
130 void set_snapset_inconsistency() {
131 errors
|= obj_err_t::SNAPSET_INCONSISTENCY
;
133 void set_hinfo_inconsistency() {
134 errors
|= obj_err_t::HINFO_INCONSISTENCY
;
136 void add_shard(const pg_shard_t
& pgs
, const shard_info_wrapper
& shard
);
137 void set_auth_missing(const hobject_t
& hoid
,
138 const map
<pg_shard_t
, ScrubMap
*>&,
139 map
<pg_shard_t
, shard_info_wrapper
>&,
140 int &shallow_errors
, int &deep_errors
,
141 const pg_shard_t
&primary
);
142 void set_version(uint64_t ver
) { version
= ver
; }
143 void encode(bufferlist
& bl
) const;
144 void decode(bufferlist::iterator
& bp
);
147 WRITE_CLASS_ENCODER(inconsistent_obj_wrapper
)
149 inline void decode(librados::inconsistent_obj_t
& obj
,
150 bufferlist::iterator
& bp
) {
151 reinterpret_cast<inconsistent_obj_wrapper
&>(obj
).decode(bp
);
154 struct inconsistent_snapset_wrapper
: public librados::inconsistent_snapset_t
{
155 inconsistent_snapset_wrapper() = default;
156 inconsistent_snapset_wrapper(const hobject_t
& head
);
158 // soid claims that it is a head or a snapdir, but its SS_ATTR
160 void set_snapset_missing();
161 void set_info_missing();
162 void set_snapset_corrupted();
163 void set_info_corrupted();
164 // snapset with missing clone
165 void set_clone_missing(snapid_t
);
166 // Clones that are there
167 void set_clone(snapid_t
);
168 // the snapset is not consistent with itself
169 void set_snapset_error();
170 // soid.snap inconsistent with snapset
171 void set_head_mismatch();
172 void set_size_mismatch();
174 void encode(bufferlist
& bl
) const;
175 void decode(bufferlist::iterator
& bp
);
178 WRITE_CLASS_ENCODER(inconsistent_snapset_wrapper
)
181 inline void decode(librados::inconsistent_snapset_t
& snapset
,
182 bufferlist::iterator
& bp
) {
183 reinterpret_cast<inconsistent_snapset_wrapper
&>(snapset
).decode(bp
);
187 struct scrub_ls_arg_t
{
189 uint32_t get_snapsets
;
190 librados::object_id_t start_after
;
192 void encode(bufferlist
& bl
) const;
193 void decode(bufferlist::iterator
& bl
);
196 WRITE_CLASS_ENCODER(scrub_ls_arg_t
);
198 struct scrub_ls_result_t
{
200 std::vector
<bufferlist
> vals
;
201 void encode(bufferlist
& bl
) const;
202 void decode(bufferlist::iterator
& bl
);
205 WRITE_CLASS_ENCODER(scrub_ls_result_t
);