Add support for multiple output formats
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index 7d6ee63dc2dd3dac9faddaeb96da5e34d0a72713..ea5b43a38ba1cd65cf9547c6d4bfe7922ac30a6a 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -1062,17 +1062,26 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                                    struct group_run_stats *rs)
 {
        struct json_object *root, *tmp;
+       struct jobs_eta *je;
        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;
+       size_t size;
+
 
        root = json_create_object();
        json_object_add_value_string(root, "jobname", ts->name);
        json_object_add_value_int(root, "groupid", ts->groupid);
        json_object_add_value_int(root, "error", ts->error);
 
+       /* ETA Info */
+       je = get_jobs_eta(1, &size);
+       json_object_add_value_int(root, "eta", je->eta_sec);
+       json_object_add_value_int(root, "elapsed", je->elapsed_sec);
+
+
        add_ddir_status_json(ts, rs, DDIR_READ, root);
        add_ddir_status_json(ts, rs, DDIR_WRITE, root);
        add_ddir_status_json(ts, rs, DDIR_TRIM, root);
@@ -1202,13 +1211,16 @@ static void show_thread_status_terse(struct thread_stat *ts,
 struct json_object *show_thread_status(struct thread_stat *ts,
                                       struct group_run_stats *rs)
 {
-       if (output_format == FIO_OUTPUT_TERSE)
+       struct json_object *ret = NULL;
+
+       if (output_format & FIO_OUTPUT_TERSE)
                show_thread_status_terse(ts, rs);
-       else if (output_format == FIO_OUTPUT_JSON)
-               return show_thread_status_json(ts, rs);
-       else
+       if (output_format & FIO_OUTPUT_JSON)
+               ret = show_thread_status_json(ts, rs);
+       if (output_format & FIO_OUTPUT_NORMAL)
                show_thread_status_normal(ts, rs);
-       return NULL;
+
+       return ret;
 }
 
 static void sum_stat(struct io_stat *dst, struct io_stat *src, int nr)
@@ -1539,9 +1551,9 @@ void __show_run_stats(void)
        /*
         * don't overwrite last signal output
         */
-       if (output_format == FIO_OUTPUT_NORMAL)
+       if (output_format & FIO_OUTPUT_NORMAL)
                log_info("\n");
-       else if (output_format == FIO_OUTPUT_JSON) {
+       if (output_format & FIO_OUTPUT_JSON) {
                char time_buf[32];
                time_t time_p;
 
@@ -1564,15 +1576,18 @@ void __show_run_stats(void)
 
                if (is_backend)
                        fio_server_send_ts(ts, rs);
-               else if (output_format == FIO_OUTPUT_TERSE)
-                       show_thread_status_terse(ts, rs);
-               else if (output_format == FIO_OUTPUT_JSON) {
-                       struct json_object *tmp = show_thread_status_json(ts, rs);
-                       json_array_add_value_object(array, tmp);
-               } else
-                       show_thread_status_normal(ts, rs);
+               else {
+                       if (output_format & FIO_OUTPUT_TERSE)
+                               show_thread_status_terse(ts, rs);
+                       if (output_format & FIO_OUTPUT_JSON) {
+                               struct json_object *tmp = show_thread_status_json(ts, rs);
+                               json_array_add_value_object(array, tmp);
+                       }
+                       if (output_format & FIO_OUTPUT_NORMAL)
+                               show_thread_status_normal(ts, rs);
+               }
        }
-       if (output_format == FIO_OUTPUT_JSON) {
+       if (output_format & FIO_OUTPUT_JSON) {
                /* disk util stats, if any */
                show_disk_util(1, root);
 
@@ -1589,18 +1604,18 @@ void __show_run_stats(void)
                rs->groupid = i;
                if (is_backend)
                        fio_server_send_gs(rs);
-               else if (output_format == FIO_OUTPUT_NORMAL)
+               else if (output_format & FIO_OUTPUT_NORMAL)
                        show_group_stats(rs);
        }
 
        if (is_backend)
                fio_server_send_du();
-       else if (output_format == FIO_OUTPUT_NORMAL) {
+       else if (output_format & FIO_OUTPUT_NORMAL) {
                show_disk_util(0, NULL);
                show_idle_prof_stats(FIO_OUTPUT_NORMAL, NULL);
        }
 
-       if ( !(output_format == FIO_OUTPUT_TERSE) && append_terse_output) {
+       if ( !(output_format & FIO_OUTPUT_TERSE) && append_terse_output) {
                log_info("\nAdditional Terse Output:\n");
 
                for (i = 0; i < nr_ts; i++) {
@@ -1962,6 +1977,8 @@ void add_clat_sample(struct thread_data *td, enum fio_ddir ddir,
        if (!ddir_rw(ddir))
                return;
 
+       td_io_u_lock(td);
+
        add_stat_sample(&ts->clat_stat[ddir], usec);
 
        if (td->clat_log)
@@ -1969,6 +1986,8 @@ void add_clat_sample(struct thread_data *td, enum fio_ddir ddir,
 
        if (ts->clat_percentiles)
                add_clat_percentile_sample(ts, usec, ddir);
+
+       td_io_u_unlock(td);
 }
 
 void add_slat_sample(struct thread_data *td, enum fio_ddir ddir,
@@ -1979,10 +1998,14 @@ void add_slat_sample(struct thread_data *td, enum fio_ddir ddir,
        if (!ddir_rw(ddir))
                return;
 
+       td_io_u_lock(td);
+
        add_stat_sample(&ts->slat_stat[ddir], usec);
 
        if (td->slat_log)
                add_log_sample(td, td->slat_log, usec, ddir, bs, offset);
+
+       td_io_u_unlock(td);
 }
 
 void add_lat_sample(struct thread_data *td, enum fio_ddir ddir,
@@ -1993,10 +2016,14 @@ void add_lat_sample(struct thread_data *td, enum fio_ddir ddir,
        if (!ddir_rw(ddir))
                return;
 
+       td_io_u_lock(td);
+
        add_stat_sample(&ts->lat_stat[ddir], usec);
 
        if (td->lat_log)
                add_log_sample(td, td->lat_log, usec, ddir, bs, offset);
+
+       td_io_u_unlock(td);
 }
 
 void add_bw_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs,