X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=stat.c;h=3adb46eab8087cc53ae0fd2b7c15ad048596c040;hp=e43db8f9d075431a0d90c04b8d4fd941c05ffaf5;hb=1b4f8c7f78793428084688f27a412139b259972b;hpb=6bb58215842760895071d9f331da4dc2dfc16f30 diff --git a/stat.c b/stat.c index e43db8f9..3adb46ea 100644 --- a/stat.c +++ b/stat.c @@ -497,7 +497,8 @@ static void show_latencies(struct thread_stat *ts) show_lat_m(io_u_lat_m); } -void show_thread_status_normal(struct thread_stat *ts, struct group_run_stats *rs) +static void show_thread_status_normal(struct thread_stat *ts, + struct group_run_stats *rs) { double usr_cpu, sys_cpu; unsigned long runtime; @@ -769,7 +770,7 @@ static void add_ddir_status_json(struct thread_stat *ts, } json_object_add_value_int(dir_object, "bw_min", min); json_object_add_value_int(dir_object, "bw_max", max); - json_object_add_value_float(dir_object, "bw_agg", mean); + 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); } @@ -830,7 +831,7 @@ static void show_thread_status_terse_v2(struct thread_stat *ts, log_info("\n"); /* Additional output if description is set */ - if (ts->description) + if (strlen(ts->description)) log_info(";%s", ts->description); log_info("\n"); @@ -1012,7 +1013,7 @@ struct json_object *show_thread_status(struct thread_stat *ts, 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)); + return show_thread_status_json(ts, rs); else show_thread_status_normal(ts, rs); return NULL; @@ -1232,12 +1233,12 @@ static void __show_run_stats(void) /* * These are per-group shared already */ - strncpy(ts->name, td->o.name, FIO_JOBNAME_SIZE); + strncpy(ts->name, td->o.name, FIO_JOBNAME_SIZE - 1); if (td->o.description) strncpy(ts->description, td->o.description, - FIO_JOBNAME_SIZE); + FIO_JOBDESC_SIZE - 1); else - memset(ts->description, 0, FIO_JOBNAME_SIZE); + memset(ts->description, 0, FIO_JOBDESC_SIZE); /* * If multiple entries in this group, this is @@ -1271,10 +1272,12 @@ static void __show_run_stats(void) if (!td->error && td->o.continue_on_error && td->first_error) { ts->error = td->first_error; - strcpy(ts->verror, td->verror); + ts->verror[sizeof(ts->verror) - 1] = '\0'; + strncpy(ts->verror, td->verror, sizeof(ts->verror) - 1); } else if (td->error) { ts->error = td->error; - strcpy(ts->verror, td->verror); + ts->verror[sizeof(ts->verror) - 1] = '\0'; + strncpy(ts->verror, td->verror, sizeof(ts->verror) - 1); } } @@ -1470,7 +1473,12 @@ void show_running_run_stats(void) fio_mutex_down(stat_mutex); if (!pthread_create(&thread, NULL, __show_running_run_stats, NULL)) { - pthread_detach(thread); + int err; + + err = pthread_detach(thread); + if (err) + log_err("fio: DU thread detach failed: %s\n", strerror(err)); + return; } @@ -1479,8 +1487,9 @@ void show_running_run_stats(void) static int status_interval_init; static struct timeval status_time; +static int status_file_disabled; -#define FIO_STATUS_FILE "/tmp/fio-dump-status" +#define FIO_STATUS_FILE "fio-dump-status" static int check_status_file(void) { @@ -1488,9 +1497,15 @@ static int check_status_file(void) const char *temp_dir; char fio_status_file_path[PATH_MAX]; + if (status_file_disabled) + return 0; + temp_dir = getenv("TMPDIR"); - if (temp_dir == NULL) + if (temp_dir == NULL) { temp_dir = getenv("TEMP"); + if (temp_dir && strlen(temp_dir) >= PATH_MAX) + temp_dir = NULL; + } if (temp_dir == NULL) temp_dir = "/tmp"; @@ -1499,7 +1514,13 @@ static int check_status_file(void) if (stat(fio_status_file_path, &sb)) return 0; - unlink(fio_status_file_path); + if (unlink(fio_status_file_path) < 0) { + log_err("fio: failed to unlink %s: %s\n", fio_status_file_path, + strerror(errno)); + log_err("fio: disabling status file updates\n"); + status_file_disabled = 1; + } + return 1; } @@ -1789,7 +1810,11 @@ void add_bw_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs, if (!delta) continue; /* No entries for interval */ - rate = delta * 1000 / spent / 1024; + if (spent) + rate = delta * 1000 / spent / 1024; + else + rate = 0; + add_stat_sample(&ts->bw_stat[ddir], rate); if (td->bw_log) @@ -1824,7 +1849,11 @@ void add_iops_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs if (!delta) continue; /* No entries for interval */ - iops = (delta * 1000) / spent; + if (spent) + iops = (delta * 1000) / spent; + else + iops = 0; + add_stat_sample(&ts->iops_stat[ddir], iops); if (td->iops_log)