Motr  M0
commands.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 "ut/ut.h" /* M0_UT_ASSERT */
24 #include "lib/misc.h" /* M0_SET0 */
25 #include "lib/semaphore.h" /* m0_semaphore */
26 #include "lib/memory.h" /* m0_alloc */
27 #include "lib/time.h" /* m0_time_seconds */
28 #include "lib/errno.h" /* ENOENT */
29 #include "net/lnet/lnet.h" /* m0_net_lnet_ifaces_get */
30 
31 #include "net/test/commands.h"
32 
33 /* NTC_ == NET_TEST_COMMANDS_ */
34 enum {
43 };
44 
45 static const char NTC_ADDR[] = "0@lo:12345:42:%d";
46 static const size_t NTC_ADDR_LEN = ARRAY_SIZE(NTC_ADDR);
47 static const char NTC_DELIM = ',';
48 
58  unsigned long ntcn_failures;
62  bool ntcn_flag;
64  char *ntcn_addr;
65 };
66 
69 
72 static struct net_test_cmd_node *node;
75 
76 static m0_time_t timeout_get(void)
77 {
78  return m0_time(NTC_TIMEOUT_MS / 1000, NTC_TIMEOUT_MS % 1000 * 1000000);
79 }
80 
82 {
83  return m0_time_add(m0_time_now(), timeout_get());
84 }
85 
86 static int make_addr(char *s, size_t s_len, int svc_id, bool add_comma)
87 {
88  int rc = snprintf(s, s_len, NTC_ADDR, svc_id);
89 
91  M0_ASSERT(rc > 0);
92 
93  if (add_comma) {
94  s[rc++] = NTC_DELIM;
95  s[rc] = '\0';
96  }
97  return rc;
98 }
99 
101 static void fill_addr(uint32_t nr)
102 {
103  char *pos = addr_node;
104  uint32_t i;
105  int diff;
106 
107  /* console */
109  /* nodes */
110  for (i = 0; i < nr; ++i) {
112  NTC_TMID_NODE + i, i != nr - 1);
114  pos += diff;
115  }
116 }
117 
126 static bool commands_ut_assert(struct net_test_cmd_node *node, bool value)
127 {
128  node->ntcn_failures += !value;
130  return value;
131 }
132 
134 static void barrier_init(struct net_test_cmd_node *node)
135 {
136  int rc = m0_semaphore_init(&node->ntcn_signal, 0);
137  M0_UT_ASSERT(rc == 0);
139  M0_UT_ASSERT(rc == 0);
140  node->ntcn_barriers_disabled = false;
141 }
142 
147 static void barrier_fini(struct net_test_cmd_node *node)
148 {
151 }
152 
158 {
162  }
163 }
164 
170 static void barrier_with_nodes(void)
171 {
172  int i;
173 
174  for (i = 0; i < slist_node.ntsl_nr; ++i)
177 
178  for (i = 0; i < slist_node.ntsl_nr; ++i)
180 
181  for (i = 0; i < slist_node.ntsl_nr; ++i)
184 }
185 
190 {
193 }
194 
195 static void flags_reset(size_t nr)
196 {
197  size_t i;
198 
199  for (i = 0; i < nr; ++i)
200  node[i].ntcn_flag = false;
201 }
202 
203 static void flag_set(int index)
204 {
205  node[index].ntcn_flag = true;
206 }
207 
208 static bool is_flags_set(size_t nr, bool set)
209 {
210  size_t i;
211 
212  for (i = 0; i < nr; ++i)
213  if (node[i].ntcn_flag == !set)
214  return false;
215  return true;
216 }
217 
218 static bool is_flags_set_odd(size_t nr)
219 {
220  size_t i;
221 
222  for (i = 0; i < nr; ++i)
223  if (node[i].ntcn_flag == (i + 1) % 2)
224  return false;
225  return true;
226 }
227 
229  struct m0_net_test_cmd_ctx *ctx)
230 {
231  struct m0_net_test_cmd cmd;
232  int rc;
233 
234  M0_SET0(&cmd);
237  cmd.ntc_ep_index = 0;
239  commands_ut_assert(node, rc == 0);
241 }
242 
244  struct m0_net_test_cmd_ctx *ctx,
245  m0_time_t deadline,
246  ssize_t *ep_index)
247 {
248  struct m0_net_test_cmd cmd;
249  int rc;
250 
251  M0_SET0(&cmd);
252  rc = m0_net_test_commands_recv(ctx, &cmd, deadline);
253  commands_ut_assert(node, rc == 0);
254  if (rc != 0)
255  return;
256  if (ep_index == NULL) {
258  commands_ut_assert(node, rc == 0);
259  } else {
260  *ep_index = cmd.ntc_buf_index;
261  }
266 }
267 
269  struct m0_net_test_cmd_ctx *ctx,
270  m0_time_t deadline,
272 {
273  struct m0_net_test_cmd_init *cmd_init;
274  struct m0_net_test_cmd cmd;
275  int rc;
277 
278  M0_SET0(&cmd);
279  rc = m0_net_test_commands_recv(ctx, &cmd, deadline);
280  commands_ut_assert(node, rc == 0);
282  commands_ut_assert(node, rc == 0);
284  if (cmd.ntc_type == M0_NET_TEST_CMD_INIT) {
285  cmd_init = &cmd.ntc_init;
286  commands_ut_assert(node, cmd_init->ntci_role ==
288  commands_ut_assert(node, cmd_init->ntci_type ==
290  commands_ut_assert(node, cmd_init->ntci_msg_nr == 0x10000);
291  commands_ut_assert(node, cmd_init->ntci_msg_size == 0x100000);
293  cmd_init->ntci_msg_concurrency == 0x100);
294  timeout = cmd_init->ntci_buf_send_timeout;
297  commands_ut_assert(node, strncmp(cmd_init->ntci_tm_ep,
298  "0@lo:1:2:3", 64) == 0);
299  /*
300  * m0_net_test_slist serialize/deserialize already checked
301  * in slist UT
302  */
303  commands_ut_assert(node, cmd_init->ntci_ep.ntsl_nr == 3);
304  }
307 }
308 
310 {
311  struct m0_net_test_cmd_ctx *ctx;
312  int rc;
313  ssize_t buf_index;
314 
315  if (node == NULL)
316  return;
317  ctx = &node->ntcn_ctx;
318 
319  node->ntcn_failures = 0;
323  if (!commands_ut_assert(node, rc == 0))
324  return barrier_disable(node);
325 
326  barrier_with_main(node); /* barrier #0 */
327  commands_ut_recv(node, ctx, M0_TIME_NEVER, NULL);/* test #1 */
328  barrier_with_main(node); /* barrier #1.0 */
329  /* main thread will check flags here */
330  barrier_with_main(node); /* barrier #1.1 */
331  commands_ut_send(node, ctx); /* test #2 */
332  barrier_with_main(node); /* barrier #2 */
333  if (node->ntcn_index % 2 != 0) /* test #3 */
335  barrier_with_main(node); /* barrier #3.0 */
336  barrier_with_main(node); /* barrier #4.0 */
337  if (node->ntcn_index % 2 != 0) /* test #4 */
338  commands_ut_recv(node, ctx, timeout_get_abs(), &buf_index);
339  barrier_with_main(node); /* barrier #4.1 */
340  if (node->ntcn_index % 2 != 0) {
342  M0_UT_ASSERT(rc == 0);
343  }
344  barrier_with_main(node); /* barrier #4.2 */
345  /* main thread will check flags here */
346  barrier_with_main(node); /* barrier #4.3 */
347  if (node->ntcn_index % 2 == 0) {
349  }
350  commands_ut_send(node, ctx); /* test #5 */
352  barrier_with_main(node); /* barrier #5.0 */
353  /* main thread will start receiving here */
354  barrier_with_main(node); /* barrier #5.1 */
355  /* test #6 */
356  barrier_with_main(node); /* barrier #6.0 */
358  barrier_with_main(node); /* barrier #6.1 */
359  barrier_with_main(node); /* barrier #6.2 */
361  barrier_with_main(node); /* barrier #6.3 */
362  barrier_with_main(node); /* barrier #6.4 */
364  barrier_with_main(node); /* barrier #6.5 */
365  barrier_with_main(node); /* barrier #6.6 */
367  barrier_with_main(node); /* barrier #6.7 */
368  barrier_with_main(node); /* barrier #6.8 */
370 }
371 
372 static void send_all(size_t nr, struct m0_net_test_cmd *cmd)
373 {
374  int i;
375  int rc;
376 
377  for (i = 0; i < nr; ++i) {
378  cmd->ntc_ep_index = i;
380  M0_UT_ASSERT(rc == 0);
381  }
383 }
384 
385 static void commands_ut_send_all(size_t nr)
386 {
387  struct m0_net_test_cmd cmd;
388 
389  M0_SET0(&cmd);
391  send_all(nr, &cmd);
392 }
393 
394 static void commands_ut_send_all_type(size_t nr,
396 {
397  struct m0_net_test_cmd_init *cmd_init;
398  struct m0_net_test_cmd cmd;
399 
400  M0_SET0(&cmd);
401  cmd.ntc_type = type;
402  if (type == M0_NET_TEST_CMD_INIT) {
403  cmd_init = &cmd.ntc_init;
405  cmd_init->ntci_type = M0_NET_TEST_TYPE_BULK;
406  cmd_init->ntci_msg_nr = 0x10000;
407  cmd_init->ntci_msg_size = 0x100000;
408  cmd_init->ntci_msg_concurrency = 0x100;
409  cmd_init->ntci_buf_send_timeout = M0_MKTIME(2, 3);
410  cmd_init->ntci_tm_ep = "0@lo:1:2:3";
411  m0_net_test_slist_init(&cmd_init->ntci_ep, "1,2,3", ',');
412  } else if (type != M0_NET_TEST_CMD_START &&
415  M0_IMPOSSIBLE("net-test commands UT: invalid command type");
416  }
417  send_all(nr, &cmd);
418  if (type == M0_NET_TEST_CMD_INIT)
419  m0_net_test_slist_fini(&cmd_init->ntci_ep);
420 }
421 
422 static void commands_ut_recv_all(size_t nr, m0_time_t deadline)
423 {
424  struct m0_net_test_cmd cmd;
425  int i;
426  int rc;
427 
428  for (i = 0; i < nr; ++i) {
429  rc = m0_net_test_commands_recv(&console, &cmd, deadline);
430  if (rc == -ETIMEDOUT)
431  break;
432  M0_UT_ASSERT(rc == 0);
434  cmd.ntc_buf_index);
435  M0_UT_ASSERT(rc == 0);
439  flag_set(cmd.ntc_ep_index);
440  }
441 }
442 
443 static void net_test_command_ut(size_t nr)
444 {
445  size_t i;
446  int rc;
447  bool rc_bool;
448 
449  M0_UT_ASSERT(nr > 0);
450 
451  /* prepare addresses */
452  fill_addr(nr);
454  M0_UT_ASSERT(rc == 0);
456  M0_UT_ASSERT(rc_bool);
458  M0_UT_ASSERT(rc == 0);
460  M0_UT_ASSERT(rc_bool);
461  /* init console */
464  NULL, &slist_node);
465  M0_UT_ASSERT(rc == 0);
466  /* alloc nodes */
467  M0_ALLOC_ARR(node, nr);
468  M0_UT_ASSERT(node != NULL);
469 
470  /*
471  start thread for every node because:
472  - some of m0_net_test_commands_*() functions have blocking interface;
473  - m0_net transfer machines parallel initialization is much faster
474  then serial.
475  */
476  for (i = 0; i < nr; ++i) {
477  barrier_init(&node[i]);
478  node[i].ntcn_index = i;
479  rc = M0_THREAD_INIT(&node[i].ntcn_thread,
480  struct net_test_cmd_node *,
481  NULL,
483  &node[i],
484  "node_thread_#%d",
485  (int) i);
486  M0_UT_ASSERT(rc == 0);
487  }
488 
489  barrier_with_nodes(); /* barrier #0 */
490  /*
491  Test #1: console sends command to every node.
492  */
493  flags_reset(nr);
495  barrier_with_nodes(); /* barrier #1.0 */
496  M0_UT_ASSERT(is_flags_set(nr, true));
497  barrier_with_nodes(); /* barrier #1.1 */
498  /*
499  Test #2: every node sends command to console.
500  */
501  flags_reset(nr);
503  M0_UT_ASSERT(is_flags_set(nr, true));
504  barrier_with_nodes(); /* barrier #2 */
505  /*
506  Test #3: half of nodes (node #0, #2, #4, #6, ...) do not send
507  commands, but other half of nodes send.
508  Console receives commands from every node.
509  */
510  flags_reset(nr);
513  barrier_with_nodes(); /* barrier #3.0 */
514  /*
515  Test #4: half of nodes (node #0, #2, #4, #6, ...) do not start
516  waiting for commands, but other half of nodes start.
517  Console sends commands to every node.
518  */
519  barrier_with_nodes(); /* barrier #4.0 */
520  flags_reset(nr);
522  barrier_with_nodes(); /* barrier #4.1 */
523  barrier_with_nodes(); /* barrier #4.2 */
525  barrier_with_nodes(); /* barrier #4.3 */
526  /*
527  Test #5: every node sends two commands, and only after that console
528  starts to receive.
529  */
530  /* nodes will send two commands here */
531  barrier_with_nodes(); /* barrier #5.0 */
533  flags_reset(nr);
534 
535  if (!USE_LIBFAB) {
536  /*
537  In case of libfab, connection oriented endpoints are used.
538  Hence, buffer timeouts are not observed.
539  */
541  M0_UT_ASSERT(is_flags_set(nr, false));
542  }
543 
544  barrier_with_nodes(); /* barrier #5.1 */
545  /*
546  Test #6: console sends all types of commands to every node.
547  */
548  barrier_with_nodes(); /* barrier #6.0 */
549  flags_reset(nr);
551  barrier_with_nodes(); /* barrier #6.1 */
552  M0_UT_ASSERT(is_flags_set(nr, true));
553  barrier_with_nodes(); /* barrier #6.2 */
554  flags_reset(nr);
556  barrier_with_nodes(); /* barrier #6.3 */
557  M0_UT_ASSERT(is_flags_set(nr, true));
558  barrier_with_nodes(); /* barrier #6.4 */
559  flags_reset(nr);
561  barrier_with_nodes(); /* barrier #6.5 */
562  M0_UT_ASSERT(is_flags_set(nr, true));
563  barrier_with_nodes(); /* barrier #6.6 */
564  flags_reset(nr);
566  barrier_with_nodes(); /* barrier #6.7 */
567  M0_UT_ASSERT(is_flags_set(nr, true));
568  barrier_with_nodes(); /* barrier #6.8 */
569  /* stop all threads */
570  for (i = 0; i < nr; ++i) {
571  rc = m0_thread_join(&node[i].ntcn_thread);
572  M0_UT_ASSERT(rc == 0);
573  m0_thread_fini(&node[i].ntcn_thread);
574  barrier_fini(&node[i]);
575  }
576 
577  /* cleanup */
578  m0_free(node);
582 }
583 
585 {
587 }
588 
590 {
592 }
593 
595  struct m0_net_test_cmd *cmd)
596 {
597  m0_time_t deadline;
598  int cmd_rcvd = 0;
599  int rc;
600 
601  /*
602  * Receive command from console and send it back.
603  * Repeat NTC_MULTIPLE_COMMANDS times.
604  */
605  while (cmd_rcvd != NTC_MULTIPLE_COMMANDS) {
606  deadline = m0_time_from_now(0, NTC_CMD_RECV_WAIT_NS);
607  rc = m0_net_test_commands_recv(&node->ntcn_ctx, cmd, deadline);
608  if (rc == -ETIMEDOUT)
609  continue;
610  M0_UT_ASSERT(rc == 0);
611  M0_UT_ASSERT(cmd->ntc_ep_index == 0);
613  cmd->ntc_buf_index);
614  M0_UT_ASSERT(rc == 0);
617  M0_UT_ASSERT(rc == 0);
619  ++cmd_rcvd;
620  }
621 }
622 
624  struct m0_net_test_cmd *cmd)
625 {
626  m0_time_t deadline;
627  int cmd_sent = 0;
628  int cmd_rcvd;
629  int i;
630  int rc;
631 
632  /*
633  * Send command to every node and receive reply.
634  * Repeat NTC_MULTIPLE_COMMANDS times.
635  */
636  while (cmd_sent != NTC_MULTIPLE_COMMANDS) {
638  for (i = 1; i < ARRAY_SIZE(nodes); ++i) {
639  cmd->ntc_ep_index = i - 1;
642  M0_UT_ASSERT(rc == 0);
643  }
645  cmd_rcvd = 0;
646  deadline = timeout_get_abs();
647  while (cmd_rcvd != ARRAY_SIZE(nodes) - 1 &&
648  m0_time_now() <= deadline) {
650  deadline);
651  M0_UT_ASSERT(rc == 0);
653  cmd->ntc_buf_index);
654  M0_UT_ASSERT(rc == 0);
655  ++cmd_rcvd;
657  }
658  M0_UT_ASSERT(cmd_rcvd == ARRAY_SIZE(nodes) - 1);
659  ++cmd_sent;
660  }
661 }
662 
664 {
665  struct m0_net_test_cmd *cmd;
666  struct m0_net_test_slist endpoints;
667  static char buf[NTC_MULTIPLE_NODES * NTC_ADDR_LEN_MAX];
668  int rc;
669  bool console_thread = node == &nodes[0];
670  int i;
671 
672  M0_ALLOC_PTR(cmd);
673  M0_UT_ASSERT(cmd != NULL);
674 
675  if (console_thread) {
676  buf[0] = '\0';
677  for (i = 1; i < ARRAY_SIZE(nodes); ++i) {
678  strncat(buf, nodes[i].ntcn_addr, NTC_ADDR_LEN_MAX - 1);
679  if (i != ARRAY_SIZE(nodes) - 1)
680  strncat(buf, ",", 2);
681  }
682  rc = m0_net_test_slist_init(&endpoints, buf, ',');
683  M0_UT_ASSERT(rc == 0);
684  } else {
685  rc = m0_net_test_slist_init(&endpoints,
686  nodes[0].ntcn_addr, '`');
687  M0_UT_ASSERT(rc == 0);
688  }
690  timeout_get(), NULL, &endpoints);
691  M0_UT_ASSERT(rc == 0);
692 
694 
695  if (console_thread) {
697  } else {
698  commands_node_loop(node, cmd);
699  }
700 
702  m0_net_test_slist_fini(&endpoints);
703  m0_free(cmd);
704 }
705 
706 /* main thread */
708 {
709  struct net_test_cmd_node *node;
710  size_t i;
711  int rc;
712 
713  /* console is node #0 */
714  for (i = 0; i < ARRAY_SIZE(nodes); ++i) {
715  node = &nodes[i];
720  NTC_TMID_START + i, false);
721  }
722  /* start threads */
723  for (i = 0; i < ARRAY_SIZE(nodes); ++i) {
724  node = &nodes[i];
726  struct net_test_cmd_node *, NULL,
728  "cmd_ut #%d", (int)i);
729  M0_UT_ASSERT(rc == 0);
730  }
731  /* barrier with node threads */
732  for (i = 0; i < ARRAY_SIZE(nodes); ++i)
734  for (i = 0; i < ARRAY_SIZE(nodes); ++i)
736  /* stop threads */
737  for (i = 0; i < ARRAY_SIZE(nodes); ++i) {
738  node = &nodes[i];
740  M0_UT_ASSERT(rc == 0);
742  }
743  /* fini nodes */
744  for (i = 0; i < ARRAY_SIZE(nodes); ++i) {
745  node = &nodes[i];
748  }
749 }
750 
751 /*
752  * Local variables:
753  * c-indentation-style: "K&R"
754  * c-basic-offset: 8
755  * tab-width: 8
756  * fill-column: 79
757  * scroll-step: 1
758  * End:
759  */
static void commands_node_loop(struct net_test_cmd_node *node, struct m0_net_test_cmd *cmd)
Definition: commands.c:594
struct m0_semaphore ntcn_signal
Definition: commands.c:55
static size_t nr
Definition: dump.c:1505
static int make_addr(char *s, size_t s_len, int svc_id, bool add_comma)
Definition: commands.c:86
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
static m0_time_t timeout_get(void)
Definition: commands.c:76
struct m0_net_test_slist ntci_ep
Definition: commands.h:157
int m0_net_test_commands_init(struct m0_net_test_cmd_ctx *ctx, const char *cmd_ep, m0_time_t send_timeout, m0_net_test_commands_send_cb_t send_cb, struct m0_net_test_slist *ep_list)
Definition: commands.c:441
#define USE_LIBFAB
Definition: net.h:99
static int(* diff[M0_PARITY_CAL_ALGO_NR])(struct m0_parity_math *math, struct m0_buf *old, struct m0_buf *new, struct m0_buf *parity, uint32_t index)
Definition: parity_math.c:290
#define NULL
Definition: misc.h:38
static struct m0_net_test_slist slist_console
Definition: commands.c:71
bool ntcn_barriers_disabled
Definition: commands.c:60
int m0_thread_join(struct m0_thread *q)
Definition: kthread.c:169
void m0_net_test_cmd_ut_single(void)
Definition: commands.c:584
static void barrier_fini(struct net_test_cmd_node *node)
Definition: commands.c:147
const m0_time_t M0_TIME_NEVER
Definition: time.c:108
uint32_t s_len
Definition: string.h:99
static void commands_ut_send_all(size_t nr)
Definition: commands.c:385
uint64_t m0_time_t
Definition: time.h:37
m0_net_test_cmd_type
Definition: commands.h:78
static char addr_node[NTC_ADDR_LEN_MAX *NTC_MULTIPLE_NODES]
Definition: commands.c:68
static struct net_test_cmd_node * node
Definition: commands.c:72
uint64_t m0_time_nanoseconds(const m0_time_t time)
Definition: time.c:89
static const char NTC_ADDR[]
Definition: commands.c:45
int const char const void * value
Definition: dir.c:325
static void commands_ut_recv_type(struct net_test_cmd_node *node, struct m0_net_test_cmd_ctx *ctx, m0_time_t deadline, enum m0_net_test_cmd_type type)
Definition: commands.c:268
static m0_time_t timeout_get_abs(void)
Definition: commands.c:81
int m0_net_test_commands_recv_enqueue(struct m0_net_test_cmd_ctx *ctx, size_t buf_index)
Definition: commands.c:570
#define M0_THREAD_INIT(thread, TYPE, init, func, arg, namefmt,...)
Definition: thread.h:139
#define M0_SET0(obj)
Definition: misc.h:64
int m0_net_test_slist_init(struct m0_net_test_slist *slist, const char *str, char delim)
Definition: slist.c:57
m0_time_t m0_time(uint64_t secs, long ns)
Definition: time.c:41
Definition: sock.c:887
static void commands_ut_recv(struct net_test_cmd_node *node, struct m0_net_test_cmd_ctx *ctx, m0_time_t deadline, ssize_t *ep_index)
Definition: commands.c:243
static void commands_console_loop(struct net_test_cmd_node *node, struct m0_net_test_cmd *cmd)
Definition: commands.c:623
m0_bcount_t ntci_msg_size
Definition: commands.h:118
static struct m0_net_test_cmd_ctx console
Definition: commands.c:73
bool m0_net_test_slist_unique(const struct m0_net_test_slist *slist)
Definition: slist.c:129
static void net_test_command_ut(size_t nr)
Definition: commands.c:443
int i
Definition: dir.c:1033
static struct m0_net_test_slist slist_node
Definition: commands.c:70
static bool commands_ut_assert(struct net_test_cmd_node *node, bool value)
Definition: commands.c:126
static void commands_ut_send_all_type(size_t nr, enum m0_net_test_cmd_type type)
Definition: commands.c:394
m0_time_t ntci_buf_send_timeout
Definition: commands.h:151
void m0_net_test_commands_received_free(struct m0_net_test_cmd *cmd)
Definition: commands.c:578
void m0_net_test_commands_fini(struct m0_net_test_cmd_ctx *ctx)
Definition: commands.c:451
struct m0_net_test_cmd_init ntc_init
Definition: commands.h:208
enum m0_net_test_role ntci_role
Definition: commands.h:104
int m0_net_test_commands_send(struct m0_net_test_cmd_ctx *ctx, struct m0_net_test_cmd *cmd)
Definition: commands.c:457
#define M0_ASSERT(cond)
static void commands_ut_recv_all(size_t nr, m0_time_t deadline)
Definition: commands.c:422
void m0_net_test_slist_fini(struct m0_net_test_slist *slist)
Definition: slist.c:120
m0_time_t m0_time_now(void)
Definition: time.c:134
void m0_net_test_commands_send_wait_all(struct m0_net_test_cmd_ctx *ctx)
Definition: commands.c:490
static struct net_test_cmd_node nodes[NTC_MULTIPLE_NODES]
Definition: commands.c:74
static void commands_node_thread(struct net_test_cmd_node *node)
Definition: commands.c:309
void m0_thread_fini(struct m0_thread *q)
Definition: thread.c:92
static void commands_ut_send(struct net_test_cmd_node *node, struct m0_net_test_cmd_ctx *ctx)
Definition: commands.c:228
int m0_net_test_commands_recv(struct m0_net_test_cmd_ctx *ctx, struct m0_net_test_cmd *cmd, m0_time_t deadline)
Definition: commands.c:511
size_t ntsl_nr
Definition: slist.h:49
M0_INTERNAL int m0_semaphore_init(struct m0_semaphore *semaphore, unsigned value)
Definition: semaphore.c:38
void * m0_alloc(size_t size)
Definition: memory.c:126
char * ntcn_addr
Definition: commands.c:64
static void flag_set(int index)
Definition: commands.c:203
static void barrier_with_main(struct net_test_cmd_node *node)
Definition: commands.c:157
static const size_t NTC_ADDR_LEN
Definition: commands.c:46
uint64_t ntci_msg_nr
Definition: commands.h:112
uint64_t ntci_msg_concurrency
Definition: commands.h:144
m0_time_t m0_time_add(const m0_time_t t1, const m0_time_t t2)
Definition: time.c:47
static struct fdmi_ctx ctx
Definition: main.c:80
uint64_t m0_time_seconds(const m0_time_t time)
Definition: time.c:83
enum m0_net_test_type ntci_type
Definition: commands.h:106
ssize_t ntc_ep_index
Definition: commands.h:218
static void commands_node_thread2(struct net_test_cmd_node *node)
Definition: commands.c:663
static uint32_t timeout
Definition: console.c:52
static bool is_flags_set(size_t nr, bool set)
Definition: commands.c:208
void m0_net_test_cmd_ut_multiple2(void)
Definition: commands.c:707
static bool is_flags_set_odd(size_t nr)
Definition: commands.c:218
static void barrier_with_nodes(void)
Definition: commands.c:170
static void flags_reset(size_t nr)
Definition: commands.c:195
static void send_all(size_t nr, struct m0_net_test_cmd *cmd)
Definition: commands.c:372
size_t ntc_buf_index
Definition: commands.h:220
static char addr_console[NTC_ADDR_LEN_MAX]
Definition: commands.c:67
static const char NTC_DELIM
Definition: commands.c:47
struct m0_net_test_cmd_done ntc_done
Definition: commands.h:207
static void fill_addr(uint32_t nr)
Definition: commands.c:101
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
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
unsigned long ntcn_failures
Definition: commands.c:58
enum m0_net_test_cmd_type ntc_type
Definition: commands.h:204
void m0_net_test_cmd_ut_multiple(void)
Definition: commands.c:589
#define M0_MKTIME(secs, ns)
Definition: time.h:86
struct m0_net_test_cmd_ctx ntcn_ctx
Definition: commands.c:51
M0_INTERNAL void m0_semaphore_down(struct m0_semaphore *semaphore)
Definition: semaphore.c:49
Definition: nucleus.c:42
struct m0_semaphore ntcn_wait
Definition: commands.c:56
int type
Definition: dir.c:1031
M0_INTERNAL void m0_semaphore_up(struct m0_semaphore *semaphore)
Definition: semaphore.c:65
struct m0_thread ntcn_thread
Definition: commands.c:50
void m0_free(void *data)
Definition: memory.c:146
static struct m0_addb2_source * s
Definition: consumer.c:39
int32_t rc
Definition: trigger_fop.h:47
#define ARRAY_SIZE(a)
Definition: misc.h:45
static void barrier_disable(struct net_test_cmd_node *node)
Definition: commands.c:189
#define M0_UT_ASSERT(a)
Definition: ut.h:46
static void barrier_init(struct net_test_cmd_node *node)
Definition: commands.c:134
char ** ntsl_list
Definition: slist.h:53
#define M0_IMPOSSIBLE(fmt,...)