hsa: vcl test client incremental stats
[vpp.git] / src / plugins / hs_apps / vcl / vcl_test_client.c
index 83d6dd0..d16d62c 100644 (file)
@@ -31,7 +31,6 @@ typedef struct
   vcl_test_session_t *sessions;
   vcl_test_session_t *qsessions;
   uint32_t n_sessions;
-  uint32_t n_qsessions;
   uint32_t wrk_index;
   fd_set wr_fdset;
   fd_set rd_fdset;
@@ -43,13 +42,13 @@ typedef struct
 typedef struct
 {
   vcl_test_client_worker_t *workers;
+  vcl_test_session_t ctrl_session;
   vppcom_endpt_t server_endpt;
   uint32_t cfg_seq_num;
-  vcl_test_session_t ctrl_session;
-  vcl_test_session_t *sessions;
   uint8_t dump_cfg;
   vcl_test_t post_test;
   uint8_t proto;
+  uint8_t incremental_stats;
   uint32_t n_workers;
   volatile int active_workers;
   volatile int test_running;
@@ -154,7 +153,10 @@ vtc_connect_test_sessions (vcl_test_client_worker_t * wrk)
   for (i = 0; i < n_test_sessions; i++)
     {
       ts = &wrk->sessions[i];
+      memset (ts, 0, sizeof (*ts));
       ts->session_index = i;
+      ts->cfg = wrk->cfg;
+      vcl_test_session_buf_alloc (ts);
       rv = tp->open (&wrk->sessions[i], &vcm->server_endpt);
       if (rv < 0)
        return rv;
@@ -169,32 +171,31 @@ done:
 static int
 vtc_worker_test_setup (vcl_test_client_worker_t * wrk)
 {
-  vcl_test_client_main_t *vcm = &vcl_client_main;
-  vcl_test_session_t *ctrl = &vcm->ctrl_session;
   vcl_test_cfg_t *cfg = &wrk->cfg;
   vcl_test_session_t *ts;
+  struct timespec now;
   uint32_t sidx;
   int i, j;
 
   FD_ZERO (&wrk->wr_fdset);
   FD_ZERO (&wrk->rd_fdset);
 
+  clock_gettime (CLOCK_REALTIME, &now);
+
   for (i = 0; i < cfg->num_test_sessions; i++)
     {
       ts = &wrk->sessions[i];
-      ts->cfg = wrk->cfg;
-      vcl_test_session_buf_alloc (ts);
+      ts->old_stats.stop = now;
 
       switch (cfg->test)
        {
-       case VCL_TEST_TYPE_ECHO:
-         memcpy (ts->txbuf, ctrl->txbuf, cfg->total_bytes);
-         break;
        case VCL_TEST_TYPE_UNI:
        case VCL_TEST_TYPE_BI:
          for (j = 0; j < ts->txbuf_size; j++)
            ts->txbuf[j] = j & 0xff;
          break;
+       default:
+         break;
        }
 
       FD_SET (vppcom_session_index (ts->fd), &wrk->wr_fdset);
@@ -211,9 +212,6 @@ static int
 vtc_worker_init (vcl_test_client_worker_t * wrk)
 {
   vcl_test_client_main_t *vcm = &vcl_client_main;
-  vcl_test_cfg_t *cfg = &wrk->cfg;
-  vcl_test_session_t *ts;
-  uint32_t n;
   int rv;
 
   __wrk_index = wrk->wrk_index;
@@ -239,12 +237,6 @@ vtc_worker_init (vcl_test_client_worker_t * wrk)
   if (vtc_worker_test_setup (wrk))
     return -1;
 
-  for (n = 0; n < cfg->num_test_sessions; n++)
-    {
-      ts = &wrk->sessions[n];
-      memset (&ts->stats, 0, sizeof (ts->stats));
-    }
-
   return 0;
 }
 
@@ -295,11 +287,27 @@ vtc_worker_sessions_exit (vcl_test_client_worker_t * wrk)
     {
       ts = &wrk->sessions[i];
       vppcom_session_close (ts->fd);
+      vcl_test_session_buf_free (ts);
     }
 
   wrk->n_sessions = 0;
 }
 
+static void
+vtc_inc_stats_check (vcl_test_session_t *ts)
+{
+  /* Avoid checking time too often because of syscall cost */
+  if (ts->stats.tx_bytes - ts->old_stats.tx_bytes < 1 << 20)
+    return;
+
+  clock_gettime (CLOCK_REALTIME, &ts->stats.stop);
+  if (vcl_test_time_diff (&ts->old_stats.stop, &ts->stats.stop) > 1)
+    {
+      vcl_test_stats_dump_inc (&ts->old_stats, &ts->stats);
+      ts->old_stats = ts->stats;
+    }
+}
+
 static void *
 vtc_worker_loop (void *arg)
 {
@@ -344,8 +352,7 @@ vtc_worker_loop (void *arg)
       for (i = 0; i < wrk->cfg.num_test_sessions; i++)
        {
          ts = &wrk->sessions[i];
-         if (!((ts->stats.stop.tv_sec == 0) &&
-               (ts->stats.stop.tv_nsec == 0)))
+         if (ts->is_done)
            continue;
 
          if (FD_ISSET (vppcom_session_index (ts->fd), rfdset)
@@ -366,11 +373,14 @@ vtc_worker_loop (void *arg)
                         ts->fd);
                  goto exit;
                }
+             if (vcm->incremental_stats)
+               vtc_inc_stats_check (ts);
            }
          if ((!check_rx && ts->stats.tx_bytes >= ts->cfg.total_bytes)
              || (check_rx && ts->stats.rx_bytes >= ts->cfg.total_bytes))
            {
              clock_gettime (CLOCK_REALTIME, &ts->stats.stop);
+             ts->is_done = 1;
              n_active_sessions--;
            }
        }
@@ -454,6 +464,7 @@ vtc_stream_client (vcl_test_client_main_t * vcm)
   vtinf ("%s-directional Stream Test Starting!",
         ctrl->cfg.test == VCL_TEST_TYPE_BI ? "Bi" : "Uni");
 
+  memset (&ctrl->stats, 0, sizeof (vcl_test_stats_t));
   cfg->total_bytes = cfg->num_writes * cfg->txbuf_size;
   cfg->ctrl_handle = ctrl->fd;
 
@@ -653,27 +664,29 @@ parse_input ()
 void
 print_usage_and_exit (void)
 {
-  fprintf (stderr,
-          "vcl_test_client [OPTIONS] <ipaddr> <port>\n"
-          "  OPTIONS\n"
-          "  -h               Print this message and exit.\n"
-          "  -6               Use IPv6\n"
-          "  -c               Print test config before test.\n"
-          "  -w <dir>         Write test results to <dir>.\n"
-          "  -X               Exit after running test.\n"
-          "  -p <proto>       Use <proto> transport layer\n"
-          "  -D               Use UDP transport layer\n"
-          "  -L               Use TLS transport layer\n"
-          "  -E               Run Echo test.\n"
-          "  -N <num-writes>  Test Cfg: number of writes.\n"
-          "  -R <rxbuf-size>  Test Cfg: rx buffer size.\n"
-          "  -T <txbuf-size>  Test Cfg: tx buffer size.\n"
-          "  -U               Run Uni-directional test.\n"
-          "  -B               Run Bi-directional test.\n"
-          "  -V               Verbose mode.\n"
-          "  -I <N>           Use N sessions.\n"
-          "  -s <N>           Use N sessions.\n"
-          "  -q <n>           QUIC : use N Ssessions on top of n Qsessions\n");
+  fprintf (
+    stderr,
+    "vcl_test_client [OPTIONS] <ipaddr> <port>\n"
+    "  OPTIONS\n"
+    "  -h               Print this message and exit.\n"
+    "  -6               Use IPv6\n"
+    "  -c               Print test config before test.\n"
+    "  -w <dir>         Write test results to <dir>.\n"
+    "  -X               Exit after running test.\n"
+    "  -p <proto>       Use <proto> transport layer\n"
+    "  -D               Use UDP transport layer\n"
+    "  -L               Use TLS transport layer\n"
+    "  -E               Run Echo test.\n"
+    "  -N <num-writes>  Test Cfg: number of writes.\n"
+    "  -R <rxbuf-size>  Test Cfg: rx buffer size.\n"
+    "  -T <txbuf-size>  Test Cfg: tx buffer size.\n"
+    "  -U               Run Uni-directional test.\n"
+    "  -B               Run Bi-directional test.\n"
+    "  -V               Verbose mode.\n"
+    "  -I <N>           Use N sessions.\n"
+    "  -s <N>           Use N sessions.\n"
+    "  -S              Print incremental stats per session.\n"
+    "  -q <n>           QUIC : use N Ssessions on top of n Qsessions\n");
   exit (1);
 }
 
@@ -684,7 +697,7 @@ vtc_process_opts (vcl_test_client_main_t * vcm, int argc, char **argv)
   int c, v;
 
   opterr = 0;
-  while ((c = getopt (argc, argv, "chnp:w:XE:I:N:R:T:UBV6DLs:q:")) != -1)
+  while ((c = getopt (argc, argv, "chnp:w:XE:I:N:R:T:UBV6DLs:q:S")) != -1)
     switch (c)
       {
       case 'c':
@@ -839,6 +852,10 @@ vtc_process_opts (vcl_test_client_main_t * vcm, int argc, char **argv)
        vcm->proto = VPPCOM_PROTO_TLS;
        break;
 
+      case 'S':
+       vcm->incremental_stats = 1;
+       break;
+
       case '?':
        switch (optopt)
          {