24 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_CLIENT 49 #define OI_IFID(oi) (struct m0_fid *)&(oi)->oi_idx->in_entity.en_id 118 if (M0_IN(
op->op_code,
175 return (
struct dix_inst *)
m0c->m0c_idx_svc_ctx.isc_svc_inst;
188 return (
struct dix_inst *)
m0c->m0c_idx_svc_ctx.isc_svc_inst;
218 &
m0c->m0c_pools_common.pc_svc_ctxs,
219 ctx->sc_type == M0_CST_CAS);
232 for (
i = 0;
i < rep_count;
i++) {
235 if (
rep.clr_rc == 0) {
254 for (
i = 0;
i < rep_count;
i++) {
259 if (
rep.cge_rc == 0) {
279 for (
i = 0;
i < rep_count;
i++) {
282 if (
rep.cnp_rc == 0) {
316 switch (
op->op_code) {
530 *(uint8_t *)start_key->
ov_buf[0] = 0;
565 &(
struct m0_ext) { .e_start = 0,
566 .e_end = IMASK_INF }, 1,
583 &(
struct m0_ext) { .e_start = 0,
625 req->idr_meta =
true;
660 req->idr_dreq.dr_sync_datum =
716 req->idr_ast.sa_datum =
req;
730 for (
i = 0;
i < rep_count;
i++) {
757 for (
i = 0;
i < rep_count;
i++) {
762 if (
rep.dgr_rc == 0) {
783 for (
i = 0;
i < rep_count;
i++) {
843 req->idr_ast.sa_datum =
req;
845 "Stable() ast cannot be armed before Executed() " 846 "is completed. Ensure EXECUTED_ALL -> STABLE transition" 847 "does not happen within the same ast tick");
910 "TODO: DIX failures are not supported.");
914 "TODO: failed executions of individual items " 915 "are not supported yet.");
923 M0_IMPOSSIBLE(
"Only Executed and Stable are allowed so far.");
952 switch (
op->op_code) {
999 req->idr_ast.sa_cb = exec_fn;
1000 req->idr_ast.sa_datum =
req;
1115 &
req->idr_dreq.dr_sm.sm_chan, &
req->idr_clink);
1199 *(uint8_t *)start_key->
ov_buf[0] = 0;
1226 dreq =
req->idr_meta ? &
req->idr_mreq.dmr_req :
1249 dreq =
req->idr_meta ? &
req->idr_mreq.dmr_req :
1379 "At least one key should be specified");
1382 "NULL key is not allowed");
1469 &
m0c->m0c_reqh.rh_ldom, &root_pver);
1475 if (
config->kc_create_meta) {
1478 &
config->kc_ldescr_ldesc);
1527 ctx->isc_svc_inst = inst;
1541 inst =
ctx->isc_svc_inst;
1560 #undef M0_TRACE_SUBSYSTEM static void dixreq_completed_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_entity * ol_entity
M0_INTERNAL void m0_cas_req_fini(struct m0_cas_req *req)
static struct dix_inst * dix_inst(const struct m0_op_idx *oi)
struct m0_be_tx_remid ccr_remid
struct m0_dtm0_dtx * tx_dtx
static bool casreq_clink_cb(struct m0_clink *cl)
M0_INTERNAL int m0_dix_layout_get(struct m0_dix_meta_req *req, const struct m0_fid *fid, uint32_t nr)
static bool dix_iname_args_are_valid(const struct m0_op_idx *oi)
M0_INTERNAL void m0_dix_get_rep(const struct m0_dix_req *req, uint64_t idx, struct m0_dix_get_reply *rep)
M0_INTERNAL bool m0_dix_fid_validate_dix(const struct m0_fid *dix_fid)
M0_INTERNAL void m0_dix_cli_stop_lock(struct m0_dix_cli *cli)
struct m0_rpc_session * ccr_sess
struct m0_fid di_index_pver
static int dix_list_reply_copy(struct m0_dix_meta_req *req, int32_t *rcs, struct m0_bufvec *bvec)
int const char const void size_t int flags
M0_INTERNAL int m0_dix_meta_create(struct m0_dix_cli *cli, struct m0_sm_group *grp, struct m0_dix_ldesc *dld_layout, struct m0_dix_ldesc *dld_ldescr)
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
M0_INTERNAL void m0_clink_del(struct m0_clink *link)
static struct m0_idx_service_ops dix_svc_ops
static void cas_index_delete_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL int m0_cas_index_list(struct m0_cas_req *req, const struct m0_fid *start_fid, uint32_t indices_nr, uint32_t flags)
M0_INTERNAL void idx_op_ast_complete(struct m0_sm_group *grp, struct m0_sm_ast *ast)
void(* sa_cb)(struct m0_sm_group *grp, struct m0_sm_ast *)
static void idx_op_cancel_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
static void dix_req_immed_failure(struct dix_req *req, int rc)
static struct io_request req
static struct m0_sm_group * grp
struct m0_conf_obj rt_obj
#define M0_LOG(level,...)
static void cas_get_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct dix_req * oi_dix_req
M0_INTERNAL void m0_sm_ast_post(struct m0_sm_group *grp, struct m0_sm_ast *ast)
static void dixreq_stable_post(struct dix_req *req, int rc)
M0_INTERNAL void idx_op_ast_fail(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_cas_req idr_creq
M0_INTERNAL void m0_idx_service_register(int svc_id, struct m0_idx_service_ops *sops, struct m0_idx_query_ops *qops)
M0_INTERNAL int m0_dix_delete(struct m0_dix_req *req, const struct m0_dix *indices, uint64_t indices_nr, struct m0_dtx *dtx, uint32_t flags)
M0_INTERNAL void m0_dix_meta_req_init(struct m0_dix_meta_req *req, struct m0_dix_cli *cli, struct m0_sm_group *grp)
void m0_dix_req_cancel(struct m0_dix_req *dreq)
static bool idx_is_distributed(const struct m0_op_idx *oi)
M0_INTERNAL int m0_dix_index_list_rep_nr(struct m0_dix_meta_req *req)
M0_INTERNAL void m0_cas_get_rep(const struct m0_cas_req *req, uint64_t idx, struct m0_cas_get_reply *rep)
M0_INTERNAL int m0_dix_item_rc(const struct m0_dix_req *req, uint64_t idx)
const struct m0_bob_type oi_bobtype
static struct m0_clovis * m0c
M0_INTERNAL const struct m0_fid_type m0_cas_index_fid_type
static uint32_t dix_set_cas_flags(struct m0_op_idx *oi)
M0_INTERNAL struct m0_dix_cli * ent_dixc(const struct m0_entity *ent)
M0_INTERNAL uint8_t m0_fid_tget(const struct m0_fid *fid)
static int dix_index_create(struct m0_op_idx *oi)
struct m0_dix_req idr_dreq
M0_INTERNAL void m0_cas_index_create_rep(const struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
#define m0_exists(var, nr,...)
static void cas_del_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_idx_attr in_attr
static void dix_index_lookup_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_dix_cli di_dixc
M0_ADDB2_ADD(M0_AVI_FS_CREATE, new_fid.f_container, new_fid.f_key, mode, rc)
static bool dixreq_clink_cb(struct m0_clink *cl)
struct m0_op_common oi_oc
static void to_dix_map(const struct m0_op *op, const struct m0_dix_req *req)
void(* dx_sync_rec_update)(struct m0_dix_req *, struct m0_rpc_session *, struct m0_be_tx_remid *)
static struct m0_idx_query_ops dix_query_ops
struct m0_bufvec * oi_keys
M0_INTERNAL bool m0_fid_is_set(const struct m0_fid *fid)
struct m0_fop_getxattr_rep * rep
static void dixreq_stable_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL int m0_cas_get(struct m0_cas_req *req, struct m0_cas_id *index, const struct m0_bufvec *keys)
M0_INTERNAL void m0_dix_req_fini(struct m0_dix_req *req)
M0_INTERNAL int m0_bufvec_alloc(struct m0_bufvec *bufvec, uint32_t num_segs, m0_bcount_t seg_size)
M0_INTERNAL int m0_confc_root_open(struct m0_confc *confc, struct m0_conf_root **root)
M0_INTERNAL uint64_t m0_dix_req_nr(const struct m0_dix_req *req)
int(* iqo_namei_create)(struct m0_op_idx *oi)
static struct m0_sm_ast ast[NR]
M0_INTERNAL void m0_bufvec_free(struct m0_bufvec *bufvec)
struct m0_entity in_entity
struct m0_dtm0_service * dx_dtms
static void cas_put_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
static int dix_index_delete(struct m0_op_idx *oi)
M0_INTERNAL int m0_dix_layout_rep_get(struct m0_dix_meta_req *req, uint64_t idx, struct m0_dix_layout *dlay)
M0_INTERNAL int m0_dix_next(struct m0_dix_req *req, const struct m0_dix *index, const struct m0_bufvec *start_keys, const uint32_t *recs_nr, uint32_t flags)
struct m0_conf_root * root
static int dix_req_create(struct m0_op_idx *oi, struct dix_req **out)
const struct m0_bob_type oc_bobtype
static void dix_dreq_prepare(struct dix_req *req, struct m0_dix *dix, struct m0_op_idx *oi)
return M0_ERR(-EOPNOTSUPP)
M0_INTERNAL int m0_cas_req_generic_rc(const struct m0_cas_req *req)
M0_INTERNAL void m0_cas_req_init(struct m0_cas_req *req, struct m0_rpc_session *sess, struct m0_sm_group *grp)
void m0_rpc_item_cancel(struct m0_rpc_item *item)
M0_INTERNAL struct m0_confc * m0_reqh2confc(struct m0_reqh *reqh)
#define M0_AMB(obj, ptr, field)
struct m0_fid rt_imeta_pver
M0_INTERNAL void m0_cas_put_rep(struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
static void dix_next_reply_copy(struct m0_dix_req *req, int32_t *rcs, struct m0_bufvec *keys, struct m0_bufvec *vals)
M0_INTERNAL int m0_cas_next(struct m0_cas_req *req, struct m0_cas_id *index, struct m0_bufvec *start_keys, uint32_t *recs_nr, uint32_t flags)
M0_INTERNAL const struct m0_fid_type m0_dix_fid_type
M0_INTERNAL int m0_dix_get(struct m0_dix_req *req, const struct m0_dix *index, const struct m0_bufvec *keys)
M0_INTERNAL void m0_cas_next_rep(const struct m0_cas_req *req, uint32_t idx, struct m0_cas_next_reply *rep)
M0_INTERNAL int m0_dix_cli_start_sync(struct m0_dix_cli *cli)
struct m0_dix_item * dr_items
static void cas_req_init(struct dix_req *req, struct m0_op_idx *oi)
static int dix_del(struct m0_op_idx *oi)
#define bob_of(ptr, type, field, bt)
static struct m0_bufvec bvec
M0_INTERNAL void m0_dix_req_init(struct m0_dix_req *req, struct m0_dix_cli *cli, struct m0_sm_group *grp)
struct m0_clink idr_clink
static void dixreq_executed_post(struct dix_req *req, int rc)
M0_INTERNAL int m0_dix_ldesc_init(struct m0_dix_ldesc *ld, struct m0_ext *range, m0_bcount_t range_nr, enum m0_dix_hash_fnc_type htype, struct m0_fid *pver)
struct m0_op_common ol_oc
static void cas_index_cancel(struct dix_req *dix_req)
M0_INTERNAL int m0_cas_del(struct m0_cas_req *req, struct m0_cas_id *index, struct m0_bufvec *keys, struct m0_dtx *dtx, uint32_t flags)
M0_INTERNAL struct dix_inst * ent_dix_inst(const struct m0_entity *ent)
M0_INTERNAL void m0_dix_meta_req_fini(struct m0_dix_meta_req *req)
static void cas_sync_record_update(struct m0_cas_req *creq, struct m0_rpc_session *rpc_session, struct m0_be_tx_remid *remid)
M0_INTERNAL int m0__idx_cancel(struct m0_op_idx *oi)
static int dix_get(struct m0_op_idx *oi)
int(* iso_init)(void *svc)
struct m0_sm_group * lo_grp
M0_INTERNAL int m0_cas_index_create(struct m0_cas_req *req, const struct m0_cas_id *cids, uint64_t cids_nr, struct m0_dtx *dtx)
static void cas_next_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL void m0_cas_index_list_rep(struct m0_cas_req *req, uint32_t idx, struct m0_cas_ilist_reply *rep)
M0_INTERNAL bool m0__idx_op_invariant(struct m0_op_idx *oi)
static int dix_next(struct m0_op_idx *oi)
M0_INTERNAL int m0_dix_create(struct m0_dix_req *req, const struct m0_dix *indices, uint32_t indices_nr, struct m0_dtx *dtx, uint32_t flags)
M0_INTERNAL int m0_dix_index_list(struct m0_dix_meta_req *req, const struct m0_fid *start_fid, uint32_t indices_nr)
static struct fdmi_ctx ctx
static int idx_dix_init(void *svc)
M0_INTERNAL int m0_dix_index_list_rep(struct m0_dix_meta_req *req, uint32_t idx, struct m0_fid *fid)
M0_INTERNAL void idx_op_ast_executed(struct m0_sm_group *grp, struct m0_sm_ast *ast)
static void dix_next_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL int m0_dix_cli_init(struct m0_dix_cli *cli, struct m0_sm_group *sm_group, struct m0_pools_common *pc, struct m0_layout_domain *ldom, const struct m0_fid *pver)
static void cas_index_lookup_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
static void cas_list_reply_copy(struct m0_cas_req *req, int32_t *rcs, struct m0_bufvec *bvec)
M0_INTERNAL int m0_cas_index_delete(struct m0_cas_req *req, const struct m0_cas_id *cids, uint64_t cids_nr, struct m0_dtx *dtx, uint32_t flags)
#define m0_forall(var, nr,...)
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
static void dix_index_create_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
const struct m0_bob_type ol_bobtype
static void dix_del_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL void m0_dix_cli_bootstrap_lock(struct m0_dix_cli *cli)
M0_INTERNAL void m0_cas_index_delete_rep(const struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
struct m0_sm_group * oi_sm_grp
M0_INTERNAL void m0_cas_del_rep(struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
static int dix_mreq_create(struct m0_op_idx *oi, struct dix_req **out)
M0_INTERNAL struct m0_locality * m0_locality0_get(void)
M0_INTERNAL uint64_t m0_cas_req_nr(const struct m0_cas_req *req)
M0_INTERNAL struct m0_dix_cli * ol_dixc(const struct m0_op_layout *ol)
struct m0_op_idx * idr_oi
static struct m0_dix_cli * op_dixc(const struct m0_op_idx *oi)
#define OP_IDX2CODE(op_idx)
M0_INTERNAL int m0_cas_index_lookup(struct m0_cas_req *req, const struct m0_cas_id *cids, uint64_t cids_nr)
static void dix_get_reply_copy(struct m0_dix_req *dreq, int32_t *rcs, struct m0_bufvec *bvec)
#define M0_ALLOC_PTR(ptr)
M0_INTERNAL void m0_clink_add(struct m0_chan *chan, struct m0_clink *link)
static void idx_sync_record_update(struct m0_op *op, struct m0_rpc_session *rpc_session, struct m0_be_tx_remid *remid)
struct m0_entity * op_entity
static int dix_index_list(struct m0_op_idx *oi)
M0_INTERNAL int m0_dix_del(struct m0_dix_req *req, const struct m0_dix *index, const struct m0_bufvec *keys, struct m0_dtx *dtx, uint32_t flags)
struct m0_bufvec * oi_vals
static void cas_next_reply_copy(struct m0_cas_req *req, int32_t *rcs, struct m0_bufvec *keys, struct m0_bufvec *vals)
M0_INTERNAL int m0_dix_meta_generic_rc(const struct m0_dix_meta_req *req)
static void dix_get_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL int m0_cas_put(struct m0_cas_req *req, struct m0_cas_id *index, const struct m0_bufvec *keys, const struct m0_bufvec *values, struct m0_dtx *dtx, uint32_t flags)
static bool dixreq_clink_dtx_cb(struct m0_clink *cl)
static struct m0_net_test_service svc
M0_INTERNAL enum m0_dtm0_dtx_state m0_dtx0_sm_state(const struct m0_dtx *dtx)
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
static struct m0_fop * fop
static void cas_req_prepare(struct dix_req *req, struct m0_cas_id *cid, struct m0_op_idx *oi)
struct m0_bufvec idr_start_key
M0_INTERNAL void m0_dix_get_rep_mlock(struct m0_dix_req *req, uint64_t idx)
M0_INTERNAL void m0_confc_close(struct m0_conf_obj *obj)
#define M0_ASSERT_INFO(cond, fmt,...)
M0_INTERNAL void m0_cas_rep_mlock(const struct m0_cas_req *req, uint64_t idx)
M0_INTERNAL void m0_idx_dix_register(void)
static bool dix_meta_req_clink_cb(struct m0_clink *cl)
M0_INTERNAL void m0_dix_cli_fini_lock(struct m0_dix_cli *cli)
enum dix_req_type dr_type
static void dix_set_idx_flags(struct m0_op_idx *oi)
static void dix_sync_record_update(struct m0_dix_req *dreq, struct m0_rpc_session *rpc_session, struct m0_be_tx_remid *remid)
static int dix_root_idx_pver(struct m0_client *m0c, struct m0_fid *out)
static void dix_build(const struct m0_op_idx *oi, struct m0_dix *out)
static void dix_index_list_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL void idx_op_ast_stable(struct m0_sm_group *grp, struct m0_sm_ast *ast)
static void cas_index_create_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
static int dix_client_init(struct dix_inst *inst, struct m0_client *m0c, struct m0_idx_dix_config *config)
M0_INTERNAL void m0_dix_next_rep_mlock(struct m0_dix_req *req, uint32_t key_idx, uint32_t val_idx)
M0_INTERNAL bool m0_fid_is_valid(const struct m0_fid *fid)
static struct m0_reqh_service_ctx * svc_find(const struct m0_op_idx *oi)
static int dix_index_lookup(struct m0_op_idx *oi)
static uint8_t ifid_type(bool dist)
#define m0_tl_find(name, var, head,...)
M0_INTERNAL void m0_dix_next_rep(const struct m0_dix_req *req, uint64_t key_idx, uint64_t val_idx, struct m0_dix_next_reply *rep)
M0_INTERNAL uint64_t m0_sm_id_get(const struct m0_sm *sm)
void sync_record_update(struct m0_reqh_service_ctx *service, struct m0_entity *ent, struct m0_op *op, struct m0_be_tx_remid *btr)
M0_INTERNAL uint32_t m0_dix_next_rep_nr(const struct m0_dix_req *req, uint64_t key_idx)
struct m0_rpc_item f_item
static struct m0_fid ifid
static void cas_get_reply_copy(struct m0_cas_req *req, int32_t *rcs, struct m0_bufvec *bvec)
M0_INTERNAL void m0_cas_index_lookup_rep(const struct m0_cas_req *req, uint64_t idx, struct m0_cas_rec_reply *rep)
M0_INTERNAL int m0_dix_cctgs_lookup(struct m0_dix_req *req, const struct m0_dix *indices, uint32_t indices_nr)
M0_INTERNAL bool m0_sm_group_is_locked(const struct m0_sm_group *grp)
static void dix_index_delete_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
static void dix_put_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL int m0_dix_put(struct m0_dix_req *req, const struct m0_dix *index, const struct m0_bufvec *keys, const struct m0_bufvec *vals, struct m0_dtx *dtx, uint32_t flags)
static void cas_index_list_ast(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_dix_meta_req idr_mreq
static int idx_dix_fini(void *svc)
static void dix_req_destroy(struct dix_req *req)
M0_INTERNAL void m0_dix_fini(struct m0_dix *dix)
static int dix_put(struct m0_op_idx *oi)
static void dix_req_exec(struct dix_req *req, void(*exec_fn)(struct m0_sm_group *grp, struct m0_sm_ast *ast))
M0_INTERNAL int m0_dix_generic_rc(const struct m0_dix_req *req)
#define M0_IMPOSSIBLE(fmt,...)
M0_INTERNAL struct m0_reqh_service_ctx * m0_reqh_service_ctx_from_session(struct m0_rpc_session *session)
M0_INTERNAL struct m0_client * m0__entity_instance(const struct m0_entity *entity)
static void dixreq_completed_post(struct dix_req *req, int rc)