X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=stat.c;h=ec87debaf61580cbff89c7049d53e1009a085c2d;hb=f2bba1820a567ac00b09916239ac8feb125cead2;hp=a42ed98843bbf6b4d892d0fc6bd1b1af9f2c2e6c;hpb=306ddc9752eef70c3fbb111af63d197a3a6d447f;p=fio.git diff --git a/stat.c b/stat.c index a42ed988..ec87deba 100644 --- a/stat.c +++ b/stat.c @@ -8,49 +8,7 @@ #include #include "fio.h" - -/* - * Cheesy number->string conversion, complete with carry rounding error. - */ -static char *num2str(unsigned long num, int maxlen, int base, int pow2) -{ - char postfix[] = { ' ', 'K', 'M', 'G', 'P', 'E' }; - unsigned int thousand; - char *buf; - int i; - - if (pow2) - thousand = 1024; - else - thousand = 1000; - - buf = malloc(128); - - for (i = 0; base > 1; i++) - base /= thousand; - - do { - int len, carry = 0; - - len = sprintf(buf, "%'lu", num); - if (len <= maxlen) { - if (i >= 1) { - buf[len] = postfix[i]; - buf[len + 1] = '\0'; - } - return buf; - } - - if ((num % thousand) >= (thousand / 2)) - carry = 1; - - num /= thousand; - num += carry; - i++; - } while (i <= 5); - - return buf; -} +#include "diskutil.h" void update_rusage_stat(struct thread_data *td) { @@ -377,6 +335,10 @@ static void show_thread_status(struct thread_stat *ts, stat_calc_lat_u(ts, io_u_lat_u); stat_calc_lat_m(ts, io_u_lat_m); show_latencies(io_u_lat_u, io_u_lat_m); + if (ts->continue_on_error) { + log_info(" errors: total=%lu, first_error=%d\n", + ts->total_err_count, ts->first_error); + } } static void show_ddir_status_terse(struct thread_stat *ts, @@ -452,6 +414,8 @@ static void show_thread_status_terse(struct thread_stat *ts, log_info(";%3.2f%%", io_u_lat_u[i]); for (i = 0; i < FIO_IO_U_LAT_M_NR; i++) log_info(";%3.2f%%", io_u_lat_m[i]); + if (ts->continue_on_error) + log_info(";%lu;%d", ts->total_err_count, ts->first_error); log_info("\n"); if (ts->description) @@ -565,9 +529,18 @@ void show_run_stats(void) ts->pid = td->pid; } - if (td->error && !ts->error) { - ts->error = td->error; - ts->verror = td->verror; + ts->continue_on_error = td->o.continue_on_error; + ts->total_err_count += td->total_err_count; + ts->first_error = td->first_error; + if (!ts->error) { + if (!td->error && td->o.continue_on_error && + td->first_error) { + ts->error = td->first_error; + ts->verror = td->verror; + } else if (td->error) { + ts->error = td->error; + ts->verror = td->verror; + } } for (l = 0; l <= DDIR_WRITE; l++) {