DAOS API (v2.1 - dev)
Loading...
Searching...
No Matches
daos_obj.h
1
6#ifndef __DAOS_OBJ_H__
7#define __DAOS_OBJ_H__
8
9#if defined(__cplusplus)
10extern "C" {
11#endif
12
13#include <daos_types.h>
14#include <daos_event.h>
15#include <daos_obj_class.h>
16
17#define DAOS_OBJ_NIL ((daos_obj_id_t){0})
18
20#define OID_FMT_INTR_BITS 32
22#define OID_FMT_TYPE_BITS 8
24#define OID_FMT_CLASS_BITS 8
26#define OID_FMT_META_BITS 16
27
29#define OID_FMT_TYPE_SHIFT (64 - OID_FMT_TYPE_BITS)
31#define OID_FMT_CLASS_SHIFT (OID_FMT_TYPE_SHIFT - OID_FMT_CLASS_BITS)
33#define OID_FMT_META_SHIFT (OID_FMT_CLASS_SHIFT - OID_FMT_META_BITS)
34
36#define OID_FMT_TYPE_MAX ((1ULL << OID_FMT_TYPE_BITS) - 1)
38#define OID_FMT_CLASS_MAX ((1ULL << OID_FMT_CLASS_BITS) - 1)
40#define OID_FMT_META_MAX ((1ULL << OID_FMT_META_BITS) - 1)
41
43#define OID_FMT_TYPE_MASK (OID_FMT_TYPE_MAX << OID_FMT_TYPE_SHIFT)
45#define OID_FMT_CLASS_MASK (OID_FMT_CLASS_MAX << OID_FMT_CLASS_SHIFT)
47#define OID_FMT_META_MASK (OID_FMT_META_MAX << OID_FMT_META_SHIFT)
48
50enum daos_otype_t {
52 DAOS_OT_MULTI_HASHED = 0,
53
57 DAOS_OT_OIT = 1,
58
60 DAOS_OT_DKEY_UINT64 = 2,
61
63 DAOS_OT_AKEY_UINT64 = 3,
64
66 DAOS_OT_MULTI_UINT64 = 4,
67
69 DAOS_OT_DKEY_LEXICAL = 5,
70
72 DAOS_OT_AKEY_LEXICAL = 6,
73
75 DAOS_OT_MULTI_LEXICAL = 7,
76
78 DAOS_OT_KV_HASHED = 8,
79
81 DAOS_OT_KV_UINT64 = 9,
82
84 DAOS_OT_KV_LEXICAL = 10,
85
87 DAOS_OT_ARRAY = 11,
88
90 DAOS_OT_ARRAY_ATTR = 12,
91
93 DAOS_OT_ARRAY_BYTE = 13,
94
95 DAOS_OT_MAX = 13,
105};
106
107static inline bool
108daos_otype_t_is_valid(enum daos_otype_t type)
109{
110 return type <= DAOS_OT_MAX;
111}
112
113static inline enum daos_otype_t
114daos_obj_id2type(daos_obj_id_t oid)
115{
116 uint64_t type;
117
118 type = (oid.hi & OID_FMT_TYPE_MASK) >> OID_FMT_TYPE_SHIFT;
119
120 return (enum daos_otype_t)type;
121}
122
123static inline bool
124daos_is_dkey_lexical_type(enum daos_otype_t type)
125{
126 switch (type) {
127 case DAOS_OT_DKEY_LEXICAL:
128 case DAOS_OT_MULTI_LEXICAL:
129 case DAOS_OT_KV_LEXICAL:
130 return true;
131 default:
132 return false;
133
134 }
135}
136
137static inline bool
138daos_is_dkey_lexical(daos_obj_id_t oid)
139{
140 return daos_is_dkey_lexical_type(daos_obj_id2type(oid));
141}
142
143static inline bool
144daos_is_akey_lexical_type(enum daos_otype_t type)
145{
146 switch (type) {
147 case DAOS_OT_AKEY_LEXICAL:
148 case DAOS_OT_MULTI_LEXICAL:
149 return true;
150 default:
151 return false;
152
153 }
154}
155
156static inline bool
157daos_is_akey_lexical(daos_obj_id_t oid)
158{
159 return daos_is_akey_lexical_type(daos_obj_id2type(oid));
160}
161
162static inline bool
163daos_is_dkey_uint64_type(enum daos_otype_t type)
164{
165 switch (type) {
166 case DAOS_OT_MULTI_UINT64:
167 case DAOS_OT_DKEY_UINT64:
168 case DAOS_OT_KV_UINT64:
169 case DAOS_OT_ARRAY:
170 case DAOS_OT_ARRAY_ATTR:
171 case DAOS_OT_ARRAY_BYTE:
172 return true;
173 default:
174 return false;
175
176 }
177}
178
179static inline bool
180daos_is_dkey_uint64(daos_obj_id_t oid)
181{
182 return daos_is_dkey_uint64_type(daos_obj_id2type(oid));
183}
184
185static inline bool
186daos_is_akey_uint64_type(enum daos_otype_t type)
187{
188 switch (type) {
189 case DAOS_OT_MULTI_UINT64:
190 case DAOS_OT_AKEY_UINT64:
191 return true;
192 default:
193 return false;
194
195 }
196}
197
198static inline bool
199daos_is_akey_uint64(daos_obj_id_t oid)
200{
201 return daos_is_akey_uint64_type(daos_obj_id2type(oid));
202}
203
204static inline bool
205daos_is_array_type(enum daos_otype_t type)
206{
207 switch (type) {
208 case DAOS_OT_ARRAY:
209 case DAOS_OT_ARRAY_ATTR:
210 case DAOS_OT_ARRAY_BYTE:
211 return true;
212 default:
213 return false;
214
215 }
216}
217
218static inline bool
219daos_is_array(daos_obj_id_t oid)
220{
221 enum daos_otype_t type = daos_obj_id2type(oid);
222
223 return daos_is_array_type(type);
224}
225
226static inline bool
227daos_is_kv_type(enum daos_otype_t type)
228{
229 switch (type) {
230 case DAOS_OT_KV_HASHED:
231 case DAOS_OT_KV_UINT64:
232 case DAOS_OT_KV_LEXICAL:
233 return true;
234 default:
235 return false;
236
237 }
238}
239
240static inline bool
241daos_is_kv(daos_obj_id_t oid)
242{
243 enum daos_otype_t type = daos_obj_id2type(oid);
244
245 return daos_is_kv_type(type);
246}
247
249#define IO_FLAGS_COND_BITS 8
250
251enum {
252 /* Conditional Op: Punch key if it exists, fail otherwise */
253 DAOS_COND_PUNCH = (1 << 0),
254 /* Conditional Op: Insert dkey if it doesn't exist, fail otherwise */
255 DAOS_COND_DKEY_INSERT = (1 << 1),
256 /* Conditional Op: Update dkey if it exists, fail otherwise */
257 DAOS_COND_DKEY_UPDATE = (1 << 2),
258 /* Conditional Op: Fetch dkey if it exists, fail otherwise */
259 DAOS_COND_DKEY_FETCH = (1 << 3),
260 /* Conditional Op: Insert akey if it doesn't exist, fail otherwise */
261 DAOS_COND_AKEY_INSERT = (1 << 4),
262 /* Conditional Op: Update akey if it exists, fail otherwise */
263 DAOS_COND_AKEY_UPDATE = (1 << 5),
264 /* Conditional Op: Fetch akey if it exists, fail otherwise */
265 DAOS_COND_AKEY_FETCH = (1 << 6),
266 /* Indication of per akey conditional ops. If set, the global
267 * flag should not have any akey conditional ops specified. The
268 * per akey flags will be read from the iod_flags field.
269 */
270 DAOS_COND_PER_AKEY = (1 << 7),
272 DAOS_COND_MASK = ((1 << IO_FLAGS_COND_BITS) - 1),
273};
274
281 d_rank_t oa_rank;
284};
285
287enum {
289 DAOS_OO_RO = (1 << 1),
291 DAOS_OO_RW = (1 << 2),
293 DAOS_OO_EXCL = (1 << 3),
295 DAOS_OO_IO_RAND = (1 << 4),
297 DAOS_OO_IO_SEQ = (1 << 5),
298};
299
321typedef struct {
323 uint64_t rx_idx;
329 uint64_t rx_nr;
331
333typedef enum {
335 DAOS_IOD_NONE = 0,
337 DAOS_IOD_SINGLE = 1,
339 DAOS_IOD_ARRAY = 2,
340} daos_iod_type_t;
341
347typedef struct {
349 daos_key_t iod_name;
361 daos_iod_type_t iod_type;
363 daos_size_t iod_size;
367 uint64_t iod_flags;
372 uint32_t iod_nr;
379} daos_iod_t;
380
396#define DAOS_IOMF_DETAIL (0x1U)
435
437enum {
439 DAOS_REC_ANY = 0,
440};
441
443enum {
445 DAOS_GET_MAX = (1 << 0),
447 DAOS_GET_MIN = (1 << 1),
449 DAOS_GET_DKEY = (1 << 2),
451 DAOS_GET_AKEY = (1 << 3),
453 DAOS_GET_RECX = (1 << 4),
454};
455
460typedef struct {
462 daos_size_t kd_key_len;
467 uint32_t kd_val_type;
469
470static uint32_t
471daos_obj_id2ord(daos_obj_id_t oid)
472{
473 return (oid.hi & OID_FMT_CLASS_MASK) >> OID_FMT_CLASS_SHIFT;
474}
475
476static inline daos_oclass_id_t
477daos_obj_id2class(daos_obj_id_t oid)
478{
479 enum daos_obj_redun ord;
480 uint32_t nr_grps;
481
482 ord = daos_obj_id2ord(oid);
483 nr_grps = (oid.hi & OID_FMT_META_MASK) >> OID_FMT_META_SHIFT;
484
485 return (ord << OC_REDUN_SHIFT) | nr_grps;
486}
487
488static inline bool
489daos_obj_id_is_nil(daos_obj_id_t oid)
490{
491 return oid.hi == 0 && oid.lo == 0;
492}
493
494#define DAOS_OCH_RDD_BITS 4
495#define DAOS_OCH_SHD_BITS 6
496#define DAOS_OCH_RDD_SHIFT 0
497#define DAOS_OCH_SHD_SHIFT DAOS_OCH_RDD_BITS
498#define DAOS_OCH_RDD_MAX_VAL ((1ULL << DAOS_OCH_RDD_BITS) - 1)
499#define DAOS_OCH_SHD_MAX_VAL ((1ULL << DAOS_OCH_SHD_BITS) - 1)
500#define DAOS_OCH_RDD_MASK (DAOS_OCH_RDD_MAX_VAL << DAOS_OCH_RDD_SHIFT)
501#define DAOS_OCH_SHD_MASK (DAOS_OCH_SHD_MAX_VAL << DAOS_OCH_SHD_SHIFT)
502
504enum {
506 DAOS_OCH_RDD_DEF = (1 << 0),
507 DAOS_OCH_RDD_NO = (1 << 1),
508 DAOS_OCH_RDD_RP = (1 << 2),
509 DAOS_OCH_RDD_EC = (1 << 3),
511 DAOS_OCH_SHD_DEF = (1 << 4),
514 DAOS_OCH_SHD_TINY = (1 << 5),
515 DAOS_OCH_SHD_REG = (1 << 6),
516 DAOS_OCH_SHD_HI = (1 << 7),
517 DAOS_OCH_SHD_EXT = (1 << 8),
518 DAOS_OCH_SHD_MAX = (1 << 9),
519};
520
547int
548daos_obj_generate_oid(daos_handle_t coh, daos_obj_id_t *oid,
549 enum daos_otype_t type, daos_oclass_id_t cid,
550 daos_oclass_hints_t hints, uint32_t args);
551
573int
574daos_obj_open(daos_handle_t coh, daos_obj_id_t oid, unsigned int mode,
575 daos_handle_t *oh, daos_event_t *ev);
576
589int
590daos_obj_close(daos_handle_t oh, daos_event_t *ev);
591
613int
614daos_obj_punch(daos_handle_t oh, daos_handle_t th, uint64_t flags,
615 daos_event_t *ev);
616
640int
641daos_obj_punch_dkeys(daos_handle_t oh, daos_handle_t th, uint64_t flags,
642 unsigned int nr, daos_key_t *dkeys, daos_event_t *ev);
643
668int
669daos_obj_punch_akeys(daos_handle_t oh, daos_handle_t th, uint64_t flags,
670 daos_key_t *dkey, unsigned int nr, daos_key_t *akeys,
671 daos_event_t *ev);
672
690int
691daos_obj_query(daos_handle_t oh, struct daos_obj_attr *oa, d_rank_list_t *ranks,
692 daos_event_t *ev);
693
694/*
695 * Object I/O API
696 */
697
756int
757daos_obj_fetch(daos_handle_t oh, daos_handle_t th, uint64_t flags,
758 daos_key_t *dkey, unsigned int nr, daos_iod_t *iods,
759 d_sg_list_t *sgls, daos_iom_t *ioms, daos_event_t *ev);
760
809int
810daos_obj_update(daos_handle_t oh, daos_handle_t th, uint64_t flags,
811 daos_key_t *dkey, unsigned int nr, daos_iod_t *iods,
812 d_sg_list_t *sgls, daos_event_t *ev);
813
859int
860daos_obj_list_dkey(daos_handle_t oh, daos_handle_t th, uint32_t *nr,
861 daos_key_desc_t *kds, d_sg_list_t *sgl,
862 daos_anchor_t *anchor, daos_event_t *ev);
863
910int
911daos_obj_list_akey(daos_handle_t oh, daos_handle_t th, daos_key_t *dkey,
912 uint32_t *nr, daos_key_desc_t *kds, d_sg_list_t *sgl,
913 daos_anchor_t *anchor, daos_event_t *ev);
914
963int
964daos_obj_list_recx(daos_handle_t oh, daos_handle_t th, daos_key_t *dkey,
965 daos_key_t *akey, daos_size_t *size, uint32_t *nr,
966 daos_recx_t *recxs, daos_epoch_range_t *eprs,
967 daos_anchor_t *anchor, bool incr_order,
968 daos_event_t *ev);
969
1013int
1014daos_obj_query_key(daos_handle_t oh, daos_handle_t th, uint64_t flags,
1015 daos_key_t *dkey, daos_key_t *akey, daos_recx_t *recx,
1016 daos_event_t *ev);
1017
1031int
1032daos_obj_verify(daos_handle_t coh, daos_obj_id_t oid, daos_epoch_t epoch);
1033
1057int
1058daos_obj_anchor_split(daos_handle_t oh, uint32_t *nr, daos_anchor_t *anchors);
1059
1075int
1076daos_obj_anchor_set(daos_handle_t oh, uint32_t index, daos_anchor_t *anchor);
1077
1093int
1094daos_oit_open(daos_handle_t coh, daos_epoch_t epoch,
1095 daos_handle_t *oh, daos_event_t *ev);
1096
1109int
1110daos_oit_close(daos_handle_t oh, daos_event_t *ev);
1111
1131int
1132daos_oit_list(daos_handle_t oh, daos_obj_id_t *oids, uint32_t *oids_nr,
1133 daos_anchor_t *anchor, daos_event_t *ev);
1134
1139typedef uint16_t daos_ofeat_t;
1140int
1141daos_obj_generate_oid1(daos_handle_t coh, daos_obj_id_t *oid,
1142 daos_ofeat_t type, daos_oclass_id_t cid,
1143 daos_oclass_hints_t hints, uint32_t args);
1144int
1145daos_obj_generate_oid2(daos_handle_t coh, daos_obj_id_t *oid,
1146 enum daos_otype_t type, daos_oclass_id_t cid,
1147 daos_oclass_hints_t hints, uint32_t args);
1148
1152#define DAOS_OF_DKEY_UINT64 ((daos_ofeat_t)(1 << 0))
1154#define DAOS_OF_DKEY_LEXICAL ((daos_ofeat_t)(1 << 1))
1158#define DAOS_OF_AKEY_UINT64 ((daos_ofeat_t)(1 << 2))
1160#define DAOS_OF_AKEY_LEXICAL ((daos_ofeat_t)(1 << 3))
1162#define DAOS_OF_KV_FLAT ((daos_ofeat_t)(1 << 4))
1164#define DAOS_OF_ARRAY ((daos_ofeat_t)(1 << 5))
1166#define DAOS_OF_ARRAY_MD ((daos_ofeat_t)(1 << 6))
1168#define DAOS_OF_ARRAY_BYTE ((daos_ofeat_t)(1 << 7))
1175#define DAOS_OF_ECHO ((daos_ofeat_t)(1 << 15))
1177#define DAOS_OF_MASK ((daos_ofeat_t)((1 << 16) - 1))
1178
1179#if defined(__cplusplus)
1180}
1181#define daos_obj_generate_oid daos_obj_generate_oid_cpp
1182static inline int
1183daos_obj_generate_oid_cpp(daos_handle_t coh, daos_obj_id_t *oid,
1184 enum daos_otype_t type, daos_oclass_id_t cid,
1185 daos_oclass_hints_t hints, uint32_t args)
1186{
1187 return daos_obj_generate_oid2(coh, oid, type, cid, hints, args);
1188}
1189static inline int
1190daos_obj_generate_oid_cpp(daos_handle_t coh, daos_obj_id_t *oid,
1191 daos_ofeat_t feat, daos_oclass_id_t cid,
1192 daos_oclass_hints_t hints, uint32_t args)
1193{
1194 return daos_obj_generate_oid1(coh, oid, feat, cid, hints, args);
1195}
1196#else
1201#define daos_obj_generate_oid(coh, oid, type, ...) \
1202 ({ \
1203 int _ret; \
1204 if (__builtin_types_compatible_p(__typeof__(type), \
1205 daos_ofeat_t)) { \
1206 _ret = daos_obj_generate_oid((coh), (oid), \
1207 (type), \
1208 __VA_ARGS__); \
1209 } else { \
1210 _ret = daos_obj_generate_oid2((coh), (oid), \
1211 (type), \
1212 __VA_ARGS__); \
1213 } \
1214 _ret; \
1215 })
1216#endif /* __cplusplus */
1217#endif /* __DAOS_OBJ_H__ */
uint64_t iod_flags
Definition daos_obj.h:367
daos_key_t iod_name
Definition daos_obj.h:349
uint32_t iod_nr
Definition daos_obj.h:372
daos_recx_t * iod_recxs
Definition daos_obj.h:378
daos_size_t iod_size
Definition daos_obj.h:363
daos_iod_type_t iod_type
Definition daos_obj.h:361
uint32_t iom_flags
Definition daos_obj.h:416
daos_size_t iom_size
Definition daos_obj.h:418
daos_iod_type_t iom_type
Definition daos_obj.h:403
daos_recx_t iom_recx_hi
Definition daos_obj.h:429
daos_recx_t iom_recx_lo
Definition daos_obj.h:423
daos_recx_t * iom_recxs
Definition daos_obj.h:433
uint32_t iom_nr
Definition daos_obj.h:407
uint32_t iom_nr_out
Definition daos_obj.h:414
uint32_t kd_val_type
Definition daos_obj.h:467
daos_size_t kd_key_len
Definition daos_obj.h:462
struct daos_oclass_attr * oa_oa
Definition daos_obj.h:283
d_rank_t oa_rank
Definition daos_obj.h:281
uint64_t hi
Definition daos_types.h:211
uint64_t lo
Definition daos_types.h:209
uint64_t rx_nr
Definition daos_obj.h:329
uint64_t rx_idx
Definition daos_obj.h:323