Motr  M0
console_u.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 <stdio.h> /* printf */
24 #include <string.h> /* strlen */
25 
26 #include "lib/getopts.h" /* m0_getopts */
27 #include "lib/errno.h" /* EINVAL */
28 #include "lib/memory.h" /* m0_alloc */
29 #include "lib/time.h" /* m0_time_t */
30 #include "lib/arith.h" /* min_type */
31 #include "lib/trace.h" /* parse_trace_buffer */
32 
33 #include "motr/init.h" /* m0_init */
34 #include "module/instance.h" /* m0 */
35 
36 #include "net/test/user_space/common_u.h" /* m0_net_test_u_str_copy */
37 #include "net/test/slist.h" /* m0_net_test_slist */
38 #include "net/test/stats.h" /* m0_net_test_stats */
39 #include "net/test/console.h" /* m0_net_test_console_ctx */
40 #include "net/test/initfini.h" /* m0_net_test_init */
41 
108 #define DESCRIBE(field, name, description) \
109  static const char *msg_##field = description; \
110  static const char opt_##field = name
111 
112 
113 /* Description messages for m0_net_test_console_cfg fields */
114 DESCRIBE(addr_console4servers, 'A', "Console command endpoint address "
115  "for the test servers");
116 DESCRIBE(addr_console4clients, 'a', "Console command endpoint address "
117  "for the test clients");
118 DESCRIBE(servers, 'C', "List of test server command endpoints");
119 DESCRIBE(clients, 'c', "List of test client command endpoints");
120 DESCRIBE(data_servers, 'D', "List of test server data endpoints");
121 DESCRIBE(data_clients, 'd', "List of test client data endpoints");
122 DESCRIBE(test_type, 't', "Test type, 'ping' or 'bulk'");
123 DESCRIBE(msg_nr, 'n', "Number of test messages for the "
124  "test client (for each server)");
125 DESCRIBE(msg_size, 's', "Test message size");
126 DESCRIBE(test_time_limit, 'T', "Test run time limit, seconds");
127 DESCRIBE(bd_buf_nr_server, 'B', "Number of message buffers for bulk buffer "
128  "network descriptors for the test server");
129 DESCRIBE(bd_buf_nr_client, 'b', "Number of message buffers for bulk buffer "
130  "network descriptors for the test client");
131 DESCRIBE(bd_buf_size, 'f', "Size of buffer for bulk buffer "
132  "network descriptors");
133 DESCRIBE(bd_nr_max, 'g', "Maximum number of bulk buffer "
134  "network descriptors in msg buffer");
135 DESCRIBE(concurrency_server, 'E', "Test server concurrency");
136 DESCRIBE(concurrency_client, 'e', "Test client concurrency");
137 
142 static bool produce_parsable_output = true;
143 
147 static bool parse_trace_buffer = false;
148 
149 static bool addr_check(const char *addr)
150 {
151  if (addr == NULL)
152  return false;
153  if (strlen(addr) == 0)
154  return false;
156  return true;
157 }
158 
159 static bool addr_list_check(struct m0_net_test_slist *slist)
160 {
161  size_t i;
162 
163  if (!m0_net_test_slist_invariant(slist))
164  return false;
165  if (slist->ntsl_nr == 0)
166  return false;
167  for (i = 0; i < slist->ntsl_nr; ++i)
168  if (!addr_check(slist->ntsl_list[i]))
169  return false;
170  return true;
171 }
172 
173 static bool config_check(struct m0_net_test_console_cfg *cfg)
174 {
177  return false;
178  if (!addr_list_check(&cfg->ntcc_servers) ||
180  return false;
181  if (!addr_list_check(&cfg->ntcc_data_servers) ||
183  return false;
185  return false;
187  return false;
188  if (!(cfg->ntcc_test_type == M0_NET_TEST_TYPE_PING ||
190  return false;
191  if (cfg->ntcc_msg_nr == 0 || cfg->ntcc_msg_size == 0)
192  return false;
194  (cfg->ntcc_bd_buf_nr_server == 0 ||
195  cfg->ntcc_bd_buf_nr_client == 0 ||
196  cfg->ntcc_bd_buf_size == 0 ||
197  cfg->ntcc_bd_nr_max == 0))
198  return false;
199  if (cfg->ntcc_concurrency_server == 0 ||
200  cfg->ntcc_concurrency_client == 0)
201  return false;
202  return true;
203 }
204 
205 static void print_slist(char *name, struct m0_net_test_slist *slist)
206 {
207  size_t i;
208 
209  M0_PRE(slist != NULL);
210 
211  m0_net_test_u_printf_v("%s: size\t= %lu\n", name, slist->ntsl_nr);
212  for (i = 0; i < slist->ntsl_nr; ++i)
213  m0_net_test_u_printf_v("%lu | %s\n", i, slist->ntsl_list[i]);
214 }
215 
216 static void config_print(struct m0_net_test_console_cfg *cfg)
217 {
219  m0_net_test_u_print_s("addr_console4servers\t= %s\n",
221  m0_net_test_u_print_s("addr_console4clients\t= %s\n",
223  print_slist("ntcc_servers", &cfg->ntcc_servers);
224  print_slist("ntcc_clients", &cfg->ntcc_clients);
225  print_slist("ntcc_data_servers", &cfg->ntcc_data_servers);
226  print_slist("ntcc_data_clients", &cfg->ntcc_data_clients);
227  m0_net_test_u_print_time("ntcc_cmd_send_timeout",
228  cfg->ntcc_cmd_send_timeout);
229  m0_net_test_u_print_time("ntcc_cmd_recv_timeout",
230  cfg->ntcc_cmd_send_timeout);
231  m0_net_test_u_print_time("ntcc_buf_send_timeout",
232  cfg->ntcc_cmd_send_timeout);
233  m0_net_test_u_print_time("ntcc_buf_recv_timeout",
234  cfg->ntcc_cmd_send_timeout);
235  m0_net_test_u_printf_v("ntcc_test_type\t\t= %s\n",
236  cfg->ntcc_test_type == M0_NET_TEST_TYPE_PING ? "ping" :
237  cfg->ntcc_test_type == M0_NET_TEST_TYPE_BULK ? "bulk" :
238  "UNKNOWN");
239  m0_net_test_u_printf_v("ntcc_msg_nr\t\t= %lu\n",
240  cfg->ntcc_msg_nr);
241  m0_net_test_u_printf_v("ntcc_msg_size\t\t= %lu\n",
242  cfg->ntcc_msg_size);
243  m0_net_test_u_printf_v("ntcc_concurrency_server\t= %lu\n",
245  m0_net_test_u_printf_v("ntcc_concurrency_client\t= %lu\n",
247 }
248 
249 static int configure(int argc, char *argv[],
250  struct m0_net_test_console_cfg *cfg)
251 {
252  bool list_if = false;
253  bool success = true;
254 
255 #define NUMBER_ARG(name) \
256  M0_NUMBERARG(opt_##name, msg_##name, \
257  LAMBDA(void, (int64_t nr) { \
258  if (nr <= 0) \
259  success = false; \
260  else \
261  cfg->ntcc_##name = nr; \
262  }))
263 #define SCALED_ARG(name) \
264  M0_SCALEDARG(opt_##name, msg_##name, \
265  LAMBDA(void, (m0_bcount_t size) { \
266  if (size <= 0) \
267  success = false; \
268  else \
269  cfg->ntcc_##name = size; \
270  }))
271 #define SLIST_ARG(name) \
272  M0_STRINGARG(opt_##name, msg_##name, \
273  LAMBDA(void, (const char *str) { \
274  success &= \
275  m0_net_test_slist_init(&cfg->ntcc_##name, \
276  str, ',') == 0; \
277  }))
278 #define ASCIIZ_ARG(name) \
279  M0_STRINGARG(opt_##name, msg_##name, \
280  LAMBDA(void, (const char *str) { \
281  cfg->ntcc_##name = m0_net_test_u_str_copy(str); \
282  }))
283 #define TIME_ARG(name) \
284  M0_NUMBERARG(opt_##name, msg_##name, \
285  LAMBDA(void, (int64_t nr) { \
286  if (nr <= 0) \
287  success = false; \
288  else \
289  cfg->ntcc_##name = M0_MKTIME(nr, 0); \
290  }))
291 
292  M0_GETOPTS("m0nettest", argc, argv,
297  SLIST_ARG(data_servers),
298  SLIST_ARG(data_clients),
299  M0_STRINGARG(opt_test_type, msg_test_type,
300  LAMBDA(void, (const char *type) {
301  if (strncmp(type, "ping", 5) == 0)
303  else if (strncmp(type, "bulk", 5) == 0)
305  else
306  success = false;
307  })),
308  NUMBER_ARG(msg_nr),
309  TIME_ARG(test_time_limit),
310  SCALED_ARG(msg_size),
311  NUMBER_ARG(bd_buf_nr_server),
312  NUMBER_ARG(bd_buf_nr_client),
313  SCALED_ARG(bd_buf_size),
314  NUMBER_ARG(bd_nr_max),
315  NUMBER_ARG(concurrency_server),
316  NUMBER_ARG(concurrency_client),
317  M0_FLAGARG('p', "Parsable output", &produce_parsable_output),
318  M0_FLAGARG('P', "Parse trace buffer (from stdin to stdout)",
321  M0_IFLISTARG(&list_if),
322  M0_HELPARG('?'),
323  );
324  if (!list_if)
325  config_print(cfg);
326  if (!parse_trace_buffer)
327  success &= config_check(cfg);
328  return list_if ? 1 : success ? 0 : -1;
329 #undef NUMBER_ARG
330 #undef SCALED_ARG
331 #undef SLIST_ARG
332 #undef ASCIIZ_ARG
333 }
334 
335 static void config_free(struct m0_net_test_console_cfg *cfg)
336 {
343 }
344 
346  enum m0_net_test_role role,
347  enum m0_net_test_cmd_type cmd_type,
348  const char *text_pre,
349  const char *text_post)
350 {
351  int rc;
352 
353  if (text_pre != NULL)
354  m0_net_test_u_printf_v("%s\n", text_pre);
355  rc = m0_net_test_console_cmd(ctx, role, cmd_type);
356  if (text_post != NULL)
357  m0_net_test_u_printf_v("%s (%d node%s)\n",
358  text_post, rc, rc != 1 ? "s" : "");
359  return rc != 0;
360 }
361 
362 static void print_msg_nr(const char *descr, struct m0_net_test_msg_nr *msg_nr)
363 {
364  m0_net_test_u_printf_v("%s = %lu/%lu/%lu", descr, msg_nr->ntmn_total,
365  msg_nr->ntmn_failed, msg_nr->ntmn_bad);
366 }
367 
368 static void print_stats(const char *descr,
369  struct m0_net_test_stats *stats)
370 {
371  m0_net_test_u_printf_v("%s = %lu/%lu/%lu/%.0f/%.0f", descr,
372  stats->nts_count, stats->nts_min, stats->nts_max,
375 }
376 
377 static void bsize_print(const char *descr,
379  double msg_nr)
380 {
381  m0_net_test_u_printf(descr);
382  m0_net_test_u_print_bsize(msg_nr * ctx->ntcc_cfg->ntcc_msg_size);
383 }
384 
385 static double avg_total(m0_time_t diff_t, double msg_nr)
386 {
387  unsigned long diff = m0_time_seconds(diff_t) * M0_TIME_ONE_SECOND +
388  m0_time_nanoseconds(diff_t);
389 
390  return diff == 0 ? 0. : msg_nr * M0_TIME_ONE_SECOND / diff;
391 }
392 
394 {
395  struct m0_net_test_cmd_status_data *sd;
396  struct m0_net_test_msg_nr *send_nr;
397  struct m0_net_test_msg_nr *recv_nr;
398  m0_time_t diff_t;
399  m0_time_t rtt_t;
400  unsigned long rtt;
401  double avg_o;
402  double avg_i;
403  double total_o;
404  double total_i;
405  bool type_ping;
406 
407  type_ping = ctx->ntcc_cfg->ntcc_test_type == M0_NET_TEST_TYPE_PING;
408  sd = ctx->ntcc_clients.ntcrc_sd;
409  send_nr = type_ping ? &sd->ntcsd_msg_nr_send : &sd->ntcsd_bulk_nr_send;
410  recv_nr = type_ping ? &sd->ntcsd_msg_nr_recv : &sd->ntcsd_bulk_nr_recv;
411  total_o = send_nr->ntmn_total;
412  total_i = recv_nr->ntmn_total;
413  if (sd->ntcsd_finished) {
414  diff_t = m0_time_sub(sd->ntcsd_time_finish,
415  sd->ntcsd_time_start);
416  avg_o = avg_total(diff_t, total_o);
417  avg_i = avg_total(diff_t, total_i);
418  } else {
421  }
422  bsize_print("avg out: ", ctx, avg_o);
423  bsize_print("/s avg in: ", ctx, avg_i);
424  bsize_print("/s total out: ", ctx, total_o);
425  bsize_print(" total in: ", ctx, total_i);
426 
427  rtt_t = m0_net_test_stats_avg(&sd->ntcsd_rtt);
428  rtt = m0_time_seconds(rtt_t) * M0_TIME_ONE_SECOND +
429  m0_time_nanoseconds(rtt_t);
430  m0_net_test_u_printf(" avg RTT: % 10.3f us", rtt / 1000.);
431 
432  m0_net_test_u_printf("\n");
433 }
434 
435 static void print_msg_nr_parsable(const char *prefix,
436  struct m0_net_test_msg_nr *msg_nr)
437 {
438 #define CONSOLE_PRINT_MSG_NR(name) \
439  printf("%s_"#name" %lu ", prefix, msg_nr->ntmn_##name)
441  CONSOLE_PRINT_MSG_NR(failed);
443 #undef CONSOLE_PRINT_MSG_NR
444 }
445 
446 static void print_stats_parsable(const char *prefix,
447  struct m0_net_test_stats *stats)
448 {
449 #define CONSOLE_PRINT_STATS(name) \
450  printf("%s_"#name" %lu ", prefix, stats->nts_##name);
454 #undef CONSOLE_PRINT_STATS
455  printf("%s_avg %.0f ", prefix, m0_net_test_stats_avg(stats));
456  printf("%s_stddev %.0f ", prefix, m0_net_test_stats_stddev(stats));
457 }
458 
459 static void
461  bool parsable)
462 {
463  size_t i;
464  struct {
465  const char *prefix_p;
466  const char *prefix_v;
467  struct m0_net_test_msg_nr *messages;
468  } msg_nr[] = {
469  { .prefix_p = "sent",
470  .prefix_v = "sent",
471  .messages = &sd->ntcsd_msg_nr_send },
472  { .prefix_p = "received",
473  .prefix_v = ", received",
474  .messages = &sd->ntcsd_msg_nr_recv },
475  { .prefix_p = "bulk_sent",
476  .prefix_v = ", bulk sent",
477  .messages = &sd->ntcsd_bulk_nr_send },
478  { .prefix_p = "bulk_received",
479  .prefix_v = ", bulk received",
480  .messages = &sd->ntcsd_bulk_nr_recv },
481  { .prefix_p = "transfers",
482  .prefix_v = ", transfers",
483  .messages = &sd->ntcsd_transfers }
484  };
485  struct {
486  const char *prefix_p;
487  const char *prefix_v;
488  struct m0_net_test_stats *stats;
489  } stats[] = {
490  { .prefix_p = "mps_sent",
491  .prefix_v = "MPS, sent",
492  .stats = &sd->ntcsd_mps_send.ntmps_stats },
493  { .prefix_p = "mps_received",
494  .prefix_v = ", MPS, received",
495  .stats = &sd->ntcsd_mps_recv.ntmps_stats },
496  { .prefix_p = "rtt",
497  .prefix_v = ", RTT",
498  .stats = &sd->ntcsd_rtt },
499  };
500 
501  M0_PRE(sd != NULL);
502 
503  if (!parsable)
504  m0_net_test_u_printf_v("messages total/failed/bad: ");
505  for (i = 0; i < ARRAY_SIZE(msg_nr); ++i) {
506  (parsable ? print_msg_nr_parsable : print_msg_nr)
507  (parsable ? msg_nr[i].prefix_p : msg_nr[i].prefix_v,
508  msg_nr[i].messages);
509  }
510  if (!parsable)
511  m0_net_test_u_printf_v("; count/min/max/avg/stddev: ");
512  for (i = 0; i < ARRAY_SIZE(stats); ++i) {
513  (parsable ? print_stats_parsable : print_stats)
514  (parsable ? stats[i].prefix_p : stats[i].prefix_v,
515  stats[i].stats);
516  }
517  if (!parsable)
518  m0_net_test_u_printf_v(" ns\n");
519 }
520 
522 {
524 }
525 
526 static void print_status_data_parsable(const char *prefix,
527  struct m0_net_test_cmd_status_data *sd)
528 {
529  printf("%s ", prefix);
531  printf("time_start = %" PRIu64 " ", sd->ntcsd_time_start);
532  printf("time_finish = %" PRIu64 "\n", sd->ntcsd_time_finish);
533 }
534 
536 {
537  enum m0_net_test_role role;
538  enum m0_net_test_role role1;
540  m0_time_t status_interval = M0_MKTIME(1, 0);
541  m0_time_t time_left;
542  bool good;
543  bool verbose;
544 
546  "INIT => test servers",
547  "test servers => INIT DONE");
548  if (!good)
549  return -ENETUNREACH;
551  "INIT => test clients",
552  "test clients => INIT DONE");
553  if (!good)
554  return -ENETUNREACH;
556  "START => test servers",
557  "test servers => START DONE");
558  if (!good)
559  return -ENETUNREACH;
561  "START => test clients",
562  "test clients => START DONE");
563  if (!good)
564  return -ENETUNREACH;
565  role = ctx->ntcc_cfg->ntcc_test_type == M0_NET_TEST_TYPE_PING ?
569  time_left = ctx->ntcc_cfg->ntcc_test_time_limit;
570  ctx->ntcc_clients.ntcrc_sd->ntcsd_finished = false;
571  while (!ctx->ntcc_clients.ntcrc_sd->ntcsd_finished &&
572  time_left != 0) {
574  m0_nanosleep(min_check(status_interval, time_left), NULL);
575  time_left = time_left > status_interval ?
576  time_left - status_interval : 0;
578  NULL, NULL);
579  good = good ? console_step(ctx, role1, M0_NET_TEST_CMD_STATUS,
580  NULL, NULL) : good;
581  if (!good) {
582  m0_net_test_u_printf("STATUS DATA command failed.\n");
583  } else {
585  ctx->ntcc_clients.ntcrc_sd :
586  ctx->ntcc_servers.ntcrc_sd);
588  }
589  }
592  if (!good)
593  return -ENETUNREACH;
595  "STOP => test clients",
596  "test clients => STOP DONE");
597  if (!good)
598  return -ENETUNREACH;
601  if (!good)
602  return -ENETUNREACH;
604  "STOP => test servers",
605  "test servers => STOP DONE");
606  if (!good)
607  return -ENETUNREACH;
610  m0_net_test_u_printf_v("clients total: ");
611  print_status_data_v(ctx->ntcc_clients.ntcrc_sd);
612  m0_net_test_u_printf_v("servers total: ");
613  print_status_data_v(ctx->ntcc_servers.ntcrc_sd);
616  print_status_data_parsable("clients",
617  ctx->ntcc_clients.ntcrc_sd);
618  print_status_data_parsable("servers",
619  ctx->ntcc_servers.ntcrc_sd);
620  }
621  return 0;
622 }
623 
624 int main(int argc, char *argv[])
625 {
626  static struct m0 instance;
627 
628  int rc;
630  struct m0_net_test_console_cfg cfg = {
632  .ntcc_addr_console4clients = NULL,
634  .ntcc_cmd_send_timeout = M0_MKTIME(10, 0),
635  .ntcc_cmd_recv_timeout = M0_MKTIME(10, 0),
636  .ntcc_buf_send_timeout = M0_MKTIME(3, 0),
637  .ntcc_buf_recv_timeout = M0_MKTIME(3, 0),
638  .ntcc_buf_bulk_timeout = M0_MKTIME(3, 0),
639  .ntcc_test_type = M0_NET_TEST_TYPE_PING,
640  .ntcc_msg_nr = 0,
641  .ntcc_test_time_limit = M0_TIME_NEVER,
642  .ntcc_msg_size = 0,
643  .ntcc_bd_buf_nr_client = 0,
644  .ntcc_bd_buf_nr_server = 0,
645  .ntcc_bd_buf_size = 0,
646  .ntcc_bd_nr_max = 0,
647  .ntcc_concurrency_server = 0,
648  .ntcc_concurrency_client = 0,
649  };
650 
651  rc = m0_init(&instance);
652  m0_net_test_u_print_error("Motr initialization failed", rc);
653  if (rc != 0)
654  return rc;
655 
656  rc = m0_net_test_init();
657  m0_net_test_u_print_error("Net-test initialization failed", rc);
658  if (rc != 0)
659  goto motr_fini;
660 
661  rc = configure(argc, argv, &cfg);
662  if (rc != 0) {
663  if (rc == 1) {
665  rc = 0;
666  } else {
668  m0_net_test_u_printf("Error in configuration.\n");
669  config_free(&cfg);
670  }
671  goto net_test_fini;
672  }
673  if (parse_trace_buffer) {
674  rc = m0_trace_parse(stdin, stdout, NULL,
676  goto net_test_fini;
677  }
678 
680  m0_net_test_u_print_error("Test console initialization failed", rc);
681  if (rc != 0)
682  goto cfg_free;
683 
684  rc = console_run(&console);
685  m0_net_test_u_print_error("Test console running failed", rc);
686 
688 cfg_free:
689  config_free(&cfg);
692 motr_fini:
693  m0_fini();
694 
695  return rc;
696 }
697 
702 /*
703  * Local variables:
704  * c-indentation-style: "K&R"
705  * c-basic-offset: 8
706  * tab-width: 8
707  * fill-column: 79
708  * scroll-step: 1
709  * End:
710  */
int m0_net_test_init(void)
Definition: initfini.c:37
#define M0_GETOPTS(progname, argc, argv,...)
Definition: getopts.h:169
static int net_test_fini(void)
Definition: main.c:54
static void print_stats_parsable(const char *prefix, struct m0_net_test_stats *stats)
Definition: console_u.c:446
int m0_net_test_u_printf_v(const char *fmt,...)
Definition: common_u.c:174
#define SCALED_ARG(name)
#define M0_PRE(cond)
static bool addr_check(const char *addr)
Definition: console_u.c:149
#define M0_FLAGARG(ch, desc, ptr)
Definition: getopts.h:232
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 char * addr_console4clients
Definition: client_server.c:60
void m0_net_test_u_print_bsize(double bsize)
Definition: common_u.c:80
static void print_status_data(struct m0_net_test_console_ctx *ctx)
Definition: console_u.c:393
bool m0_net_test_u_printf_verbose
Definition: common_u.c:43
struct m0_net_test_mps ntcsd_mps_recv
Definition: commands.h:186
void m0_fini(void)
Definition: init.c:318
const m0_time_t M0_TIME_NEVER
Definition: time.c:108
enum m0_net_test_type ntcc_test_type
Definition: console.h:92
struct m0_net_test_stats ntcsd_rtt
Definition: commands.h:192
static void bsize_print(const char *descr, struct m0_net_test_console_ctx *ctx, double msg_nr)
Definition: console_u.c:377
uint64_t m0_time_t
Definition: time.h:37
#define min_check(a, b)
Definition: arith.h:88
m0_net_test_cmd_type
Definition: commands.h:78
#define M0_VERBOSEFLAGARG
Definition: common_u.h:43
#define M0_IFLISTARG(pflag)
Definition: common_u.h:45
void m0_net_test_fini(void)
Definition: initfini.c:42
uint64_t m0_time_nanoseconds(const m0_time_t time)
Definition: time.c:89
static bool config_check(struct m0_net_test_console_cfg *cfg)
Definition: console_u.c:173
static struct m0_uint128 prefix
Definition: extmap.c:45
uint64_t ntcc_concurrency_server
Definition: console.h:130
void m0_net_test_u_lnet_info(void)
Definition: common_u.c:122
uint64_t ntcc_concurrency_client
Definition: console.h:135
static bool verbose
Definition: fdmi_echo.c:80
double m0_net_test_stats_avg(const struct m0_net_test_stats *stats)
Definition: stats_u.c:50
static int console_run(struct m0_net_test_console_ctx *ctx)
Definition: console_u.c:535
int m0_init(struct m0 *instance)
Definition: init.c:310
void m0_net_test_u_print_time(char *name, m0_time_t time)
Definition: common_u.c:70
struct m0_net_test_msg_nr ntcsd_bulk_nr_send
Definition: commands.h:170
struct m0_net_test_msg_nr ntcsd_transfers
Definition: commands.h:174
uint64_t ntcc_bd_buf_nr_client
Definition: console.h:113
static m0_bcount_t count
Definition: xcode.c:167
m0_time_t ntcc_cmd_send_timeout
Definition: console.h:79
static void print_status_data_parsable(const char *prefix, struct m0_net_test_cmd_status_data *sd)
Definition: console_u.c:526
static struct m0_trace_stats stats
Definition: ktrace.c:69
static struct m0_net_test_cmd_ctx console
Definition: commands.c:73
static void print_msg_nr(const char *descr, struct m0_net_test_msg_nr *msg_nr)
Definition: console_u.c:362
void m0_net_test_console_fini(struct m0_net_test_console_ctx *ctx)
Definition: console.c:122
#define M0_STRINGARG(ch, desc, func)
Definition: getopts.h:207
int i
Definition: dir.c:1033
#define PRIu64
Definition: types.h:58
#define LAMBDA(T,...)
Definition: thread.h:153
const char * name
Definition: trace.c:110
size_t ntmn_bad
Definition: stats.h:322
if(value==NULL)
Definition: dir.c:350
static bool produce_parsable_output
Definition: console_u.c:142
size_t m0_net_test_console_cmd(struct m0_net_test_console_ctx *ctx, enum m0_net_test_role role, enum m0_net_test_cmd_type cmd_type)
Definition: console.c:228
int m0_net_test_u_printf(const char *fmt,...)
Definition: common_u.c:163
#define DESCRIBE(field, name, description)
Definition: console_u.c:108
char * ntcc_addr_console4servers
Definition: console.h:52
static bool parse_trace_buffer
Definition: console_u.c:147
void m0_net_test_slist_fini(struct m0_net_test_slist *slist)
Definition: slist.c:120
static char servers[NTCS_NODES_MAX *NTCS_NODE_ADDR_MAX]
Definition: client_server.c:63
struct m0_net_test_mps ntcsd_mps_send
Definition: commands.h:184
struct m0_net_test_msg_nr ntcsd_msg_nr_recv
Definition: commands.h:168
#define ASCIIZ_ARG(name)
static long long max(long long a, long long b)
Definition: crate.c:196
Definition: instance.h:80
#define SLIST_ARG(name)
#define CONSOLE_PRINT_MSG_NR(name)
size_t ntsl_nr
Definition: slist.h:49
static void config_print(struct m0_net_test_console_cfg *cfg)
Definition: console_u.c:216
Definition: xcode.h:73
m0_net_test_role
Definition: commands.h:59
#define CONSOLE_PRINT_STATS(name)
#define NUMBER_ARG(name)
static bool addr_list_check(struct m0_net_test_slist *slist)
Definition: console_u.c:159
static void print_status_data_implementation(struct m0_net_test_cmd_status_data *sd, bool parsable)
Definition: console_u.c:460
size_t ntmn_total
Definition: stats.h:308
uint64_t m0_time_seconds(const m0_time_t time)
Definition: time.c:83
struct m0_net_test_slist ntcc_data_clients
Definition: console.h:77
static char * addr_console4servers
Definition: client_server.c:61
struct m0_net_test_msg_nr ntcsd_msg_nr_send
Definition: commands.h:166
int main(int argc, char *argv[])
Definition: console_u.c:624
bool m0_net_test_slist_invariant(const struct m0_net_test_slist *slist)
Definition: slist.c:97
static long long min(long long a, long long b)
Definition: crate.c:191
uint64_t ntcc_bd_nr_max
Definition: console.h:125
static void config_free(struct m0_net_test_console_cfg *cfg)
Definition: console_u.c:335
m0_bcount_t ntcc_bd_buf_size
Definition: console.h:118
m0_bcount_t ntcc_msg_size
Definition: console.h:101
Definition: beck.c:130
void m0_net_test_u_print_error(const char *s, int code)
Definition: common_u.c:59
static void print_msg_nr_parsable(const char *prefix, struct m0_net_test_msg_nr *msg_nr)
Definition: console_u.c:435
uint64_t ntcc_msg_nr
Definition: console.h:94
m0_time_t m0_time_sub(const m0_time_t t1, const m0_time_t t2)
Definition: time.c:65
int m0_net_test_console_init(struct m0_net_test_console_ctx *ctx, struct m0_net_test_console_cfg *cfg)
Definition: console.c:116
#define M0_HELPARG(ch)
Definition: getopts.h:242
char * ntcc_addr_console4clients
Definition: console.h:54
struct m0_net_test_msg_nr ntcsd_bulk_nr_recv
Definition: commands.h:172
void m0_net_test_u_print_s(const char *fmt, const char *str)
Definition: common_u.c:65
struct m0_net_test_slist ntcc_servers
Definition: console.h:60
size_t ntmn_failed
Definition: stats.h:316
static char clients[NTCS_NODES_MAX *NTCS_NODE_ADDR_MAX]
Definition: client_server.c:62
static struct m0 instance
Definition: main.c:78
void m0_net_test_u_str_free(char *str)
Definition: common_u.c:54
#define M0_MKTIME(secs, ns)
Definition: time.h:86
static double avg_total(m0_time_t diff_t, double msg_nr)
Definition: console_u.c:385
M0_INTERNAL int m0_trace_parse(FILE *trace_file, FILE *output_file, const char *m0tr_ko_path, enum m0_trace_parse_flags flags, const void *magic_symbols[], unsigned int magic_symbols_nr)
Definition: utrace.c:527
Definition: nucleus.c:42
static void print_status_data_v(struct m0_net_test_cmd_status_data *sd)
Definition: console_u.c:521
static int total
Definition: base.c:302
struct m0_net_test_slist ntcc_clients
Definition: console.h:65
int type
Definition: dir.c:1031
struct m0_net_test_slist ntcc_data_servers
Definition: console.h:72
test_type
Definition: rm_foms.c:38
static void print_stats(const char *descr, struct m0_net_test_stats *stats)
Definition: console_u.c:368
static int configure(int argc, char *argv[], struct m0_net_test_console_cfg *cfg)
Definition: console_u.c:249
uint64_t ntcc_bd_buf_nr_server
Definition: console.h:107
static void print_slist(char *name, struct m0_net_test_slist *slist)
Definition: console_u.c:205
int32_t rc
Definition: trigger_fop.h:47
struct m0_net_test_stats ntmps_stats
Definition: stats.h:250
#define ARRAY_SIZE(a)
Definition: misc.h:45
#define TIME_ARG(name)
static bool console_step(struct m0_net_test_console_ctx *ctx, enum m0_net_test_role role, enum m0_net_test_cmd_type cmd_type, const char *text_pre, const char *text_post)
Definition: console_u.c:345
double m0_net_test_stats_stddev(const struct m0_net_test_stats *stats)
Definition: stats_u.c:60
char ** ntsl_list
Definition: slist.h:53
int m0_nanosleep(const m0_time_t req, m0_time_t *rem)
Definition: ktime.c:73