static int str_fst_cb(void *data, const char *str)
{
struct thread_data *td = data;
- char *nr = get_opt_postfix(str);
+ double val;
+ bool done = false;
+ char *nr;
td->file_service_nr = 1;
- if (nr) {
- td->file_service_nr = atoi(nr);
+
+ switch (td->o.file_service_type) {
+ case FIO_FSERVICE_RANDOM:
+ case FIO_FSERVICE_RR:
+ case FIO_FSERVICE_SEQ:
+ nr = get_opt_postfix(str);
+ if (nr) {
+ td->file_service_nr = atoi(nr);
+ free(nr);
+ }
+ done = true;
+ break;
+ case FIO_FSERVICE_ZIPF:
+ val = FIO_DEF_ZIPF;
+ break;
+ case FIO_FSERVICE_PARETO:
+ val = FIO_DEF_PARETO;
+ break;
+ case FIO_FSERVICE_GAUSS:
+ val = 0.0;
+ break;
+ default:
+ log_err("fio: bad file service type: %d\n", td->o.file_service_type);
+ return 1;
+ }
+
+ if (done)
+ return 0;
+
+ nr = get_opt_postfix(str);
+ if (nr && !str_to_float(nr, &val, 0)) {
+ log_err("fio: file service type random postfix parsing failed\n");
free(nr);
+ return 1;
+ }
+
+ free(nr);
+
+ switch (td->o.file_service_type) {
+ case FIO_FSERVICE_ZIPF:
+ if (val == 1.00) {
+ log_err("fio: zipf theta must be different than 1.0\n");
+ return 1;
+ }
+ if (parse_dryrun())
+ return 0;
+ td->zipf_theta = val;
+ break;
+ case FIO_FSERVICE_PARETO:
+ if (val <= 0.00 || val >= 1.00) {
+ log_err("fio: pareto input out of range (0 < input < 1.0)\n");
+ return 1;
+ }
+ if (parse_dryrun())
+ return 0;
+ td->pareto_h = val;
+ break;
+ case FIO_FSERVICE_GAUSS:
+ if (val < 0.00 || val >= 100.00) {
+ log_err("fio: normal deviation out of range (0 <= input < 100.0)\n");
+ return 1;
+ }
+ if (parse_dryrun())
+ return 0;
+ td->gauss_dev = val;
+ break;
}
return 0;
return 0;
td->o.pareto_h.u.f = val;
} else {
- if (val <= 0.00 || val >= 100.0) {
- log_err("fio: normal deviation out of range (0 < input < 100.0)\n");
+ if (val < 0.00 || val >= 100.0) {
+ log_err("fio: normal deviation out of range (0 <= input < 100.0)\n");
return 1;
}
if (parse_dryrun())
* Returns the directory at the index, indexes > entires will be
* assigned via modulo division of the index
*/
-int set_name_idx(char *target, size_t tlen, char *input, int index)
+int set_name_idx(char *target, size_t tlen, char *input, int index,
+ bool unique_filename)
{
unsigned int cur_idx;
int len;
for (cur_idx = 0; cur_idx <= index; cur_idx++)
fname = get_next_name(&str);
- if (client_sockaddr_str[0]) {
+ if (client_sockaddr_str[0] && unique_filename) {
len = snprintf(target, tlen, "%s/%s.", fname,
client_sockaddr_str);
} else
},
{
.name = "filename_format",
+ .lname = "Filename Format",
.type = FIO_OPT_STR_STORE,
.off1 = td_var_offset(filename_format),
.prio = -1, /* must come after "directory" */
.category = FIO_OPT_C_FILE,
.group = FIO_OPT_G_FILENAME,
},
+ {
+ .name = "unique_filename",
+ .lname = "Unique Filename",
+ .type = FIO_OPT_BOOL,
+ .off1 = td_var_offset(unique_filename),
+ .help = "For network clients, prefix file with source IP",
+ .def = "1",
+ .category = FIO_OPT_C_FILE,
+ .group = FIO_OPT_G_FILENAME,
+ },
{
.name = "lockfile",
.lname = "Lockfile",
.help = "Use preadv/pwritev",
},
#endif
-#ifdef CONFIG_PWRITEV2
+#ifdef FIO_HAVE_PWRITEV2
{ .ival = "pvsync2",
.help = "Use preadv2/pwritev2",
},
.help = "Number of IO buffers to submit in one go",
.parent = "iodepth",
.hide = 1,
- .minval = 1,
.interval = 1,
.def = "1",
.category = FIO_OPT_C_IO,
},
{
.name = "random_generator",
+ .lname = "Random Generator",
.type = FIO_OPT_STR,
.off1 = td_var_offset(random_generator),
.help = "Type of random number generator to use",
},
{
.name = "random_distribution",
+ .lname = "Random Distribution",
.type = FIO_OPT_STR,
.off1 = td_var_offset(random_distribution),
.cb = str_random_distribution_cb,
},
{ .ival = "normal",
.oval = FIO_RAND_DIST_GAUSS,
- .help = "Normal (gaussian) distribution",
+ .help = "Normal (Gaussian) distribution",
},
{ .ival = "zoned",
.oval = FIO_RAND_DIST_ZONED,
},
{
.name = "allrandrepeat",
+ .lname = "All Random Repeat",
.type = FIO_OPT_BOOL,
.off1 = td_var_offset(allrand_repeatable),
.help = "Use repeatable random numbers for everything",
.posval = {
{ .ival = "random",
.oval = FIO_FSERVICE_RANDOM,
- .help = "Choose a file at random",
+ .help = "Choose a file at random (uniform)",
+ },
+ { .ival = "zipf",
+ .oval = FIO_FSERVICE_ZIPF,
+ .help = "Zipf randomized",
+ },
+ { .ival = "pareto",
+ .oval = FIO_FSERVICE_PARETO,
+ .help = "Pareto randomized",
+ },
+ { .ival = "gauss",
+ .oval = FIO_FSERVICE_GAUSS,
+ .help = "Normal (guassian) distribution",
},
{ .ival = "roundrobin",
.oval = FIO_FSERVICE_RR,
},
{
.name = "verifysort_nr",
+ .lname = "Verify Sort Nr",
.type = FIO_OPT_INT,
.off1 = td_var_offset(verifysort_nr),
.help = "Pre-load and sort verify blocks for a read workload",
#endif
{
.name = "experimental_verify",
+ .lname = "Experimental Verify",
.off1 = td_var_offset(experimental_verify),
.type = FIO_OPT_BOOL,
.help = "Enable experimental verification",
},
{
.name = "max_latency",
+ .lname = "Max Latency",
.type = FIO_OPT_INT,
.off1 = td_var_offset(max_latency),
.help = "Maximum tolerated IO latency (usec)",
},
{
.name = "create_only",
+ .lname = "Create Only",
.type = FIO_OPT_BOOL,
.off1 = td_var_offset(create_only),
.help = "Only perform file creation phase",
#ifdef CONFIG_LIBNUMA
{
.name = "numa_cpu_nodes",
+ .lname = "NUMA CPU Nodes",
.type = FIO_OPT_STR,
.cb = str_numa_cpunodes_cb,
.off1 = td_var_offset(numa_cpunodes),
},
{
.name = "numa_mem_policy",
+ .lname = "NUMA Memory Policy",
.type = FIO_OPT_STR,
.cb = str_numa_mpol_cb,
.off1 = td_var_offset(numa_memnodes),
},
{
.name = "per_job_logs",
+ .lname = "Per Job Logs",
.type = FIO_OPT_BOOL,
.off1 = td_var_offset(per_job_logs),
.help = "Include job number in generated log files or not",
},
{
.name = "unified_rw_reporting",
+ .lname = "Unified RW Reporting",
.type = FIO_OPT_BOOL,
.off1 = td_var_offset(unified_rw_rep),
.help = "Unify reporting across data direction",
},
{
.name = "ignore_error",
+ .lname = "Ignore Error",
.type = FIO_OPT_STR,
.cb = str_ignore_error_cb,
.off1 = td_var_offset(ignore_error_nr),
},
{
.name = "error_dump",
+ .lname = "Error Dump",
.type = FIO_OPT_BOOL,
.off1 = td_var_offset(error_dump),
.def = "0",
i++;
}
- if (best_option != -1 && string_distance_ok(name, best_distance))
+ if (best_option != -1 && string_distance_ok(name, best_distance) &&
+ fio_options[best_option].type != FIO_OPT_UNSUPPORTED)
log_err("Did you mean %s?\n", fio_options[best_option].name);
free(name);