]> git.proxmox.com Git - ceph.git/blob - ceph/src/include/rados/rados_types.hpp
add subtree-ish sources for 12.0.3
[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,
59 OMAP_DIGEST_MISMATCH_OI = 1 << 10,
60 SIZE_MISMATCH_OI = 1 << 11,
61 SHARD_EC_HASH_MISMATCH = 1 << 12,
62 SHARD_EC_SIZE_MISMATCH = 1 << 13,
63 OI_ATTR_MISSING = 1 << 14,
64 OI_ATTR_CORRUPTED = 1 << 15,
65 SS_ATTR_MISSING = 1 << 16,
66 SS_ATTR_CORRUPTED = 1 << 17
67 // When adding more here add to either SHALLOW_ERRORS or DEEP_ERRORS
68 };
69 uint64_t errors = 0;
70 static constexpr uint64_t SHALLOW_ERRORS = SHARD_MISSING|SHARD_STAT_ERR|SIZE_MISMATCH_OI|OI_ATTR_MISSING|OI_ATTR_CORRUPTED|SS_ATTR_MISSING|SS_ATTR_CORRUPTED;
71 static constexpr uint64_t DEEP_ERRORS = SHARD_READ_ERR|DATA_DIGEST_MISMATCH_OI|OMAP_DIGEST_MISMATCH_OI|SHARD_EC_HASH_MISMATCH|SHARD_EC_SIZE_MISMATCH;
72 bool has_shard_missing() const {
73 return errors & SHARD_MISSING;
74 }
75 bool has_stat_error() const {
76 return errors & SHARD_STAT_ERR;
77 }
78 bool has_read_error() const {
79 return errors & SHARD_READ_ERR;
80 }
81 bool has_data_digest_mismatch_oi() const {
82 return errors & DATA_DIGEST_MISMATCH_OI;
83 }
84 bool has_omap_digest_mismatch_oi() const {
85 return errors & OMAP_DIGEST_MISMATCH_OI;
86 }
87 bool has_size_mismatch_oi() const {
88 return errors & SIZE_MISMATCH_OI;
89 }
90 bool has_ec_hash_error() const {
91 return errors & SHARD_EC_HASH_MISMATCH;
92 }
93 bool has_ec_size_error() const {
94 return errors & SHARD_EC_SIZE_MISMATCH;
95 }
96 bool has_oi_attr_missing() const {
97 return errors & OI_ATTR_MISSING;
98 }
99 bool has_oi_attr_corrupted() const {
100 return errors & OI_ATTR_CORRUPTED;
101 }
102 bool has_ss_attr_missing() const {
103 return errors & SS_ATTR_MISSING;
104 }
105 bool has_ss_attr_corrupted() const {
106 return errors & SS_ATTR_CORRUPTED;
107 }
108 bool has_shallow_errors() const {
109 return errors & SHALLOW_ERRORS;
110 }
111 bool has_deep_errors() const {
112 return errors & DEEP_ERRORS;
113 }
114 };
115
116 struct shard_info_t : err_t {
117 std::map<std::string, ceph::bufferlist> attrs;
118 uint64_t size = -1;
119 bool omap_digest_present = false;
120 uint32_t omap_digest = 0;
121 bool data_digest_present = false;
122 uint32_t data_digest = 0;
123 bool selected_oi = false;
124 };
125
126 struct osd_shard_t {
127 int32_t osd;
128 int8_t shard;
129 };
130
131 inline bool operator<(const osd_shard_t &lhs, const osd_shard_t &rhs) {
132 if (lhs.osd < rhs.osd)
133 return true;
134 else if (lhs.osd > rhs.osd)
135 return false;
136 else
137 return lhs.shard < rhs.shard;
138 }
139
140 struct obj_err_t {
141 enum : uint64_t {
142 OBJECT_INFO_INCONSISTENCY = 1 << 1,
143 // XXX: Can an older rados binary work if these bits stay the same?
144 DATA_DIGEST_MISMATCH = 1 << 4,
145 OMAP_DIGEST_MISMATCH = 1 << 5,
146 SIZE_MISMATCH = 1 << 6,
147 ATTR_VALUE_MISMATCH = 1 << 7,
148 ATTR_NAME_MISMATCH = 1 << 8,
149 // When adding more here add to either SHALLOW_ERRORS or DEEP_ERRORS
150 };
151 uint64_t errors = 0;
152 static constexpr uint64_t SHALLOW_ERRORS = OBJECT_INFO_INCONSISTENCY|SIZE_MISMATCH|ATTR_VALUE_MISMATCH|ATTR_NAME_MISMATCH;
153 static constexpr uint64_t DEEP_ERRORS = DATA_DIGEST_MISMATCH|OMAP_DIGEST_MISMATCH;
154 bool has_object_info_inconsistency() const {
155 return errors & OBJECT_INFO_INCONSISTENCY;
156 }
157 bool has_data_digest_mismatch() const {
158 return errors & DATA_DIGEST_MISMATCH;
159 }
160 bool has_omap_digest_mismatch() const {
161 return errors & OMAP_DIGEST_MISMATCH;
162 }
163 bool has_size_mismatch() const {
164 return errors & SIZE_MISMATCH;
165 }
166 bool has_attr_value_mismatch() const {
167 return errors & ATTR_VALUE_MISMATCH;
168 }
169 bool has_attr_name_mismatch() const {
170 return errors & ATTR_NAME_MISMATCH;
171 }
172 bool has_shallow_errors() const {
173 return errors & SHALLOW_ERRORS;
174 }
175 bool has_deep_errors() const {
176 return errors & DEEP_ERRORS;
177 }
178 };
179
180 struct inconsistent_obj_t : obj_err_t {
181 inconsistent_obj_t() = default;
182 inconsistent_obj_t(const object_id_t& object)
183 : object{object}, version(0)
184 {}
185 object_id_t object;
186 uint64_t version; // XXX: Redundant with object info attr
187 std::map<osd_shard_t, shard_info_t> shards;
188 err_t union_shards;
189 };
190
191 struct inconsistent_snapset_t {
192 inconsistent_snapset_t() = default;
193 inconsistent_snapset_t(const object_id_t& head)
194 : object{head}
195 {}
196 enum {
197 SNAPSET_MISSING = 1 << 0,
198 SNAPSET_CORRUPTED = 1 << 1,
199 CLONE_MISSING = 1 << 2,
200 SNAP_MISMATCH = 1 << 3,
201 HEAD_MISMATCH = 1 << 4,
202 HEADLESS_CLONE = 1 << 5,
203 SIZE_MISMATCH = 1 << 6,
204 OI_MISSING = 1 << 7,
205 OI_CORRUPTED = 1 << 8,
206 EXTRA_CLONES = 1 << 9,
207 };
208 uint64_t errors = 0;
209 object_id_t object;
210 // Extra clones
211 std::vector<snap_t> clones;
212 std::vector<snap_t> missing;
213
214 bool ss_attr_missing() const {
215 return errors & SNAPSET_MISSING;
216 }
217 bool ss_attr_corrupted() const {
218 return errors & SNAPSET_CORRUPTED;
219 }
220 bool clone_missing() const {
221 return errors & CLONE_MISSING;
222 }
223 bool snapset_mismatch() const {
224 return errors & SNAP_MISMATCH;
225 }
226 bool head_mismatch() const {
227 return errors & HEAD_MISMATCH;
228 }
229 bool headless() const {
230 return errors & HEADLESS_CLONE;
231 }
232 bool size_mismatch() const {
233 return errors & SIZE_MISMATCH;
234 }
235 bool oi_attr_missing() const {
236 return errors & OI_MISSING;
237 }
238 bool oi_attr_corrupted() const {
239 return errors & OI_CORRUPTED;
240 }
241 bool extra_clones() const {
242 return errors & EXTRA_CLONES;
243 }
244 };
245
246 /**
247 * @var all_nspaces
248 * Pass as nspace argument to IoCtx::set_namespace()
249 * before calling nobjects_begin() to iterate
250 * through all objects in all namespaces.
251 */
252 const std::string all_nspaces(LIBRADOS_ALL_NSPACES);
253
254 }
255 #endif