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 explicit object_id_wrapper(const hobject_t
& hoid
)
13 : object_id_t
{hoid
.oid
.name
, hoid
.nspace
, hoid
.get_key(), hoid
.snap
}
15 void encode(ceph::buffer::list
& bl
) const;
16 void decode(ceph::buffer::list::const_iterator
& bl
);
19 WRITE_CLASS_ENCODER(object_id_wrapper
)
22 inline void decode(object_id_t
& obj
, ceph::buffer::list::const_iterator
& bp
) {
23 reinterpret_cast<object_id_wrapper
&>(obj
).decode(bp
);
27 struct osd_shard_wrapper
: public librados::osd_shard_t
{
28 void encode(ceph::buffer::list
& bl
) const;
29 void decode(ceph::buffer::list::const_iterator
& bp
);
32 WRITE_CLASS_ENCODER(osd_shard_wrapper
)
35 inline void decode(librados::osd_shard_t
& shard
, ceph::buffer::list::const_iterator
& bp
) {
36 reinterpret_cast<osd_shard_wrapper
&>(shard
).decode(bp
);
40 struct shard_info_wrapper
: public librados::shard_info_t
{
42 shard_info_wrapper() = default;
43 explicit shard_info_wrapper(const ScrubMap::object
& object
) {
46 void set_object(const ScrubMap::object
& object
);
48 errors
|= err_t::SHARD_MISSING
;
50 void set_omap_digest_mismatch_info() {
51 errors
|= err_t::OMAP_DIGEST_MISMATCH_INFO
;
53 void set_size_mismatch_info() {
54 errors
|= err_t::SIZE_MISMATCH_INFO
;
56 void set_data_digest_mismatch_info() {
57 errors
|= err_t::DATA_DIGEST_MISMATCH_INFO
;
59 void set_read_error() {
60 errors
|= err_t::SHARD_READ_ERR
;
62 void set_stat_error() {
63 errors
|= err_t::SHARD_STAT_ERR
;
65 void set_ec_hash_mismatch() {
66 errors
|= err_t::SHARD_EC_HASH_MISMATCH
;
68 void set_ec_size_mismatch() {
69 errors
|= err_t::SHARD_EC_SIZE_MISMATCH
;
71 void set_info_missing() {
72 errors
|= err_t::INFO_MISSING
;
74 void set_info_corrupted() {
75 errors
|= err_t::INFO_CORRUPTED
;
77 void set_snapset_missing() {
78 errors
|= err_t::SNAPSET_MISSING
;
80 void set_snapset_corrupted() {
81 errors
|= err_t::SNAPSET_CORRUPTED
;
83 void set_obj_size_info_mismatch() {
84 errors
|= err_t::OBJ_SIZE_INFO_MISMATCH
;
86 void set_hinfo_missing() {
87 errors
|= err_t::HINFO_MISSING
;
89 void set_hinfo_corrupted() {
90 errors
|= err_t::HINFO_CORRUPTED
;
92 bool only_data_digest_mismatch_info() const {
93 return errors
== err_t::DATA_DIGEST_MISMATCH_INFO
;
95 void clear_data_digest_mismatch_info() {
96 errors
&= ~err_t::DATA_DIGEST_MISMATCH_INFO
;
98 void encode(ceph::buffer::list
& bl
) const;
99 void decode(ceph::buffer::list::const_iterator
& bp
);
102 WRITE_CLASS_ENCODER(shard_info_wrapper
)
105 inline void decode(librados::shard_info_t
& shard
,
106 ceph::buffer::list::const_iterator
& bp
) {
107 reinterpret_cast<shard_info_wrapper
&>(shard
).decode(bp
);
111 struct inconsistent_obj_wrapper
: librados::inconsistent_obj_t
{
112 explicit inconsistent_obj_wrapper(const hobject_t
& hoid
);
114 void set_object_info_inconsistency() {
115 errors
|= obj_err_t::OBJECT_INFO_INCONSISTENCY
;
117 void set_omap_digest_mismatch() {
118 errors
|= obj_err_t::OMAP_DIGEST_MISMATCH
;
120 void set_data_digest_mismatch() {
121 errors
|= obj_err_t::DATA_DIGEST_MISMATCH
;
123 void set_size_mismatch() {
124 errors
|= obj_err_t::SIZE_MISMATCH
;
126 void set_attr_value_mismatch() {
127 errors
|= obj_err_t::ATTR_VALUE_MISMATCH
;
129 void set_attr_name_mismatch() {
130 errors
|= obj_err_t::ATTR_NAME_MISMATCH
;
132 void set_snapset_inconsistency() {
133 errors
|= obj_err_t::SNAPSET_INCONSISTENCY
;
135 void set_hinfo_inconsistency() {
136 errors
|= obj_err_t::HINFO_INCONSISTENCY
;
138 void set_size_too_large() {
139 errors
|= obj_err_t::SIZE_TOO_LARGE
;
141 void add_shard(const pg_shard_t
& pgs
, const shard_info_wrapper
& shard
);
142 void set_auth_missing(const hobject_t
& hoid
,
143 const std::map
<pg_shard_t
, ScrubMap
*>&,
144 std::map
<pg_shard_t
, shard_info_wrapper
>&,
145 int &shallow_errors
, int &deep_errors
,
146 const pg_shard_t
&primary
);
147 void set_version(uint64_t ver
) { version
= ver
; }
148 void encode(ceph::buffer::list
& bl
) const;
149 void decode(ceph::buffer::list::const_iterator
& bp
);
152 WRITE_CLASS_ENCODER(inconsistent_obj_wrapper
)
154 inline void decode(librados::inconsistent_obj_t
& obj
,
155 ceph::buffer::list::const_iterator
& bp
) {
156 reinterpret_cast<inconsistent_obj_wrapper
&>(obj
).decode(bp
);
159 struct inconsistent_snapset_wrapper
: public librados::inconsistent_snapset_t
{
160 inconsistent_snapset_wrapper() = default;
161 explicit inconsistent_snapset_wrapper(const hobject_t
& head
);
163 // soid claims that it is a head or a snapdir, but its SS_ATTR
165 void set_snapset_missing();
166 void set_info_missing();
167 void set_snapset_corrupted();
168 void set_info_corrupted();
169 // snapset with missing clone
170 void set_clone_missing(snapid_t
);
171 // Clones that are there
172 void set_clone(snapid_t
);
173 // the snapset is not consistent with itself
174 void set_snapset_error();
175 void set_size_mismatch();
177 void encode(ceph::buffer::list
& bl
) const;
178 void decode(ceph::buffer::list::const_iterator
& bp
);
181 WRITE_CLASS_ENCODER(inconsistent_snapset_wrapper
)
184 inline void decode(librados::inconsistent_snapset_t
& snapset
,
185 ceph::buffer::list::const_iterator
& bp
) {
186 reinterpret_cast<inconsistent_snapset_wrapper
&>(snapset
).decode(bp
);
190 struct scrub_ls_arg_t
{
192 uint32_t get_snapsets
;
193 librados::object_id_t start_after
;
195 void encode(ceph::buffer::list
& bl
) const;
196 void decode(ceph::buffer::list::const_iterator
& bl
);
199 WRITE_CLASS_ENCODER(scrub_ls_arg_t
);
201 struct scrub_ls_result_t
{
203 std::vector
<ceph::buffer::list
> vals
;
204 void encode(ceph::buffer::list
& bl
) const;
205 void decode(ceph::buffer::list::const_iterator
& bl
);
208 WRITE_CLASS_ENCODER(scrub_ls_result_t
);