#include "fio.h"
#include "diskutil.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;
-}
-
void update_rusage_stat(struct thread_data *td)
{
struct thread_stat *ts = &td->ts;
p3 = num2str(rs->min_bw[i], 6, 1024, 1);
p4 = num2str(rs->max_bw[i], 6, 1024, 1);
- log_info("%s: io=%siB, aggrb=%siB/s, minb=%siB/s, maxb=%siB/s,"
+ log_info("%s: io=%sB, aggrb=%sB/s, minb=%sB/s, maxb=%sB/s,"
" mint=%llumsec, maxt=%llumsec\n", ddir_str[i], p1, p2,
p3, p4, rs->min_run[i],
rs->max_run[i]);
iops = (1000 * ts->total_io_u[ddir]) / runt;
iops_p = num2str(iops, 6, 1, 0);
- log_info(" %s: io=%siB, bw=%siB/s, iops=%s, runt=%6lumsec\n",
+ log_info(" %s: io=%sB, bw=%sB/s, iops=%s, runt=%6lumsec\n",
ddir_str[ddir], io_p, bw_p, iops_p,
ts->runtime[ddir]);
double p_of_agg;
p_of_agg = mean * 100 / (double) rs->agg[ddir];
- log_info(" bw (KiB/s) : min=%5lu, max=%5lu, per=%3.2f%%,"
+ log_info(" bw (KB/s) : min=%5lu, max=%5lu, per=%3.2f%%,"
" avg=%5.02f, stdev=%5.02f\n", min, max, p_of_agg,
mean, dev);
}
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/<%s>\n",
+ ts->total_err_count,
+ ts->first_error,
+ strerror(ts->first_error));
+ }
}
static void show_ddir_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)
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++) {