]> git.proxmox.com Git - ceph.git/blob - ceph/src/include/rados/rados_types.hpp
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / include / rados / rados_types.hpp
1 #ifndef CEPH_RADOS_TYPES_HPP
2 #define CEPH_RADOS_TYPES_HPP
3
4 #include <map>
5 #include <utility>
6 #include <vector>
7 #include <stdint.h>
8 #include <string>
9
10 #include "buffer.h"
11 #include "rados_types.h"
12
13 namespace librados {
14
15 typedef uint64_t snap_t;
16
17 enum {
18 SNAP_HEAD = (uint64_t)(-2),
19 SNAP_DIR = (uint64_t)(-1)
20 };
21
22 struct clone_info_t {
23 snap_t cloneid;
24 std::vector<snap_t> snaps; // ascending
25 std::vector< std::pair<uint64_t,uint64_t> > overlap; // with next newest
26 uint64_t size;
27 clone_info_t() : cloneid(0), size(0) {}
28 };
29
30 struct snap_set_t {
31 std::vector<clone_info_t> clones; // ascending
32 snap_t seq; // newest snapid seen by the object
33 snap_set_t() : seq(0) {}
34 };
35
36 struct object_id_t {
37 std::string name;
38 std::string nspace;
39 std::string locator;
40 snap_t snap = 0;
41 object_id_t() = default;
42 object_id_t(const std::string& name,
43 const std::string& nspace,
44 const std::string& locator,
45 snap_t snap)
46 : name(name),
47 nspace(nspace),
48 locator(locator),
49 snap(snap)
50 {}
51 };
52
53 struct err_t {
54 enum : uint64_t {
55 SHARD_MISSING = 1 << 1,
56 SHARD_STAT_ERR = 1 << 2,
57 SHARD_READ_ERR = 1 << 3,
58 DATA_DIGEST_MISMATCH_OI = 1 << 9, // Old
59 DATA_DIGEST_MISMATCH_INFO = 1 << 9,
60 OMAP_DIGEST_MISMATCH_OI = 1 << 10, // Old
61 OMAP_DIGEST_MISMATCH_INFO = 1 << 10,
62 SIZE_MISMATCH_OI = 1 << 11, // Old
63 SIZE_MISMATCH_INFO = 1 << 11,
64 SHARD_EC_HASH_MISMATCH = 1 << 12,
65 SHARD_EC_SIZE_MISMATCH = 1 << 13,
66 OI_ATTR_MISSING = 1 << 14, // Old
67 INFO_MISSING = 1 << 14,
68 OI_ATTR_CORRUPTED = 1 << 15, // Old
69 INFO_CORRUPTED = 1 << 15,
70 SS_ATTR_MISSING = 1 << 16, // Old
71 SNAPSET_MISSING = 1 << 16,
72 SS_ATTR_CORRUPTED = 1 << 17, // Old
73 SNAPSET_CORRUPTED = 1 << 17,
74 OBJ_SIZE_OI_MISMATCH = 1 << 18, // Old
75 OBJ_SIZE_INFO_MISMATCH = 1 << 18,
76 HINFO_MISSING = 1 << 19,
77 HINFO_CORRUPTED = 1 << 20
78 // When adding more here add to either SHALLOW_ERRORS or DEEP_ERRORS
79 };
80 uint64_t errors = 0;
81 static constexpr uint64_t SHALLOW_ERRORS = SHARD_MISSING|SHARD_STAT_ERR|SIZE_MISMATCH_INFO|INFO_MISSING|INFO_CORRUPTED|SNAPSET_MISSING|SNAPSET_CORRUPTED|OBJ_SIZE_INFO_MISMATCH|HINFO_MISSING|HINFO_CORRUPTED;
82 static constexpr uint64_t DEEP_ERRORS = SHARD_READ_ERR|DATA_DIGEST_MISMATCH_INFO|OMAP_DIGEST_MISMATCH_INFO|SHARD_EC_HASH_MISMATCH|SHARD_EC_SIZE_MISMATCH;
83 bool has_shard_missing() const {
84 return errors & SHARD_MISSING;
85 }
86 bool has_stat_error() const {
87 return errors & SHARD_STAT_ERR;
88 }
89 bool has_read_error() const {
90 return errors & SHARD_READ_ERR;
91 }
92 bool has_data_digest_mismatch_oi() const { // Compatibility
93 return errors & DATA_DIGEST_MISMATCH_OI;
94 }
95 bool has_data_digest_mismatch_info() const {
96 return errors & DATA_DIGEST_MISMATCH_INFO;
97 }
98 bool has_omap_digest_mismatch_oi() const { // Compatibility
99 return errors & OMAP_DIGEST_MISMATCH_OI;
100 }
101 bool has_omap_digest_mismatch_info() const {
102 return errors & OMAP_DIGEST_MISMATCH_INFO;
103 }
104 bool has_size_mismatch_oi() const { // Compatibility
105 return errors & SIZE_MISMATCH_OI;
106 }
107 bool has_size_mismatch_info() const {
108 return errors & SIZE_MISMATCH_INFO;
109 }
110 bool has_ec_hash_error() const {
111 return errors & SHARD_EC_HASH_MISMATCH;
112 }
113 bool has_ec_size_error() const {
114 return errors & SHARD_EC_SIZE_MISMATCH;
115 }
116 bool has_oi_attr_missing() const { // Compatibility
117 return errors & OI_ATTR_MISSING;
118 }
119 bool has_info_missing() const {
120 return errors & INFO_MISSING;
121 }
122 bool has_oi_attr_corrupted() const { // Compatibility
123 return errors & OI_ATTR_CORRUPTED;
124 }
125 bool has_info_corrupted() const {
126 return errors & INFO_CORRUPTED;
127 }
128 bool has_ss_attr_missing() const { // Compatibility
129 return errors & SS_ATTR_MISSING;
130 }
131 bool has_snapset_missing() const {
132 return errors & SNAPSET_MISSING;
133 }
134 bool has_ss_attr_corrupted() const { // Compatibility
135 return errors & SS_ATTR_CORRUPTED;
136 }
137 bool has_snapset_corrupted() const {
138 return errors & SNAPSET_CORRUPTED;
139 }
140 bool has_shallow_errors() const {
141 return errors & SHALLOW_ERRORS;
142 }
143 bool has_deep_errors() const {
144 return errors & DEEP_ERRORS;
145 }
146 bool has_obj_size_oi_mismatch() const { // Compatibility
147 return errors & OBJ_SIZE_OI_MISMATCH;
148 }
149 bool has_obj_size_info_mismatch() const {
150 return errors & OBJ_SIZE_INFO_MISMATCH;
151 }
152 bool has_hinfo_missing() const {
153 return errors & HINFO_MISSING;
154 }
155 bool has_hinfo_corrupted() const {
156 return errors & HINFO_CORRUPTED;
157 }
158 };
159
160 struct shard_info_t : err_t {
161 std::map<std::string, ceph::bufferlist> attrs;
162 uint64_t size = -1;
163 bool omap_digest_present = false;
164 uint32_t omap_digest = 0;
165 bool data_digest_present = false;
166 uint32_t data_digest = 0;
167 bool selected_oi = false;
168 bool primary = false;
169 };
170
171 struct osd_shard_t {
172 int32_t osd;
173 int8_t shard;
174 };
175
176 inline bool operator<(const osd_shard_t &lhs, const osd_shard_t &rhs) {
177 if (lhs.osd < rhs.osd)
178 return true;
179 else if (lhs.osd > rhs.osd)
180 return false;
181 else
182 return lhs.shard < rhs.shard;
183 }
184
185 struct obj_err_t {
186 enum : uint64_t {
187 OBJECT_INFO_INCONSISTENCY = 1 << 1,
188 // XXX: Can an older rados binary work if these bits stay the same?
189 DATA_DIGEST_MISMATCH = 1 << 4,
190 OMAP_DIGEST_MISMATCH = 1 << 5,
191 SIZE_MISMATCH = 1 << 6,
192 ATTR_VALUE_MISMATCH = 1 << 7,
193 ATTR_NAME_MISMATCH = 1 << 8,
194 SNAPSET_INCONSISTENCY = 1 << 9,
195 HINFO_INCONSISTENCY = 1 << 10,
196 // When adding more here add to either SHALLOW_ERRORS or DEEP_ERRORS
197 };
198 uint64_t errors = 0;
199 static constexpr uint64_t SHALLOW_ERRORS = OBJECT_INFO_INCONSISTENCY|SIZE_MISMATCH|ATTR_VALUE_MISMATCH|ATTR_NAME_MISMATCH|SNAPSET_INCONSISTENCY|HINFO_INCONSISTENCY;
200 static constexpr uint64_t DEEP_ERRORS = DATA_DIGEST_MISMATCH|OMAP_DIGEST_MISMATCH;
201 bool has_object_info_inconsistency() const {
202 return errors & OBJECT_INFO_INCONSISTENCY;
203 }
204 bool has_data_digest_mismatch() const {
205 return errors & DATA_DIGEST_MISMATCH;
206 }
207 bool has_omap_digest_mismatch() const {
208 return errors & OMAP_DIGEST_MISMATCH;
209 }
210 bool has_size_mismatch() const {
211 return errors & SIZE_MISMATCH;
212 }
213 bool has_attr_value_mismatch() const {
214 return errors & ATTR_VALUE_MISMATCH;
215 }
216 bool has_attr_name_mismatch() const {
217 return errors & ATTR_NAME_MISMATCH;
218 }
219 bool has_shallow_errors() const {
220 return errors & SHALLOW_ERRORS;
221 }
222 bool has_deep_errors() const {
223 return errors & DEEP_ERRORS;
224 }
225 bool has_snapset_inconsistency() const {
226 return errors & SNAPSET_INCONSISTENCY;
227 }
228 bool has_hinfo_inconsistency() const {
229 return errors & HINFO_INCONSISTENCY;
230 }
231 };
232
233 struct inconsistent_obj_t : obj_err_t {
234 inconsistent_obj_t() = default;
235 inconsistent_obj_t(const object_id_t& object)
236 : object{object}, version(0)
237 {}
238 object_id_t object;
239 uint64_t version; // XXX: Redundant with object info attr
240 std::map<osd_shard_t, shard_info_t> shards;
241 err_t union_shards;
242 };
243
244 struct inconsistent_snapset_t {
245 inconsistent_snapset_t() = default;
246 inconsistent_snapset_t(const object_id_t& head)
247 : object{head}
248 {}
249 enum {
250 SNAPSET_MISSING = 1 << 0,
251 SNAPSET_CORRUPTED = 1 << 1,
252 CLONE_MISSING = 1 << 2,
253 SNAP_ERROR = 1 << 3,
254 HEAD_MISMATCH = 1 << 4, // Unused
255 HEADLESS_CLONE = 1 << 5,
256 SIZE_MISMATCH = 1 << 6,
257 OI_MISSING = 1 << 7, // Old
258 INFO_MISSING = 1 << 7,
259 OI_CORRUPTED = 1 << 8, // Old
260 INFO_CORRUPTED = 1 << 8,
261 EXTRA_CLONES = 1 << 9,
262 };
263 uint64_t errors = 0;
264 object_id_t object;
265 // Extra clones
266 std::vector<snap_t> clones;
267 std::vector<snap_t> missing;
268 ceph::bufferlist ss_bl;
269
270 bool ss_attr_missing() const { // Compatibility
271 return errors & SNAPSET_MISSING;
272 }
273 bool snapset_missing() const {
274 return errors & SNAPSET_MISSING;
275 }
276 bool ss_attr_corrupted() const { // Compatibility
277 return errors & SNAPSET_CORRUPTED;
278 }
279 bool snapset_corrupted() const {
280 return errors & SNAPSET_CORRUPTED;
281 }
282 bool clone_missing() const {
283 return errors & CLONE_MISSING;
284 }
285 bool snapset_mismatch() const { // Compatibility
286 return errors & SNAP_ERROR;
287 }
288 bool snapset_error() const {
289 return errors & SNAP_ERROR;
290 }
291 bool head_mismatch() const { // Compatibility
292 return false;
293 }
294 bool headless() const {
295 return errors & HEADLESS_CLONE;
296 }
297 bool size_mismatch() const {
298 return errors & SIZE_MISMATCH;
299 }
300 bool oi_attr_missing() const { // Compatibility
301 return errors & OI_MISSING;
302 }
303 bool info_missing() const {
304 return errors & INFO_MISSING;
305 }
306 bool oi_attr_corrupted() const { // Compatibility
307 return errors & OI_CORRUPTED;
308 }
309 bool info_corrupted() const {
310 return errors & INFO_CORRUPTED;
311 }
312 bool extra_clones() const {
313 return errors & EXTRA_CLONES;
314 }
315 };
316
317 /**
318 * @var all_nspaces
319 * Pass as nspace argument to IoCtx::set_namespace()
320 * before calling nobjects_begin() to iterate
321 * through all objects in all namespaces.
322 */
323 const std::string all_nspaces(LIBRADOS_ALL_NSPACES);
324
325 }
326 #endif