summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
e84b371)
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
May be "always", "never" or "auto"
--section=name Only run specified section in job file
--alloc-size=kb Set smalloc pool to this size in kb (def 1024)
May be "always", "never" or "auto"
--section=name Only run specified section in job file
--alloc-size=kb Set smalloc pool to this size in kb (def 1024)
+ --warnings-fatal Fio parser warnings are fatal
Any parameters following the options will be assumed to be job files,
Any parameters following the options will be assumed to be job files,
extern int fio_gtod_offload;
extern int fio_gtod_cpu;
extern enum fio_cs fio_clock_source;
extern int fio_gtod_offload;
extern int fio_gtod_cpu;
extern enum fio_cs fio_clock_source;
+extern int warnings_fatal;
extern struct thread_data *threads;
extern struct thread_data *threads;
FILE *f_err = NULL;
char *job_section = NULL;
char *exec_profile = NULL;
FILE *f_err = NULL;
char *job_section = NULL;
char *exec_profile = NULL;
int write_bw_log = 0;
int read_only = 0;
int write_bw_log = 0;
int read_only = 0;
.has_arg = required_argument,
.val = 'p',
},
.has_arg = required_argument,
.val = 'p',
},
+ {
+ .name = "warnings-fatal",
+ .has_arg = no_argument,
+ .val = 'w',
+ },
static int fixup_options(struct thread_data *td)
{
struct thread_options *o = &td->o;
static int fixup_options(struct thread_data *td)
{
struct thread_options *o = &td->o;
#ifndef FIO_HAVE_PSHARED_MUTEX
if (!o->use_thread) {
#ifndef FIO_HAVE_PSHARED_MUTEX
if (!o->use_thread) {
" mutexes, forcing use of threads. Use the 'thread'"
" option to get rid of this warning.\n");
o->use_thread = 1;
" mutexes, forcing use of threads. Use the 'thread'"
" option to get rid of this warning.\n");
o->use_thread = 1;
log_err("fio: read iolog overrides write_iolog\n");
free(o->write_iolog_file);
o->write_iolog_file = NULL;
log_err("fio: read iolog overrides write_iolog\n");
free(o->write_iolog_file);
o->write_iolog_file = NULL;
!o->norandommap) {
log_err("fio: Any use of blockalign= turns off randommap\n");
o->norandommap = 1;
!o->norandommap) {
log_err("fio: Any use of blockalign= turns off randommap\n");
o->norandommap = 1;
}
if (!o->file_size_high)
}
if (!o->file_size_high)
log_err("fio: norandommap given for variable block sizes, "
"verify disabled\n");
o->verify = VERIFY_NONE;
log_err("fio: norandommap given for variable block sizes, "
"verify disabled\n");
o->verify = VERIFY_NONE;
}
if (o->bs_unaligned && (o->odirect || td->io_ops->flags & FIO_RAWIO))
log_err("fio: bs_unaligned may not work with raw io\n");
}
if (o->bs_unaligned && (o->odirect || td->io_ops->flags & FIO_RAWIO))
log_err("fio: bs_unaligned may not work with raw io\n");
((o->ratemin[0] + o->ratemin[1]) && (o->rate_iops_min[0] +
o->rate_iops_min[1]))) {
log_err("fio: rate and rate_iops are mutually exclusive\n");
((o->ratemin[0] + o->ratemin[1]) && (o->rate_iops_min[0] +
o->rate_iops_min[1]))) {
log_err("fio: rate and rate_iops are mutually exclusive\n");
}
if ((o->rate[0] < o->ratemin[0]) || (o->rate[1] < o->ratemin[1]) ||
(o->rate_iops[0] < o->rate_iops_min[0]) ||
(o->rate_iops[1] < o->rate_iops_min[1])) {
log_err("fio: minimum rate exceeds rate\n");
}
if ((o->rate[0] < o->ratemin[0]) || (o->rate[1] < o->ratemin[1]) ||
(o->rate_iops[0] < o->rate_iops_min[0]) ||
(o->rate_iops[1] < o->rate_iops_min[1])) {
log_err("fio: minimum rate exceeds rate\n");
}
if (!o->timeout && o->time_based) {
log_err("fio: time_based requires a runtime/timeout setting\n");
o->time_based = 0;
}
if (!o->timeout && o->time_based) {
log_err("fio: time_based requires a runtime/timeout setting\n");
o->time_based = 0;
}
if (o->fill_device && !o->size)
o->size = -1ULL;
}
if (o->fill_device && !o->size)
o->size = -1ULL;
- if (td_rw(td) && o->verify != VERIFY_NONE)
- log_info("fio: mixed read/write workload with verify. May not "
- "work as expected, unless you pre-populated the file\n");
-
if (o->verify != VERIFY_NONE) {
if (o->verify != VERIFY_NONE) {
+ if (td_rw(td)) {
+ log_info("fio: mixed read/write workload with verify. "
+ "May not work as expected, unless you "
+ "pre-populated the file\n");
+ ret = warnings_fatal;
+ }
+ if (td_write(td) && o->numjobs) {
+ log_info("Multiple writers may overwrite blocks that "
+ "belong to other jobs. This can cause "
+ "verification failures.\n");
+ ret = warnings_fatal;
+ }
+
o->refill_buffers = 1;
if (o->max_bs[DDIR_WRITE] != o->min_bs[DDIR_WRITE] &&
!o->verify_interval)
o->refill_buffers = 1;
if (o->max_bs[DDIR_WRITE] != o->min_bs[DDIR_WRITE] &&
!o->verify_interval)
if (o->pre_read) {
o->invalidate_cache = 0;
if (o->pre_read) {
o->invalidate_cache = 0;
- if (td->io_ops->flags & FIO_PIPEIO)
+ if (td->io_ops->flags & FIO_PIPEIO) {
log_info("fio: cannot pre-read files with an IO engine"
" that isn't seekable. Pre-read disabled.\n");
log_info("fio: cannot pre-read files with an IO engine"
" that isn't seekable. Pre-read disabled.\n");
+ ret = warnings_fatal;
+ }
}
#ifndef FIO_HAVE_FDATASYNC
}
#ifndef FIO_HAVE_FDATASYNC
" this warning\n");
o->fsync_blocks = o->fdatasync_blocks;
o->fdatasync_blocks = 0;
" this warning\n");
o->fsync_blocks = o->fdatasync_blocks;
o->fdatasync_blocks = 0;
printf("\t--section=name\tOnly run specified section in job file\n");
printf("\t--alloc-size=kb\tSet smalloc pool to this size in kb"
" (def 1024)\n");
printf("\t--section=name\tOnly run specified section in job file\n");
printf("\t--alloc-size=kb\tSet smalloc pool to this size in kb"
" (def 1024)\n");
+ printf("\t--warnings-fatal Fio parser warnings are fatal\n");
printf("\nFio was written by Jens Axboe <jens.axboe@oracle.com>");
printf("\n Jens Axboe <jaxboe@fusionio.com>\n");
}
printf("\nFio was written by Jens Axboe <jens.axboe@oracle.com>");
printf("\n Jens Axboe <jaxboe@fusionio.com>\n");
}
ret = fio_cmd_option_parse(td, opt, val);
break;
}
ret = fio_cmd_option_parse(td, opt, val);
break;
}
+ case 'w':
+ warnings_fatal = 1;
+ break;
default:
do_exit++;
exit_val = 1;
default:
do_exit++;
exit_val = 1;