Motr  M0
util.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2021 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  */
20 
21 #include <stdio.h>
22 
23 #include "lib/trace.h" /* m0_trace_set_mmapped_buffer */
24 #include "rpc/rpclib.h" /* M0_RPCLIB_MAX_RETRIES */
25 #include "motr/client_internal.h" /* m0_client */
26 #include "layout/plan.h" /* m0_layout_io_plop */
27 
28 #include "iscservice/isc.h"
29 #include "util.h"
30 
31 #ifndef DEBUG
32 #define DEBUG 0
33 #endif
34 
35 /* static variables */
36 static struct m0_container container;
37 static struct m0_idx_dix_config dix_conf = {};
38 
39 /* global variables */
41 int trace_level = 0;
42 bool m0trace_on = false;
45 
49 uint64_t isc_m0gs(struct m0_obj *obj, struct m0_client *cinst)
50 {
51  unsigned long usz; /* unit size */
52  struct m0_pool_version *pver;
53 
55  &obj->ob_attr.oa_pver);
56  if (pver == NULL) {
57  ERR("invalid object pool version: "FID_F"\n",
58  FID_P(&obj->ob_attr.oa_pver));
59  return 0;
60  }
61 
62  usz = m0_obj_layout_id_to_unit_size(obj->ob_attr.oa_layout_id);
63 
64  return usz * pver->pv_attr.pa_N;
65 }
66 
67 void free_segs(struct m0_bufvec *data, struct m0_indexvec *ext,
68  struct m0_bufvec *attr)
69 {
70  m0_indexvec_free(ext);
73 }
74 
75 int alloc_segs(struct m0_bufvec *data, struct m0_indexvec *ext,
76  struct m0_bufvec *attr, uint64_t bsz, uint32_t cnt)
77 {
78  int i, rc;
79 
80  rc = m0_bufvec_alloc(data, cnt, bsz) ?:
81  m0_bufvec_alloc(attr, cnt, 1) ?:
82  m0_indexvec_alloc(ext, cnt);
83  if (rc != 0)
84  goto err;
85 
86  for (i = 0; i < cnt; i++)
87  attr->ov_vec.v_count[i] = 0; /* no attrs */
88 
89  return 0;
90  err:
91  free_segs(data, ext, attr);
92  return rc;
93 }
94 
95 uint64_t set_exts(struct m0_indexvec *ext, uint64_t off, uint64_t bsz)
96 {
97  uint32_t i;
98 
99  for (i = 0; i < ext->iv_vec.v_nr; i++) {
100  ext->iv_index[i] = off;
101  ext->iv_vec.v_count[i] = bsz;
102  off += bsz;
103  }
104 
105  return i * bsz;
106 }
107 
108 int isc_req_prepare(struct isc_req *req, struct m0_buf *args,
109  const struct m0_fid *comp_fid,
110  struct m0_layout_io_plop *iop, uint32_t reply_len)
111 {
112  int rc;
113  struct m0_rpc_session *sess = iop->iop_session;
114  struct m0_fop_isc *fop_isc = &req->cir_isc_fop;
115  struct m0_fop *arg_fop = &req->cir_fop;
116 
117  req->cir_plop = &iop->iop_base;
118  fop_isc->fi_comp_id = *comp_fid;
119  m0_rpc_at_init(&fop_isc->fi_args);
120  rc = m0_rpc_at_add(&fop_isc->fi_args, args, sess->s_conn);
121  if (rc != 0) {
122  m0_rpc_at_fini(&fop_isc->fi_args);
123  ERR("m0_rpc_at_add() failed with %d\n", rc);
124  return rc;
125  }
126 
127  /* Initialise the reply RPC AT buffer to be received.*/
128  m0_rpc_at_init(&fop_isc->fi_ret);
129  rc = m0_rpc_at_recv(&fop_isc->fi_ret, sess->s_conn, reply_len, false);
130  if (rc != 0) {
131  m0_rpc_at_fini(&fop_isc->fi_args);
132  m0_rpc_at_fini(&fop_isc->fi_ret);
133  ERR("m0_rpc_at_recv() failed with %d\n", rc);
134  return rc;
135  }
136 
137  m0_fop_init(arg_fop, &m0_fop_isc_fopt, fop_isc, m0_fop_release);
138  req->cir_rpc_sess = sess;
139 
140  return rc;
141 }
142 
144 {
145  int rc;
146  struct m0_fop *fop = M0_AMB(fop, item, f_item);
147  struct m0_fop *reply_fop;
148  struct m0_fop_isc_rep *isc_reply;
149  struct isc_req *req = M0_AMB(req, fop, cir_fop);
150  const char *addr = m0_rpc_conn_addr(req->cir_rpc_sess->s_conn);
151 
152  if (item->ri_error != 0) {
153  req->cir_rc = item->ri_error;
154  ERR("No reply from %s: rc=%d.\n", addr, item->ri_error);
155  goto err;
156  }
157 
158  reply_fop = m0_rpc_item_to_fop(req->cir_fop.f_item.ri_reply);
159  isc_reply = (struct m0_fop_isc_rep *)m0_fop_data(reply_fop);
160  rc = req->cir_rc = isc_reply->fir_rc;
161  if (rc != 0) {
162  ERR("Got error in reply from %s: rc=%d.\n", addr, rc);
163  if (rc == -ENOENT)
164  ERR("Was isc .so library is loaded?\n");
165  goto err;
166  }
167 
168  rc = m0_rpc_at_rep_get(&req->cir_isc_fop.fi_ret, &isc_reply->fir_ret,
169  &req->cir_result);
170  if (rc != 0)
171  ERR("rpc_at_rep_get() from %s failed: rc=%d\n", addr, rc);
172  err:
174 }
175 
176 static const struct m0_rpc_item_ops isc_item_ops = {
178 };
179 
180 static void ireqs_list_add_in_order(struct isc_req *req)
181 {
182  struct isc_req *r;
183  struct m0_layout_io_plop *pl1;
184  struct m0_layout_io_plop *pl2 = M0_AMB(pl2, req->cir_plop, iop_base);
185 
186  /*
187  * No protection of the list is needed here as isc_req_send()
188  * is called from the same thread.
189  */
190  m0_list_for_each_entry(&isc_reqs, r, struct isc_req, cir_link) {
191  pl1 = M0_AMB(pl1, r->cir_plop, iop_base);
192  if (pl1->iop_goff > pl2->iop_goff)
193  break;
194  }
195  m0_list_add_before(&r->cir_link, &req->cir_link);
196 }
197 
199 {
200  int rc;
201  struct m0_rpc_item *item;
202 
203  item = &req->cir_fop.f_item;
204  item->ri_session = req->cir_rpc_sess;
209 
210  rc = m0_rpc_post(item);
211  if (rc != 0)
212  ERR("Failed to send request to %s: rc=%d\n",
213  m0_rpc_conn_addr(req->cir_rpc_sess->s_conn), rc);
214 
216 
217  return rc;
218 }
219 
220 static void fop_fini_lock(struct m0_fop *fop)
221 {
222  struct m0_rpc_machine *rmach = m0_fop_rpc_machine(fop);
223 
224  m0_rpc_machine_lock(rmach);
225  m0_fop_fini(fop);
226  m0_rpc_machine_unlock(rmach);
227 }
228 
229 void isc_req_fini(struct isc_req *req)
230 {
231  struct m0_fop *reply_fop = NULL;
232 
233  if (req->cir_fop.f_item.ri_reply != NULL)
234  reply_fop = m0_rpc_item_to_fop(req->cir_fop.f_item.ri_reply);
235  if (reply_fop != NULL)
237  req->cir_fop.f_item.ri_reply = NULL;
238  m0_rpc_at_fini(&req->cir_isc_fop.fi_args);
239  m0_rpc_at_fini(&req->cir_isc_fop.fi_ret);
240  req->cir_fop.f_data.fd_data = NULL;
241  fop_fini_lock(&req->cir_fop);
242 }
243 
244 /*
245  * init client resources.
246  */
247 int isc_init(struct m0_config *conf, struct m0_client **cinst)
248 {
249  int rc;
250 
251  conf->mc_is_oostore = true;
252  conf->mc_is_read_verify = false;
253  conf->mc_tm_recv_queue_min_len = M0_NET_TM_RECV_QUEUE_DEF_LEN;
254  conf->mc_max_rpc_msg_size = M0_RPC_DEF_MAX_RPC_MSG_SIZE;
255  conf->mc_layout_id = 0;
256  conf->mc_idx_service_id = M0_IDX_DIX;
257  conf->mc_idx_service_conf = &dix_conf;
258 
259  if (!m0trace_on)
261 
262  rc = m0_client_init(cinst, conf, true);
263  if (rc != 0) {
264  ERR("failed to initilise the Client API\n");
265  return rc;
266  }
267 
270  if (rc != 0) {
271  ERR("failed to open uber realm\n");
272  return rc;
273  }
275 
277 
278  return 0;
279 }
280 
281 void isc_fini(struct m0_client *cinst)
282 {
283  m0_client_fini(cinst, true);
284 }
285 
286 /*
287  * Local variables:
288  * c-indentation-style: "K&R"
289  * c-basic-offset: 8
290  * tab-width: 8
291  * fill-column: 80
292  * scroll-step: 1
293  * End:
294  */
M0_INTERNAL int m0_rpc_post(struct m0_rpc_item *item)
Definition: rpc.c:63
Definition: client.h:788
enum m0_rpc_item_priority ri_prio
Definition: item.h:133
M0_INTERNAL int m0_indexvec_alloc(struct m0_indexvec *ivec, uint32_t len)
Definition: vec.c:532
struct m0_list isc_reqs
Definition: util.c:44
#define NULL
Definition: misc.h:38
M0_INTERNAL void m0_list_add_before(struct m0_list_link *anchor, struct m0_list_link *new)
Definition: list.c:133
M0_INTERNAL void m0_list_init(struct m0_list *head)
Definition: list.c:29
M0_INTERNAL struct m0_pool_version * m0_pool_version_find(struct m0_pools_common *pc, const struct m0_fid *id)
Definition: pool.c:586
static struct io_request req
Definition: file.c:100
M0_INTERNAL void m0_fop_init(struct m0_fop *fop, struct m0_fop_type *fopt, void *data, void(*fop_release)(struct m0_ref *))
Definition: fop.c:79
M0_INTERNAL void m0_rpc_at_init(struct m0_rpc_at_buf *ab)
Definition: at.c:433
int32_t fir_rc
Definition: isc_fops.h:75
struct m0_rpc_at_buf fir_ret
Definition: isc_fops.h:79
void free_segs(struct m0_bufvec *data, struct m0_indexvec *ext, struct m0_bufvec *attr)
Definition: util.c:67
void m0_client_fini(struct m0_client *m0c, bool fini_m0)
Definition: client_init.c:1711
Definition: idx.h:70
struct m0_bufvec data
Definition: di.c:40
#define ERR(_fmt,...)
Definition: util.h:129
int32_t ri_error
Definition: item.h:161
void * m0_fop_data(const struct m0_fop *fop)
Definition: fop.c:220
M0_INTERNAL void m0_indexvec_free(struct m0_indexvec *ivec)
Definition: vec.c:553
Definition: conf.py:1
static const struct m0_rpc_item_ops isc_item_ops
Definition: util.c:176
M0_INTERNAL int m0_rpc_at_add(struct m0_rpc_at_buf *ab, const struct m0_buf *buf, const struct m0_rpc_conn *conn)
Definition: at.c:462
int m0_client_init(struct m0_client **m0c, struct m0_config *conf, bool init_m0)
Definition: client_init.c:1533
Definition: ub.c:49
const struct m0_uint128 M0_UBER_REALM
Definition: client.c:85
static struct m0_rpc_item * item
Definition: item.c:56
int trace_level
Definition: util.c:41
void isc_req_fini(struct isc_req *req)
Definition: util.c:229
static struct foo * obj
Definition: tlist.c:302
M0_INTERNAL int m0_rpc_at_rep_get(struct m0_rpc_at_buf *sent, struct m0_rpc_at_buf *rcvd, struct m0_buf *out)
Definition: at.c:606
M0_INTERNAL int m0_bufvec_alloc(struct m0_bufvec *bufvec, uint32_t num_segs, m0_bcount_t seg_size)
Definition: vec.c:220
struct m0_vec iv_vec
Definition: vec.h:139
M0_INTERNAL const char * m0_rpc_conn_addr(const struct m0_rpc_conn *conn)
Definition: conn.c:1306
Definition: buf.h:37
M0_INTERNAL void m0_bufvec_free(struct m0_bufvec *bufvec)
Definition: vec.c:395
m0_bindex_t * iv_index
Definition: vec.h:141
int m0_obj_layout_id_to_unit_size(uint64_t layout_id)
Definition: obj.c:851
int i
Definition: dir.c:1033
struct m0_realm co_realm
Definition: client.h:881
struct m0_pools_common m0c_pools_common
struct m0_rpc_machine * m0_fop_rpc_machine(const struct m0_fop *fop)
Definition: fop.c:360
M0_INTERNAL void m0_rpc_machine_unlock(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:558
static void ireqs_list_add_in_order(struct isc_req *req)
Definition: util.c:180
void isc_req_replied(struct m0_rpc_item *item)
Definition: util.c:143
Definition: cnt.h:36
#define M0_AMB(obj, ptr, field)
Definition: misc.h:320
static void attr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
Definition: dump.c:949
struct m0_entity re_entity
Definition: client.h:871
#define m0_list_for_each_entry(head, pos, type, member)
Definition: list.h:235
m0_bindex_t iop_goff
Definition: plan.h:489
struct m0_fop_type m0_fop_isc_fopt
Definition: isc_fops.c:33
struct m0_fid pver
Definition: idx_dix.c:74
uint64_t set_exts(struct m0_indexvec *ext, uint64_t off, uint64_t bsz)
Definition: util.c:95
static struct m0_fop reply_fop
Definition: fsync.c:64
struct m0_fid fi_comp_id
Definition: isc_fops.h:57
struct m0_rpc_at_buf fi_args
Definition: isc_fops.h:63
static struct m0_container container
Definition: util.c:36
uint64_t ri_nr_sent_max
Definition: item.h:146
Definition: xcode.h:73
uint32_t v_nr
Definition: vec.h:51
int32_t sm_rc
Definition: sm.h:336
m0_bcount_t * v_count
Definition: vec.h:53
M0_INTERNAL void m0_fop_fini(struct m0_fop *fop)
Definition: fop.c:136
struct m0_layout_plop iop_base
Definition: plan.h:479
#define FID_P(f)
Definition: fid.h:77
struct m0_rpc_session * iop_session
Definition: plan.h:482
Definition: list.h:72
void(* rio_replied)(struct m0_rpc_item *item)
Definition: item.h:300
static struct m0_client cinst
Definition: sync.c:84
Definition: fid.h:38
M0_INTERNAL void m0_rpc_machine_lock(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:551
struct m0_semaphore isc_sem
Definition: util.c:43
M0_INTERNAL void m0_fop_release(struct m0_ref *ref)
Definition: fop.c:148
int isc_init(struct m0_config *conf, struct m0_client **cinst)
Definition: util.c:247
const struct m0_rpc_item_ops * ri_ops
Definition: item.h:149
static int r[NR]
Definition: thread.c:46
struct m0_rpc_at_buf fi_ret
Definition: isc_fops.h:67
struct m0_fop cir_fop
Definition: util.h:58
struct m0_rpc_session * ri_session
Definition: item.h:147
M0_INTERNAL void m0_rpc_at_fini(struct m0_rpc_at_buf *ab)
Definition: at.c:441
void m0_fop_put_lock(struct m0_fop *fop)
Definition: fop.c:199
static struct m0_fop * fop
Definition: item.c:57
struct m0_fop * m0_rpc_item_to_fop(const struct m0_rpc_item *item)
Definition: fop.c:346
uint64_t isc_m0gs(struct m0_obj *obj, struct m0_client *cinst)
Definition: util.c:49
struct m0_realm uber_realm
Definition: util.c:40
Definition: util.h:48
int alloc_segs(struct m0_bufvec *data, struct m0_indexvec *ext, struct m0_bufvec *attr, uint64_t bsz, uint32_t cnt)
Definition: util.c:75
void m0_container_init(struct m0_container *con, struct m0_realm *parent, const struct m0_uint128 *id, struct m0_client *instance)
Definition: realm.c:31
bool m0trace_on
Definition: util.c:42
void isc_fini(struct m0_client *cinst)
Definition: util.c:281
static struct m0_idx_dix_config dix_conf
Definition: util.c:37
int isc_req_prepare(struct isc_req *req, struct m0_buf *args, const struct m0_fid *comp_fid, struct m0_layout_io_plop *iop, uint32_t reply_len)
Definition: util.c:108
struct m0_sm en_sm
Definition: client.h:732
M0_INTERNAL void m0_semaphore_up(struct m0_semaphore *semaphore)
Definition: semaphore.c:65
struct m0_rpc_item f_item
Definition: fop.h:83
int32_t rc
Definition: trigger_fop.h:47
M0_INTERNAL void m0_trace_set_mmapped_buffer(bool val)
Definition: utrace.c:156
int isc_req_send(struct isc_req *req)
Definition: util.c:198
struct m0_rpc_conn * s_conn
Definition: session.h:312
const m0_time_t M0_TIME_IMMEDIATELY
Definition: time.c:107
Definition: fop.h:79
#define FID_F
Definition: fid.h:75
Definition: vec.h:145
M0_INTERNAL int m0_rpc_at_recv(struct m0_rpc_at_buf *ab, const struct m0_rpc_conn *conn, uint32_t len, bool force_bulk)
Definition: at.c:508
m0_time_t ri_deadline
Definition: item.h:141
static void fop_fini_lock(struct m0_fop *fop)
Definition: util.c:220