stat: add total/short/drop ios to the json output
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index 979c8100d37881fa2a99ee1c184e504b656e6b7c..77e389cb1f7f85baa0c600a56adfc5e32c0274f7 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -506,9 +506,7 @@ static void show_thread_status_normal(struct thread_stat *ts,
        time_t time_p;
        char time_buf[64];
 
-       if (!(ts->io_bytes[DDIR_READ] + ts->io_bytes[DDIR_WRITE] +
-           ts->io_bytes[DDIR_TRIM]) && !(ts->total_io_u[DDIR_READ] +
-           ts->total_io_u[DDIR_WRITE] + ts->total_io_u[DDIR_TRIM]))
+       if (!ddir_rw_sum(ts->io_bytes) && !ddir_rw_sum(ts->total_io_u))
                return;
 
        time(&time_p);
@@ -574,13 +572,17 @@ static void show_thread_status_normal(struct thread_stat *ts,
                                        io_u_dist[3], io_u_dist[4],
                                        io_u_dist[5], io_u_dist[6]);
        log_info("     issued    : total=r=%llu/w=%llu/d=%llu,"
-                                " short=r=%llu/w=%llu/d=%llu\n",
+                                " short=r=%llu/w=%llu/d=%llu,"
+                                " drop=r=%llu/w=%llu/d=%llu\n",
                                        (unsigned long long) ts->total_io_u[0],
                                        (unsigned long long) ts->total_io_u[1],
                                        (unsigned long long) ts->total_io_u[2],
                                        (unsigned long long) ts->short_io_u[0],
                                        (unsigned long long) ts->short_io_u[1],
-                                       (unsigned long long) ts->short_io_u[2]);
+                                       (unsigned long long) ts->short_io_u[2],
+                                       (unsigned long long) ts->drop_io_u[0],
+                                       (unsigned long long) ts->drop_io_u[1],
+                                       (unsigned long long) ts->drop_io_u[2]);
        if (ts->continue_on_error) {
                log_info("     errors    : total=%llu, first_error=%d/<%s>\n",
                                        (unsigned long long)ts->total_err_count,
@@ -703,6 +705,9 @@ static void add_ddir_status_json(struct thread_stat *ts,
        json_object_add_value_int(dir_object, "bw", bw);
        json_object_add_value_int(dir_object, "iops", iops);
        json_object_add_value_int(dir_object, "runtime", ts->runtime[ddir]);
+       json_object_add_value_int(dir_object, "total_ios", ts->total_io_u[ddir]);
+       json_object_add_value_int(dir_object, "short_ios", ts->short_io_u[ddir]);
+       json_object_add_value_int(dir_object, "drop_ios", ts->drop_io_u[ddir]);
 
        if (!calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev)) {
                min = max = 0;
@@ -1123,9 +1128,11 @@ void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr)
                if (!dst->unified_rw_rep) {
                        dst->total_io_u[k] += src->total_io_u[k];
                        dst->short_io_u[k] += src->short_io_u[k];
+                       dst->drop_io_u[k] += src->drop_io_u[k];
                } else {
                        dst->total_io_u[0] += src->total_io_u[k];
                        dst->short_io_u[0] += src->short_io_u[k];
+                       dst->drop_io_u[0] += src->drop_io_u[k];
                }
        }
 
@@ -1169,7 +1176,7 @@ void init_thread_stat(struct thread_stat *ts)
        ts->groupid = -1;
 }
 
-static void __show_run_stats(void)
+void __show_run_stats(void)
 {
        struct group_run_stats *runstats, *rs;
        struct thread_data *td;
@@ -1411,13 +1418,15 @@ void show_run_stats(void)
        fio_mutex_up(stat_mutex);
 }
 
-static void *__show_running_run_stats(void fio_unused *arg)
+static void *__show_running_run_stats(void *arg)
 {
        struct thread_data *td;
        unsigned long long *rt;
        struct timeval tv;
        int i;
 
+       fio_mutex_down(stat_mutex);
+
        rt = malloc(thread_number * sizeof(unsigned long long));
        fio_gettime(&tv, NULL);
 
@@ -1458,6 +1467,7 @@ static void *__show_running_run_stats(void fio_unused *arg)
 
        free(rt);
        fio_mutex_up(stat_mutex);
+       free(arg);
        return NULL;
 }
 
@@ -1468,21 +1478,23 @@ static void *__show_running_run_stats(void fio_unused *arg)
  */
 void show_running_run_stats(void)
 {
-       pthread_t thread;
+       pthread_t *thread;
 
-       fio_mutex_down(stat_mutex);
+       thread = calloc(1, sizeof(*thread));
+       if (!thread)
+               return;
 
-       if (!pthread_create(&thread, NULL, __show_running_run_stats, NULL)) {
+       if (!pthread_create(thread, NULL, __show_running_run_stats, thread)) {
                int err;
 
-               err = pthread_detach(thread);
+               err = pthread_detach(*thread);
                if (err)
                        log_err("fio: DU thread detach failed: %s\n", strerror(err));
 
                return;
        }
 
-       fio_mutex_up(stat_mutex);
+       free(thread);
 }
 
 static int status_interval_init;
@@ -1653,6 +1665,7 @@ void reset_io_stats(struct thread_data *td)
        for (i = 0; i < 3; i++) {
                ts->total_io_u[i] = 0;
                ts->short_io_u[i] = 0;
+               ts->drop_io_u[i] = 0;
        }
 }