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