Motr  M0
sd_common.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2017-2020 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 
22 
23 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_FDMI
24 #include "lib/trace.h"
25 #include "lib/string.h"
26 
27 #include "ut/ut.h"
28 #include "reqh/reqh.h"
29 #include "reqh/reqh_service.h"
30 #include "fdmi/fdmi.h"
31 #include "fdmi/service.h"
32 #include "mdstore/mdstore.h"
34 #include "rpc/packet_internal.h" /* m0_rpc_packet_traverse_items */
35 #include "rpc/item_internal.h" /* m0_rpc_item_failed */
36 #include "rpc/session_internal.h"
37 #include "rpc/conn_internal.h"
38 
39 #include "fdmi/ut/sd_common.h"
40 
42 static struct m0_mdstore md;
43 
44 /* ------------------------------------------------------------------
45  * This stuff is needed to initialize m0_motr (g_sd_ut.motr).
46  * ------------------------------------------------------------------ */
47 
48 #define LOG_FILE_NAME "fdmi_sd_ut.errlog"
49 
50 static FILE *sd_ut_lfile;
51 
52 /* ------------------------------------------------------------------
53  * Forward declarations.`
54  * ------------------------------------------------------------------ */
55 
56 M0_INTERNAL struct m0_rpc_chan *rpc_chan_get(struct m0_rpc_machine *machine,
57  struct m0_net_end_point *dest_ep,
58  uint64_t max_rpcs_in_flight);
59 
60 M0_INTERNAL void rpc_chan_put(struct m0_rpc_chan *chan);
61 
62 /* ------------------------------------------------------------------
63  * Other helpers.
64  * ------------------------------------------------------------------ */
65 
66 void fdmi_serv_start_ut(const struct m0_filterc_ops *filterc_ops)
67 {
68  int rc;
69  struct m0_reqh_fdmi_svc_params *fdms_start_params;
70  struct m0_reqh_context *reqh_ctx = &g_sd_ut.motr.cc_reqh_ctx;
71  struct m0_reqh *reqh = &reqh_ctx->rc_reqh;
72 
73  M0_ENTRY();
74  M0_LOG(M0_DEBUG, ">> fdmi_serv_start_ut ");
75 
76  memset(reqh, 0, sizeof(struct m0_reqh));
77  M0_SET0(&g_sd_ut);
78  M0_SET0(&md);
79 
80  sd_ut_lfile = fopen(LOG_FILE_NAME, "w+");
82 
84  m0_net_xprt_nr(), sd_ut_lfile, false);
85  M0_UT_ASSERT(rc == 0);
86 
88  .rhia_fid = &g_process_fid,
89  .rhia_dtm = (void *)1,
90  .rhia_mdstore = &md);
91  M0_UT_ASSERT(rc == 0);
92 
94  M0_UT_ASSERT(rc == 0);
95 
97 
98  /* Patch filterc instance used by source dock FOM */
99  M0_ALLOC_PTR(fdms_start_params);
100  M0_ASSERT(fdms_start_params != NULL);
101  if (filterc_ops != NULL) {
102  fdms_start_params->filterc_ops = filterc_ops;
103  }
104 
106  fdms_start_params,
107  sizeof(struct m0_reqh_fdmi_svc_params));
108 
109  m0_reqh_rpc_mach_tlink_init_at_tail(
112 
114 
116 
117  M0_LOG(M0_DEBUG, "<< fdmi_serv_start_ut ");
118  M0_LEAVE();
119 }
120 
122 {
124 
125  M0_ENTRY();
126 
127  M0_LOG(M0_DEBUG, ">>fdmi_serv_stop_ut ");
128 
129  m0_reqh_rpc_mach_tlist_pop(&reqh->rh_rpc_machines);
130 
134 
136  M0_SET0(&g_sd_ut);
137  fclose(sd_ut_lfile);
138  sd_ut_lfile = NULL;
139 
140  M0_LOG(M0_DEBUG, "<< fdmi_serv_stop_ut ");
141  M0_LEAVE();
142 }
143 
144 /* ------------------------------------------------------------------
145  * Start/stop unit test.
146  * ------------------------------------------------------------------ */
147 
149  struct m0_rpc_item *item, int rc)
150 {
152 }
153 
155  struct m0_rpc_packet *p)
156 {
157 
158  M0_ENTRY("mach %p, p %p", mach, p);
159 
161 
165 
167  M0_LEAVE();
168 }
169 
171 void prepare_rpc_env(struct test_rpc_env *env,
172  struct m0_reqh *reqh,
173  const struct m0_rpc_frm_ops *frm_ops,
174  bool sender,
175  struct m0_rpc_conn *rpc_conn,
176  struct m0_rpc_session *rpc_session)
177 {
178  enum { TEST_TM_NR = 1 }; /* Number of TMs. */
179  int rc;
180 
181  M0_ENTRY();
182 
183  M0_ASSERT(rpc_conn != NULL && rpc_session != NULL);
184 
186 
188  &env->tre_net_dom, &env->tre_buffer_pool,
190  TEST_TM_NR);
191  M0_ASSERT(rc == 0);
192 
193  env->ep_addr_local = "0@lo:12345:32:123";
194  env->ep_addr_remote = "0@lo:12345:32:123";
196  &env->tre_net_dom,
197  env->ep_addr_local,
199  2048, /* max RPC message size */
201  M0_ASSERT(rc == 0);
202 
204  &env->tre_rpc_machine.rm_tm,
205  env->ep_addr_remote);
206  M0_ASSERT(rc == 0);
207 
209  env->tre_rpc_chan = rpc_chan_get(&env->tre_rpc_machine, env->tre_ep,
210  10 /* max packets in flight */);
212  M0_ASSERT(env->tre_rpc_chan != NULL);
213 
214  env->tre_conn = rpc_conn;
215  if (!sender) {
216  rc = m0_rpc_rcv_conn_init(env->tre_conn, env->tre_ep,
217  &env->tre_rpc_machine, &M0_UINT128(10, 10));
218  } else {
220  rc = m0_rpc_conn_init(env->tre_conn, NULL, env->tre_ep,
221  &env->tre_rpc_machine, 10);
223  }
224 
226  env->tre_conn->c_sender_id = 0xFEFE;
228  M0_ASSERT(rc == 0);
229 
230  env->tre_session = rpc_session;
232  env->tre_session->s_session_id = 10;
236  M0_ASSERT(rc == 0);
237 
238  M0_LEAVE();
239 }
240 
242 {
243  M0_ENTRY("env %p", env);
244 
248  env->tre_session->s_hold_cnt = 0;
250  env->tre_rpc_chan->rc_frm.f_nr_items = 0;
252  m0_sm_fail(&env->tre_session->s_sm,
253  M0_RPC_SESSION_FAILED, -EBUSY);
255  } else {
259  }
261 
266 
270 
272 
275 
277 
278  M0_LEAVE();
279 }
280 
281 #undef M0_TRACE_SUBSYSTEM
282 
283 /*
284  * Local variables:
285  * c-indentation-style: "K&R"
286  * c-basic-offset: 8
287  * tab-width: 8
288  * fill-column: 80
289  * scroll-step: 1
290  * End:
291  */
292 /*
293  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
294  */
struct m0_motr motr
Definition: sd_common.h:41
M0_INTERNAL void rpc_chan_put(struct m0_rpc_chan *chan)
Definition: rpc_machine.c:729
M0_EXTERN struct m0_reqh_service_type m0_fdmi_service_type
Definition: fdmi.h:194
static struct m0_addb2_philter p
Definition: consumer.c:40
void m0_rpc_machine_fini(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:233
M0_INTERNAL int m0_reqh_service_start(struct m0_reqh_service *service)
Definition: reqh_service.c:343
const struct m0_filterc_ops * filterc_ops
Definition: service.h:49
M0_INTERNAL void m0_sm_fail(struct m0_sm *mach, int fail_state, int32_t rc)
Definition: sm.c:468
M0_INTERNAL void m0_reqh_services_terminate(struct m0_reqh *reqh)
Definition: reqh.c:675
void m0_net_domain_fini(struct m0_net_domain *dom)
Definition: domain.c:71
#define NULL
Definition: misc.h:38
const struct m0_rpc_frm_ops frm_ops
Definition: pd_ut.c:438
struct m0_net_end_point * tre_ep
Definition: sd_common.h:59
M0_INTERNAL void m0_rpc_frm_packet_done(struct m0_rpc_packet *p)
Definition: formation2.c:698
#define M0_REQH_INIT(reqh,...)
Definition: reqh.h:262
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
M0_INTERNAL void m0_rpc_packet_traverse_items(struct m0_rpc_packet *p, item_visit_fn *visit, int opaque_data)
Definition: packet.c:524
static struct m0_mdstore md
Definition: sd_common.c:42
struct m0_rpc_machine tre_rpc_machine
Definition: sd_common.h:56
M0_INTERNAL void m0_rpc_item_failed(struct m0_rpc_item *item, int32_t rc)
Definition: item.c:742
void m0_cs_fini(struct m0_motr *cctx)
Definition: setup.c:3029
M0_INTERNAL void m0_buf_init(struct m0_buf *buf, void *data, uint32_t nob)
Definition: buf.c:37
static struct m0_addb2_mach * mach
Definition: storage.c:42
M0_INTERNAL void m0_rpc_session_fini(struct m0_rpc_session *session)
Definition: session.c:292
struct m0_net_buffer_pool tre_buffer_pool
Definition: sd_common.h:58
static void test_item_done(struct m0_rpc_packet *packet M0_UNUSED, struct m0_rpc_item *item, int rc)
Definition: sd_common.c:148
#define M0_SET0(obj)
Definition: misc.h:64
M0_INTERNAL void m0_reqh_fini(struct m0_reqh *reqh)
Definition: reqh.c:320
static struct m0_rpc_item * item
Definition: item.c:56
M0_INTERNAL void m0_reqh_shutdown_wait(struct m0_reqh *reqh)
Definition: reqh.c:647
void fdmi_serv_start_ut(const struct m0_filterc_ops *filterc_ops)
Definition: sd_common.c:66
struct m0_buf rs_ss_param
Definition: reqh_service.h:281
#define M0_ENTRY(...)
Definition: trace.h:170
uint32_t s_hold_cnt
Definition: session.h:320
M0_INTERNAL void m0_rpc_machine_unlock(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:558
M0_INTERNAL void session_state_set(struct m0_rpc_session *session, int state)
Definition: session.c:131
uint64_t c_sender_id
Definition: conn.h:269
M0_INTERNAL int m0_rpc_session_init(struct m0_rpc_session *session, struct m0_rpc_conn *conn)
Definition: session.c:204
struct m0_net_transfer_mc rm_tm
Definition: rpc_machine.h:88
#define M0_ASSERT(cond)
M0_INTERNAL int m0_rpc_net_buffer_pool_setup(struct m0_net_domain *ndom, struct m0_net_buffer_pool *app_pool, uint32_t bufs_nr, uint32_t tm_nr)
Definition: rpc.c:229
struct m0_rpc_chan * tre_rpc_chan
Definition: sd_common.h:57
Definition: xcode.h:95
M0_INTERNAL uint32_t m0_rpc_bufs_nr(uint32_t len, uint32_t tms_nr)
Definition: rpc.c:271
struct fdmi_sd_ut_ctx g_sd_ut
Definition: sd_common.c:41
struct m0_tl rh_rpc_machines
Definition: reqh.h:135
struct m0_reqh rc_reqh
Definition: setup.h:312
int m0_net_xprt_nr(void)
Definition: net.c:168
M0_INTERNAL int m0_rpc_rcv_conn_init(struct m0_rpc_conn *conn, struct m0_net_end_point *ep, struct m0_rpc_machine *machine, const struct m0_uint128 *uuid)
Definition: conn.c:525
M0_INTERNAL int session_state(const struct m0_rpc_session *session)
Definition: session.c:141
M0_INTERNAL int m0_rpc_machine_init(struct m0_rpc_machine *machine, struct m0_net_domain *net_dom, const char *ep_addr, struct m0_reqh *reqh, struct m0_net_buffer_pool *receive_pool, uint32_t colour, m0_bcount_t msg_size, uint32_t queue_len)
Definition: rpc_machine.c:123
struct m0_net_xprt * m0_net_xprt_default_get(void)
Definition: net.c:151
struct m0_rpc_frm rc_frm
struct m0_rpc_session * tre_session
Definition: sd_common.h:54
M0_INTERNAL int m0_reqh_service_allocate(struct m0_reqh_service **out, const struct m0_reqh_service_type *stype, struct m0_reqh_context *rctx)
Definition: reqh_service.c:185
Definition: reqh.h:94
enum frm_state f_state
M0_INTERNAL void m0_reqh_service_init(struct m0_reqh_service *service, struct m0_reqh *reqh, const struct m0_fid *fid)
Definition: reqh_service.c:428
struct m0_rpc_machine machine
Definition: mdstore.c:58
void fdmi_serv_stop_ut(void)
Definition: sd_common.c:121
uint64_t f_nr_packets_enqed
struct m0_sm s_sm
Definition: session.h:325
struct m0_rpc_machine rpc_machine
Definition: sd_common.h:44
char * ep_addr_remote
Definition: sd_common.h:61
void m0_net_end_point_put(struct m0_net_end_point *ep)
Definition: ep.c:98
M0_INTERNAL void conn_state_set(struct m0_rpc_conn *conn, int state)
Definition: conn.c:167
M0_INTERNAL void m0_reqh_start(struct m0_reqh *reqh)
Definition: reqh.c:711
int m0_cs_init(struct m0_motr *cctx, struct m0_net_xprt **xprts, size_t xprts_nr, FILE *out, bool mkfs)
Definition: setup.c:2999
#define LOG_FILE_NAME
Definition: sd_common.c:48
struct m0_reqh reqh
Definition: rm_foms.c:48
int m0_net_domain_init(struct m0_net_domain *dom, const struct m0_net_xprt *xprt)
Definition: domain.c:36
void prepare_rpc_env(struct test_rpc_env *env, struct m0_reqh *reqh, const struct m0_rpc_frm_ops *frm_ops, bool sender, struct m0_rpc_conn *rpc_conn, struct m0_rpc_session *rpc_session)
Definition: sd_common.c:171
struct m0_reqh_context cc_reqh_ctx
Definition: setup.h:361
static struct m0_chan chan[RDWR_REQUEST_MAX]
M0_INTERNAL void m0_rpc_machine_lock(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:551
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
void unprepare_rpc_env(struct test_rpc_env *env)
Definition: sd_common.c:241
struct m0_net_xprt ** m0_net_all_xprt_get(void)
Definition: net.c:161
char * ep_addr_local
Definition: sd_common.h:60
M0_INTERNAL void m0_rpc_packet_discard(struct m0_rpc_packet *packet)
Definition: packet.c:134
void fdmi_ut_packet_send_failed(struct m0_rpc_machine *mach, struct m0_rpc_packet *p)
Definition: sd_common.c:154
const struct m0_rpc_frm_ops * f_ops
#define M0_UINT128(hi, lo)
Definition: types.h:40
M0_INTERNAL int m0_rpc_conn_init(struct m0_rpc_conn *conn, struct m0_fid *svc_fid, struct m0_net_end_point *ep, struct m0_rpc_machine *machine, uint64_t max_rpcs_in_flight)
Definition: conn.c:293
M0_INTERNAL struct m0_rpc_chan * rpc_chan_get(struct m0_rpc_machine *machine, struct m0_net_end_point *dest_ep, uint64_t max_rpcs_in_flight)
Definition: rpc_machine.c:635
struct m0_reqh_service * fdmi_service
Definition: sd_common.h:45
void m0_rpc_net_buffer_pool_cleanup(struct m0_net_buffer_pool *app_pool)
Definition: rpc.c:264
struct m0_net_domain tre_net_dom
Definition: sd_common.h:53
static FILE * sd_ut_lfile
Definition: sd_common.c:50
uint64_t s_session_id
Definition: session.h:309
struct m0_rpc_conn * tre_conn
Definition: sd_common.h:55
int32_t rc
Definition: trigger_fop.h:47
M0_INTERNAL int m0_net_end_point_create(struct m0_net_end_point **epp, struct m0_net_transfer_mc *tm, const char *addr)
Definition: ep.c:56
struct m0_fid g_process_fid
Definition: ut.c:689
M0_INTERNAL void m0_rpc_conn_fini(struct m0_rpc_conn *conn)
Definition: conn.c:558
#define M0_UT_ASSERT(a)
Definition: ut.h:46
#define M0_UNUSED
Definition: misc.h:380