#include <math.h>
#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)
{
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,
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++) {
}
static void __add_log_sample(struct io_log *iolog, unsigned long val,
- enum fio_ddir ddir, unsigned long time)
+ enum fio_ddir ddir, unsigned int bs,
+ unsigned long time)
{
+ const int nr_samples = iolog->nr_samples;
+
if (iolog->nr_samples == iolog->max_samples) {
int new_size = sizeof(struct io_sample) * iolog->max_samples*2;
iolog->max_samples <<= 1;
}
- iolog->log[iolog->nr_samples].val = val;
- iolog->log[iolog->nr_samples].time = time;
- iolog->log[iolog->nr_samples].ddir = ddir;
+ iolog->log[nr_samples].val = val;
+ iolog->log[nr_samples].time = time;
+ iolog->log[nr_samples].ddir = ddir;
+ iolog->log[nr_samples].bs = bs;
iolog->nr_samples++;
}
static void add_log_sample(struct thread_data *td, struct io_log *iolog,
- unsigned long val, enum fio_ddir ddir)
+ unsigned long val, enum fio_ddir ddir,
+ unsigned int bs)
{
- __add_log_sample(iolog, val, ddir, mtime_since_now(&td->epoch));
+ __add_log_sample(iolog, val, ddir, bs, mtime_since_now(&td->epoch));
}
-void add_agg_sample(unsigned long val, enum fio_ddir ddir)
+void add_agg_sample(unsigned long val, enum fio_ddir ddir, unsigned int bs)
{
struct io_log *iolog = agg_io_log[ddir];
- __add_log_sample(iolog, val, ddir, mtime_since_genesis());
+ __add_log_sample(iolog, val, ddir, bs, mtime_since_genesis());
}
void add_clat_sample(struct thread_data *td, enum fio_ddir ddir,
- unsigned long usec)
+ unsigned long usec, unsigned int bs)
{
struct thread_stat *ts = &td->ts;
add_stat_sample(&ts->clat_stat[ddir], usec);
if (ts->clat_log)
- add_log_sample(td, ts->clat_log, usec, ddir);
+ add_log_sample(td, ts->clat_log, usec, ddir, bs);
}
void add_slat_sample(struct thread_data *td, enum fio_ddir ddir,
- unsigned long usec)
+ unsigned long usec, unsigned int bs)
{
struct thread_stat *ts = &td->ts;
add_stat_sample(&ts->slat_stat[ddir], usec);
if (ts->slat_log)
- add_log_sample(td, ts->slat_log, usec, ddir);
+ add_log_sample(td, ts->slat_log, usec, ddir, bs);
}
-void add_bw_sample(struct thread_data *td, enum fio_ddir ddir,
+void add_bw_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs,
struct timeval *t)
{
struct thread_stat *ts = &td->ts;
add_stat_sample(&ts->bw_stat[ddir], rate);
if (ts->bw_log)
- add_log_sample(td, ts->bw_log, rate, ddir);
+ add_log_sample(td, ts->bw_log, rate, ddir, bs);
fio_gettime(&ts->stat_sample_time[ddir], NULL);
ts->stat_io_bytes[ddir] = td->this_io_bytes[ddir];