Motr  M0
group.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2013-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 #include "lib/chan.h"
24 #include "lib/semaphore.h"
25 #include "rm/rm.h"
26 #include "rm/rm_internal.h"
27 #include "rm/rm_fops.h"
28 #include "rm/ut/rmut.h"
29 #include "rm/ut/rings.h"
30 
31 /* Maximum test servers for this testcase */
34 static uint64_t M0_RM_SNS_GROUP = 1;
35 static struct m0_semaphore startup_sem;
36 
37 static void rmg_in_complete(struct m0_rm_incoming *in, int32_t rc)
38 {
39 }
40 
41 static void rmg_in_conflict(struct m0_rm_incoming *in)
42 {
43 }
44 
45 static const struct m0_rm_incoming_ops rmg_incoming_ops = {
47  .rio_conflict = rmg_in_conflict
48 };
49 
50 static void ring_get(enum rm_server srv_id,
51  uint64_t group,
52  enum m0_rm_incoming_flags in_flag,
53  int which_ring)
54 {
55  struct m0_rm_incoming *in = &rm_ctxs[srv_id].rc_test_data.rd_in;
56  struct m0_rm_owner *owner = rm_ctxs[srv_id].rc_test_data.rd_owner;
57  int rc;
58 
59  /*
60  * Test-case - Setup creditor cookie. Group credit request should
61  * succeed.
62  */
63  /* Server-3 is upward creditor for Server with id 'srv_id'*/
64  if (srv_id != SERVER_3)
66 
68  RIP_NONE, RIF_LOCAL_WAIT | in_flag);
69  in->rin_want.cr_datum = which_ring;
72  m0_rm_credit_get(in);
73  m0_rm_owner_lock(owner);
75  m0_rm_owner_unlock(owner);
76  M0_UT_ASSERT(rc == 0);
77  M0_UT_ASSERT(in->rin_rc == 0);
78  m0_rm_credit_put(in);
80 }
81 
82 static void standalone_borrow_verify(void)
83 {
86 
91 }
92 
93 static void standalone_borrow_run(void)
94 {
96 }
97 
98 static void group_revoke_verify(void)
99 {
103 
109 }
110 
111 /*
112  * Test group revoke
113  */
114 static void group_revoke_run(void)
115 {
119 }
120 
121 static void group_borrow_verify(enum rm_server srv_id)
122 {
124  struct m0_rm_owner *dso = rm_ctxs[srv_id].rc_test_data.rd_owner;
125 
129 }
130 
131 /*
132  * Test group borrow
133  */
134 static void group_borrow_run(enum rm_server srv_id)
135 {
137 }
138 
139 static void server1_tests(void)
140 {
144 
145  /* Begin next test */
147 }
148 
149 static void server2_tests(void)
150 {
154 
155  /* Begin next test */
157 
158 }
159 
160 static void server3_tests(void)
161 {
165 
168 }
169 
170 static void rm_server_start(const int tid)
171 {
172  if (tid < test_servers_nr) {
173  rings_utdata_ops_set(&rm_ctxs[tid].rc_test_data);
174  rm_ctx_server_start(tid);
175  /* Signal that RM server is started */
177  }
178 
179  switch(tid) {
180  case SERVER_1:
181  server1_tests();
182  break;
183  case SERVER_2:
184  server2_tests();
185  break;
186  case SERVER_3:
187  server3_tests();
188  break;
189  default:
190  break;
191  }
192 }
193 
194 /*
195  * Hierarchy description:
196  * SERVER_1 is downward debtor for SERVER_3 and belongs to group
197  * M0_RM_SNS_GROUP.
198  * SERVER_2 is downward debtor for SERVER_3 and also belongs to group
199  * M0_RM_SNS_GROUP.
200  * SERVER_3 is upward creditor for SERVER_1 and SERVER_2.
201  */
202 static void server_hier_config(void)
203 {
207 
211 
216 }
217 
218 static void rm_group_utinit(void)
219 {
220  uint32_t i;
221 
222  test_servers_nr = 3;
223  for (i = 0; i < test_servers_nr; ++i)
224  rm_ctx_init(&rm_ctxs[i], i);
229 
230  /* Set up test sync points */
231  for (i = 0; i < GROUP_TESTS_NR; ++i) {
234  }
236 }
237 
238 static void rm_group_utfini(void)
239 {
240  int32_t i;
241 
242  /*
243  * Following loops cannot be combined.
244  * The ops within the loops need sync points. Hence they are separate.
245  */
246  /* De-construct RM objects hierarchy */
247  for (i = test_servers_nr - 1; i >= 0; --i) {
249  }
250  /* Disconnect the servers */
251  for (i = test_servers_nr - 1; i >= 0; --i) {
253  }
255  /*
256  * Finalise the servers. Must be done in the reverse order, so that the
257  * first initialised reqh is finalised last.
258  */
259  for (i = test_servers_nr - 1; i >= 0; --i) {
260  rm_ctx_fini(&rm_ctxs[i]);
261  }
262  for (i = 0; i < GROUP_TESTS_NR; ++i) {
265  }
269 }
270 
271 void rm_group_test(void)
272 {
273  int rc;
274  int i;
275  bool ok;
276 
277  rm_group_utinit();
278  /* Start RM servers */
279  for (i = 0; i < test_servers_nr; ++i) {
280  rc = M0_THREAD_INIT(&rm_ctxs[i].rc_thr, int, NULL,
281  &rm_server_start, i, "rm_server_%d", i);
282  M0_UT_ASSERT(rc == 0);
283  }
284 
285  /* Wait till all RM servers are started */
286  for (i = 0; i < test_servers_nr; ++i) {
288  m0_time_from_now(5, 0));
289  M0_UT_ASSERT(ok);
290  }
291 
292  /* Now start the tests */
294  for (i = 0; i < test_servers_nr; ++i) {
295  m0_thread_join(&rm_ctxs[i].rc_thr);
296  m0_thread_fini(&rm_ctxs[i].rc_thr);
297  }
298  rm_group_utfini();
299 }
300 
301 /*
302  * Local variables:
303  * c-indentation-style: "K&R"
304  * c-basic-offset: 8
305  * tab-width: 8
306  * fill-column: 80
307  * scroll-step: 1
308  * End:
309  */
Definition: rmut.h:47
static void server3_tests(void)
Definition: group.c:160
M0_INTERNAL void m0_chan_wait(struct m0_clink *link)
Definition: chan.c:336
static void server2_tests(void)
Definition: group.c:149
uint64_t cr_datum
Definition: rm.h:514
#define NULL
Definition: misc.h:38
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
Definition: chan.c:201
struct rm_ctx rm_ctxs[SERVER_NR]
Definition: rmut.c:54
M0_INTERNAL void m0_clink_del_lock(struct m0_clink *link)
Definition: chan.c:293
void creditor_cookie_setup(enum rm_server dsrv_id, enum rm_server csrv_id)
Definition: rmut.c:420
int m0_thread_join(struct m0_thread *q)
Definition: kthread.c:169
void(* rio_complete)(struct m0_rm_incoming *in, int32_t rc)
Definition: rm.h:1493
const m0_time_t M0_TIME_NEVER
Definition: time.c:108
static void standalone_borrow_run(void)
Definition: group.c:93
static void server1_tests(void)
Definition: group.c:139
M0_INTERNAL bool m0_semaphore_timeddown(struct m0_semaphore *semaphore, const m0_time_t abs_timeout)
Definition: semaphore.c:75
static void rm_ctx_init(struct m0_rm_lock_ctx *ctx, struct m0_client *m0c, struct m0_fid *fid)
Definition: obj_lock.c:114
struct rm_ut_data rc_test_data
Definition: rmut.h:133
static void rm_server_start(const int tid)
Definition: group.c:170
struct m0_rm_owner * rd_owner
Definition: rmut.h:112
#define M0_BITS(...)
Definition: misc.h:236
#define M0_THREAD_INIT(thread, TYPE, init, func, arg, namefmt,...)
Definition: thread.h:139
struct m0_rm_credit rin_want
Definition: rm.h:1450
static void ring_get(enum rm_server srv_id, uint64_t group, enum m0_rm_incoming_flags in_flag, int which_ring)
Definition: group.c:50
static void rmg_in_conflict(struct m0_rm_incoming *in)
Definition: group.c:41
Definition: rmut.h:48
M0_INTERNAL int m0_sm_timedwait(struct m0_sm *mach, uint64_t states, m0_time_t deadline)
Definition: sm.c:387
static struct m0_semaphore startup_sem
Definition: group.c:35
m0_rm_incoming_flags
Definition: rm.h:1183
static void rm_ctx_fini(struct m0_ref *ref)
Definition: obj_lock.c:168
int i
Definition: dir.c:1033
struct m0_sm rin_sm
Definition: rm.h:1436
struct m0_chan rm_ut_tests_chan
Definition: rmut.c:55
Definition: rmut.h:46
void loan_session_set(enum rm_server csrv_id, enum rm_server dsrv_id)
Definition: rmut.c:399
Definition: rings.h:38
struct m0_tl ro_borrowed
Definition: rm.h:1033
M0_INTERNAL void m0_rm_incoming_init(struct m0_rm_incoming *in, struct m0_rm_owner *owner, enum m0_rm_incoming_type type, enum m0_rm_incoming_policy policy, uint64_t flags)
Definition: rm.c:1060
rm_server
Definition: rmut.h:45
M0_INTERNAL void m0_chan_init(struct m0_chan *chan, struct m0_mutex *ch_guard)
Definition: chan.c:96
static void standalone_borrow_verify(void)
Definition: group.c:82
void rm_ctxs_conf_fini(struct rm_ctx *rm_ctxs, int ctxs_nr)
Definition: rmut.c:382
struct m0_tl ro_sublet
Definition: rm.h:1042
void m0_thread_fini(struct m0_thread *q)
Definition: thread.c:92
const struct m0_rm_incoming_ops * rin_ops
Definition: rm.h:1471
int32_t rin_rc
Definition: rm.h:1446
static void group_borrow_verify(enum rm_server srv_id)
Definition: group.c:121
enum rm_server debtor_id[SERVER_NR - 1]
Definition: rmut.h:137
M0_INTERNAL int m0_semaphore_init(struct m0_semaphore *semaphore, unsigned value)
Definition: semaphore.c:38
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
Definition: mutex.c:35
static const struct m0_rm_incoming_ops rmg_incoming_ops
Definition: group.c:45
static void group(void)
Definition: sm.c:386
uint32_t rc_debtors_nr
Definition: rmut.h:134
M0_INTERNAL void m0_chan_signal_lock(struct m0_chan *chan)
Definition: chan.c:165
void rm_ctxs_conf_init(struct rm_ctx *rm_ctxs, int ctxs_nr)
Definition: rmut.c:345
static void server_hier_config(void)
Definition: group.c:202
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
Definition: chan.c:255
static struct m0_clink group_tests_clink[GROUP_TESTS_NR]
Definition: group.c:33
M0_INTERNAL void m0_rm_credit_put(struct m0_rm_incoming *in)
Definition: rm.c:1797
static enum rm_server test_servers_nr
Definition: group.c:32
static uint64_t M0_RM_SNS_GROUP
Definition: group.c:34
M0_INTERNAL void m0_semaphore_fini(struct m0_semaphore *semaphore)
Definition: semaphore.c:45
m0_time_t m0_time_from_now(uint64_t secs, long ns)
Definition: time.c:96
bool m0_rm_ur_tlist_is_empty(const struct m0_tl *list)
struct m0_tl ro_owned[OWOS_NR]
Definition: rm.h:1047
enum rm_server creditor_id
Definition: rmut.h:136
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
Definition: mutex.c:42
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
Definition: chan.c:208
M0_INTERNAL void m0_rm_incoming_fini(struct m0_rm_incoming *in)
Definition: rm.c:1099
struct m0_rm_incoming rd_in
Definition: rmut.h:113
M0_INTERNAL void m0_rm_owner_unlock(struct m0_rm_owner *owner)
Definition: rm.c:603
#define M0_UINT128(hi, lo)
Definition: types.h:40
Definition: rings.h:45
void rings_utdata_ops_set(struct rm_ut_data *data)
Definition: rings.c:375
static void group_borrow_run(enum rm_server srv_id)
Definition: group.c:134
static void rmg_in_complete(struct m0_rm_incoming *in, int32_t rc)
Definition: group.c:37
M0_INTERNAL void m0_rm_owner_lock(struct m0_rm_owner *owner)
Definition: rm.c:592
M0_INTERNAL void m0_semaphore_up(struct m0_semaphore *semaphore)
Definition: semaphore.c:65
struct m0_uint128 cr_group_id
Definition: rm.h:506
void rm_ctx_server_stop(enum rm_server srv_id)
Definition: rmut.c:291
void rm_group_test(void)
Definition: group.c:271
static void group_revoke_verify(void)
Definition: group.c:98
static void rm_group_utfini(void)
Definition: group.c:238
M0_INTERNAL void m0_chan_fini_lock(struct m0_chan *chan)
Definition: chan.c:112
static void rm_group_utinit(void)
Definition: group.c:218
int32_t rc
Definition: trigger_fop.h:47
struct m0_mutex rm_ut_tests_chan_mutex
Definition: rmut.c:56
void rm_ctx_server_start(enum rm_server srv_id)
Definition: rmut.c:222
#define M0_UT_ASSERT(a)
Definition: ut.h:46
M0_INTERNAL void m0_rm_credit_get(struct m0_rm_incoming *in)
Definition: rm.c:1758
void rm_ctx_server_owner_windup(enum rm_server srv_id)
Definition: rmut.c:264
static void group_revoke_run(void)
Definition: group.c:114
Definition: rm.h:1156