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);
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)
/*
* 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;
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);
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++) {
if (!ddir_rw(ddir))
return;
+ td_io_u_lock(td);
+
add_stat_sample(&ts->clat_stat[ddir], usec);
if (td->clat_log)
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,
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,
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,