unsigned long long io_bytes[2];
unsigned long runtime[2];
unsigned long total_run_time;
+
+ /*
+ * IO Error related stats
+ */
+ unsigned continue_on_error;
+ unsigned long total_err_count;
+ int first_error;
};
struct bssplit {
unsigned int thinktime_spin;
unsigned int thinktime_blocks;
unsigned int fsync_blocks;
+ unsigned int fdatasync_blocks;
unsigned int start_delay;
unsigned long long timeout;
unsigned long long ramp_time;
char *exec_prerun;
char *exec_postrun;
- unsigned int rate;
- unsigned int ratemin;
+ unsigned int rate[2];
+ unsigned int ratemin[2];
unsigned int ratecycle;
- unsigned int rate_iops;
- unsigned int rate_iops_min;
+ unsigned int rate_iops[2];
+ unsigned int rate_iops_min[2];
char *ioscheduler;
*/
unsigned int cpuload;
unsigned int cpucycle;
+
+ /*
+ * I/O Error handling
+ */
+ unsigned int continue_on_error;
};
#define FIO_VERROR_SIZE 128
/*
* Rate state
*/
- unsigned long rate_usec_cycle;
- long rate_pending_usleep;
- unsigned long rate_bytes;
- unsigned long rate_blocks;
- struct timeval lastrate;
+ unsigned long rate_usec_cycle[2];
+ long rate_pending_usleep[2];
+ unsigned long rate_bytes[2];
+ unsigned long rate_blocks[2];
+ struct timeval lastrate[2];
unsigned long long total_io_size;
* For generating file sizes
*/
os_random_state_t file_size_state;
+
+ /*
+ * Error counts
+ */
+ unsigned int total_err_count;
+ int first_error;
};
/*
break; \
int e = (err); \
(td)->error = e; \
- snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg)); \
+ if (!(td)->first_error) \
+ snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg)); \
} while (0)
+#define td_clear_error(td) \
+ (td)->error = 0;
#define td_verror(td, err, func) \
__td_verror((td), (err), strerror((err)), (func))
#define td_vmsg(td, err, msg, func) \
#define MAX_JOBS (1024)
+#define td_non_fatal_error(e) ((e) == EIO || (e) == EILSEQ)
+
+static inline void update_error_count(struct thread_data *td, int err)
+{
+ td->total_err_count++;
+ if (td->total_err_count == 1)
+ td->first_error = err;
+}
+
static inline int should_fsync(struct thread_data *td)
{
if (td->last_was_sync)
extern unsigned long mtime_since_genesis(void);
extern void usec_spin(unsigned int);
extern void usec_sleep(struct thread_data *, unsigned long);
-extern void rate_throttle(struct thread_data *, unsigned long, unsigned int);
extern void fill_start_time(struct timeval *);
extern void fio_gettime(struct timeval *, void *);
extern void fio_gtod_init(void);
return buf;
}
+static inline int __should_check_rate(struct thread_data *td,
+ enum fio_ddir ddir)
+{
+ struct thread_options *o = &td->o;
+
+ /*
+ * If some rate setting was given, we need to check it
+ */
+ if (o->rate[ddir] || o->ratemin[ddir] || o->rate_iops[ddir] ||
+ o->rate_iops_min[ddir])
+ return 1;
+
+ return 0;
+}
+
+static inline int should_check_rate(struct thread_data *td,
+ unsigned long *bytes_done)
+{
+ int ret = 0;
+
+ if (bytes_done[0])
+ ret |= __should_check_rate(td, 0);
+ if (bytes_done[1])
+ ret |= __should_check_rate(td, 1);
+
+ return ret;
+}
+
#endif