stat: Merge show_thread_status_terse_* functions
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index 50426509cb9226a46d13b579e5043df2121b6c71..1201c35c703bd5f81d8dd6496d3a9b3754268deb 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -496,8 +496,15 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
                        bw_str = (rs->unit_base == 1 ? "Mibit" : "MiB");
                }
 
-               log_buf(out, "   bw (%5s/s): min=%5llu, max=%5llu, per=%3.2f%%, avg=%5.02f, stdev=%5.02f\n",
-                       bw_str, min, max, p_of_agg, mean, dev);
+               log_buf(out, "   bw (%5s/s): min=%5llu, max=%5llu, per=%3.2f%%, "
+                       "avg=%5.02f, stdev=%5.02f, samples=%5lu\n",
+                       bw_str, min, max, p_of_agg, mean, dev,
+                       (&ts->bw_stat[ddir])->samples);
+       }
+       if (calc_lat(&ts->iops_stat[ddir], &min, &max, &mean, &dev)) {
+               log_buf(out, "   iops : min=%5llu, max=%5llu, avg=%5.02f, "
+                       "stdev=%5.02f, samples=%5lu\n",
+                       min, max, mean, dev, (&ts->iops_stat[ddir])->samples);
        }
 }
 
@@ -1047,74 +1054,24 @@ static void add_ddir_status_json(struct thread_stat *ts,
        json_object_add_value_float(dir_object, "bw_agg", p_of_agg);
        json_object_add_value_float(dir_object, "bw_mean", mean);
        json_object_add_value_float(dir_object, "bw_dev", dev);
-}
-
-static void show_thread_status_terse_v2(struct thread_stat *ts,
-                                       struct group_run_stats *rs,
-                                       struct buf_output *out)
-{
-       double io_u_dist[FIO_IO_U_MAP_NR];
-       double io_u_lat_u[FIO_IO_U_LAT_U_NR];
-       double io_u_lat_m[FIO_IO_U_LAT_M_NR];
-       double usr_cpu, sys_cpu;
-       int i;
-
-       /* General Info */
-       log_buf(out, "2;%s;%d;%d", ts->name, ts->groupid, ts->error);
-       /* Log Read Status */
-       show_ddir_status_terse(ts, rs, DDIR_READ, out);
-       /* Log Write Status */
-       show_ddir_status_terse(ts, rs, DDIR_WRITE, out);
-       /* Log Trim Status */
-       show_ddir_status_terse(ts, rs, DDIR_TRIM, out);
+       json_object_add_value_int(dir_object, "bw_samples",
+                               (&ts->bw_stat[ddir])->samples);
 
-       /* CPU Usage */
-       if (ts->total_run_time) {
-               double runt = (double) ts->total_run_time;
-
-               usr_cpu = (double) ts->usr_time * 100 / runt;
-               sys_cpu = (double) ts->sys_time * 100 / runt;
-       } else {
-               usr_cpu = 0;
-               sys_cpu = 0;
+       if (!calc_lat(&ts->iops_stat[ddir], &min, &max, &mean, &dev)) {
+               min = max = 0;
+               mean = dev = 0.0;
        }
-
-       log_buf(out, ";%f%%;%f%%;%llu;%llu;%llu", usr_cpu, sys_cpu,
-                                               (unsigned long long) ts->ctx,
-                                               (unsigned long long) ts->majf,
-                                               (unsigned long long) ts->minf);
-
-       /* Calc % distribution of IO depths, usecond, msecond latency */
-       stat_calc_dist(ts->io_u_map, ddir_rw_sum(ts->total_io_u), io_u_dist);
-       stat_calc_lat_nu(ts, io_u_lat_u);
-       stat_calc_lat_m(ts, io_u_lat_m);
-
-       /* Only show fixed 7 I/O depth levels*/
-       log_buf(out, ";%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%",
-                       io_u_dist[0], io_u_dist[1], io_u_dist[2], io_u_dist[3],
-                       io_u_dist[4], io_u_dist[5], io_u_dist[6]);
-
-       /* Microsecond latency */
-       for (i = 0; i < FIO_IO_U_LAT_U_NR; i++)
-               log_buf(out, ";%3.2f%%", io_u_lat_u[i]);
-       /* Millisecond latency */
-       for (i = 0; i < FIO_IO_U_LAT_M_NR; i++)
-               log_buf(out, ";%3.2f%%", io_u_lat_m[i]);
-       /* Additional output if continue_on_error set - default off*/
-       if (ts->continue_on_error)
-               log_buf(out, ";%llu;%d", (unsigned long long) ts->total_err_count, ts->first_error);
-       log_buf(out, "\n");
-
-       /* Additional output if description is set */
-       if (strlen(ts->description))
-               log_buf(out, ";%s", ts->description);
-
-       log_buf(out, "\n");
+       json_object_add_value_int(dir_object, "iops_min", min);
+       json_object_add_value_int(dir_object, "iops_max", max);
+       json_object_add_value_float(dir_object, "iops_mean", mean);
+       json_object_add_value_float(dir_object, "iops_stddev", dev);
+       json_object_add_value_int(dir_object, "iops_samples",
+                               (&ts->iops_stat[ddir])->samples);
 }
 
-static void show_thread_status_terse_v3_v4(struct thread_stat *ts,
-                                          struct group_run_stats *rs, int ver,
-                                          struct buf_output *out)
+static void show_thread_status_terse_all(struct thread_stat *ts,
+                                        struct group_run_stats *rs, int ver,
+                                        struct buf_output *out)
 {
        double io_u_dist[FIO_IO_U_MAP_NR];
        double io_u_lat_u[FIO_IO_U_LAT_U_NR];
@@ -1123,14 +1080,18 @@ static void show_thread_status_terse_v3_v4(struct thread_stat *ts,
        int i;
 
        /* General Info */
-       log_buf(out, "%d;%s;%s;%d;%d", ver, fio_version_string,
-                                       ts->name, ts->groupid, ts->error);
+       if (ver == 2)
+               log_buf(out, "2;%s;%d;%d", ts->name, ts->groupid, ts->error);
+       else
+               log_buf(out, "%d;%s;%s;%d;%d", ver, fio_version_string,
+                       ts->name, ts->groupid, ts->error);
+
        /* Log Read Status */
        show_ddir_status_terse(ts, rs, DDIR_READ, out);
        /* Log Write Status */
        show_ddir_status_terse(ts, rs, DDIR_WRITE, out);
        /* Log Trim Status */
-       if (ver == 4)
+       if (ver == 2 || ver == 4)
                show_ddir_status_terse(ts, rs, DDIR_TRIM, out);
 
        /* CPU Usage */
@@ -1167,11 +1128,14 @@ static void show_thread_status_terse_v3_v4(struct thread_stat *ts,
                log_buf(out, ";%3.2f%%", io_u_lat_m[i]);
 
        /* disk util stats, if any */
-       show_disk_util(1, NULL, out);
+       if (ver >= 3)
+               show_disk_util(1, NULL, out);
 
        /* Additional output if continue_on_error set - default off*/
        if (ts->continue_on_error)
                log_buf(out, ";%llu;%d", (unsigned long long) ts->total_err_count, ts->first_error);
+       if (ver == 2)
+               log_buf(out, "\n");
 
        /* Additional output if description is set */
        if (strlen(ts->description))
@@ -1412,10 +1376,8 @@ static void show_thread_status_terse(struct thread_stat *ts,
                                     struct group_run_stats *rs,
                                     struct buf_output *out)
 {
-       if (terse_version == 2)
-               show_thread_status_terse_v2(ts, rs, out);
-       else if (terse_version == 3 || terse_version == 4)
-               show_thread_status_terse_v3_v4(ts, rs, terse_version, out);
+       if (terse_version >= 2 && terse_version <= 4)
+               show_thread_status_terse_all(ts, rs, terse_version, out);
        else
                log_err("fio: bad terse version!? %d\n", terse_version);
 }
@@ -1507,6 +1469,7 @@ void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src,
                        sum_stat(&dst->slat_stat[l], &src->slat_stat[l], first);
                        sum_stat(&dst->lat_stat[l], &src->lat_stat[l], first);
                        sum_stat(&dst->bw_stat[l], &src->bw_stat[l], first);
+                       sum_stat(&dst->iops_stat[l], &src->iops_stat[l], first);
 
                        dst->io_bytes[l] += src->io_bytes[l];
 
@@ -1517,6 +1480,7 @@ void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src,
                        sum_stat(&dst->slat_stat[0], &src->slat_stat[l], first);
                        sum_stat(&dst->lat_stat[0], &src->lat_stat[l], first);
                        sum_stat(&dst->bw_stat[0], &src->bw_stat[l], first);
+                       sum_stat(&dst->iops_stat[0], &src->iops_stat[l], first);
 
                        dst->io_bytes[0] += src->io_bytes[l];
 
@@ -1598,6 +1562,7 @@ void init_thread_stat(struct thread_stat *ts)
                ts->clat_stat[j].min_val = -1UL;
                ts->slat_stat[j].min_val = -1UL;
                ts->bw_stat[j].min_val = -1UL;
+               ts->iops_stat[j].min_val = -1UL;
        }
        ts->groupid = -1;
 }