Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / common / scrub_types.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #ifndef CEPH_SCRUB_TYPES_H
5 #define CEPH_SCRUB_TYPES_H
6
7 #include "osd/osd_types.h"
8
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}
14   {}
15   void encode(bufferlist& bl) const;
16   void decode(bufferlist::iterator& bl);
17 };
18
19 WRITE_CLASS_ENCODER(object_id_wrapper)
20
21 inline void decode(librados::object_id_t& obj, bufferlist::iterator& bp) {
22   reinterpret_cast<object_id_wrapper&>(obj).decode(bp);
23 }
24
25 struct osd_shard_wrapper : public librados::osd_shard_t {
26   void encode(bufferlist& bl) const;
27   void decode(bufferlist::iterator& bp);
28 };
29
30 WRITE_CLASS_ENCODER(osd_shard_wrapper)
31
32 namespace librados {
33   inline void decode(librados::osd_shard_t& shard, bufferlist::iterator& bp) {
34     reinterpret_cast<osd_shard_wrapper&>(shard).decode(bp);
35   }
36 }
37
38 struct shard_info_wrapper : public librados::shard_info_t {
39 public:
40   shard_info_wrapper() = default;
41   shard_info_wrapper(const ScrubMap::object& object) {
42     set_object(object);
43   }
44   void set_object(const ScrubMap::object& object);
45   void set_missing() {
46     errors |= err_t::SHARD_MISSING;
47   }
48   void set_omap_digest_mismatch_oi() {
49     errors |= err_t::OMAP_DIGEST_MISMATCH_OI;
50   }
51   void set_size_mismatch_oi() {
52     errors |= err_t::SIZE_MISMATCH_OI;
53   }
54   void set_data_digest_mismatch_oi() {
55     errors |= err_t::DATA_DIGEST_MISMATCH_OI;
56   }
57   void set_read_error() {
58     errors |= err_t::SHARD_READ_ERR;
59   }
60   void set_stat_error() {
61     errors |= err_t::SHARD_STAT_ERR;
62   }
63   void set_ec_hash_mismatch() {
64     errors |= err_t::SHARD_EC_HASH_MISMATCH;
65   }
66   void set_ec_size_mismatch() {
67     errors |= err_t::SHARD_EC_SIZE_MISMATCH;
68   }
69   void set_oi_attr_missing() {
70     errors |= err_t::OI_ATTR_MISSING;
71   }
72   void set_oi_attr_corrupted() {
73     errors |= err_t::OI_ATTR_CORRUPTED;
74   }
75   void set_ss_attr_missing() {
76     errors |= err_t::SS_ATTR_MISSING;
77   }
78   void set_ss_attr_corrupted() {
79     errors |= err_t::SS_ATTR_CORRUPTED;
80   }
81   void set_obj_size_oi_mismatch() {
82     errors |= err_t::OBJ_SIZE_OI_MISMATCH;
83   }
84   void encode(bufferlist& bl) const;
85   void decode(bufferlist::iterator& bp);
86 };
87
88 WRITE_CLASS_ENCODER(shard_info_wrapper)
89
90 namespace librados {
91   inline void decode(librados::shard_info_t& shard,
92                      bufferlist::iterator& bp) {
93     reinterpret_cast<shard_info_wrapper&>(shard).decode(bp);
94   }
95 }
96
97 struct inconsistent_obj_wrapper : librados::inconsistent_obj_t {
98   inconsistent_obj_wrapper(const hobject_t& hoid);
99
100   void set_object_info_inconsistency() {
101     errors |= obj_err_t::OBJECT_INFO_INCONSISTENCY;
102   }
103   void set_omap_digest_mismatch() {
104     errors |= obj_err_t::OMAP_DIGEST_MISMATCH;
105   }
106   void set_data_digest_mismatch() {
107     errors |= obj_err_t::DATA_DIGEST_MISMATCH;
108   }
109   void set_size_mismatch() {
110     errors |= obj_err_t::SIZE_MISMATCH;
111   }
112   void set_attr_value_mismatch() {
113     errors |= obj_err_t::ATTR_VALUE_MISMATCH;
114   }
115   void set_attr_name_mismatch() {
116     errors |= obj_err_t::ATTR_NAME_MISMATCH;
117   }
118   void add_shard(const pg_shard_t& pgs, const shard_info_wrapper& shard);
119   void set_auth_missing(const hobject_t& hoid,
120                         const map<pg_shard_t, ScrubMap*>&,
121                         map<pg_shard_t, shard_info_wrapper>&,
122                         int &shallow_errors, int &deep_errors,
123                         const pg_shard_t &primary);
124   void set_version(uint64_t ver) { version = ver; }
125   void encode(bufferlist& bl) const;
126   void decode(bufferlist::iterator& bp);
127 };
128
129 WRITE_CLASS_ENCODER(inconsistent_obj_wrapper)
130
131 inline void decode(librados::inconsistent_obj_t& obj,
132                    bufferlist::iterator& bp) {
133   reinterpret_cast<inconsistent_obj_wrapper&>(obj).decode(bp);
134 }
135
136 struct inconsistent_snapset_wrapper : public librados::inconsistent_snapset_t {
137   inconsistent_snapset_wrapper() = default;
138   inconsistent_snapset_wrapper(const hobject_t& head);
139   void set_headless();
140   // soid claims that it is a head or a snapdir, but its SS_ATTR
141   // is missing.
142   void set_ss_attr_missing();
143   void set_oi_attr_missing();
144   void set_ss_attr_corrupted();
145   void set_oi_attr_corrupted();
146   // snapset with missing clone
147   void set_clone_missing(snapid_t);
148   // Clones that are there
149   void set_clone(snapid_t);
150   // the snapset is not consistent with itself
151   void set_snapset_mismatch();
152   // soid.snap inconsistent with snapset
153   void set_head_mismatch();
154   void set_size_mismatch();
155
156   void encode(bufferlist& bl) const;
157   void decode(bufferlist::iterator& bp);
158 };
159
160 WRITE_CLASS_ENCODER(inconsistent_snapset_wrapper)
161
162 namespace librados {
163   inline void decode(librados::inconsistent_snapset_t& snapset,
164                      bufferlist::iterator& bp) {
165     reinterpret_cast<inconsistent_snapset_wrapper&>(snapset).decode(bp);
166   }
167 }
168
169 struct scrub_ls_arg_t {
170   uint32_t interval;
171   uint32_t get_snapsets;
172   librados::object_id_t start_after;
173   uint64_t max_return;
174   void encode(bufferlist& bl) const;
175   void decode(bufferlist::iterator& bl);
176 };
177
178 WRITE_CLASS_ENCODER(scrub_ls_arg_t);
179
180 struct scrub_ls_result_t {
181   epoch_t interval;
182   std::vector<bufferlist> vals;
183   void encode(bufferlist& bl) const;
184   void decode(bufferlist::iterator& bl);
185 };
186
187 WRITE_CLASS_ENCODER(scrub_ls_result_t);
188
189 #endif