return 0;
if (write_bw_log) {
- setup_log(&agg_io_log[DDIR_READ], 0, IO_LOG_TYPE_BW, 0);
- setup_log(&agg_io_log[DDIR_WRITE], 0, IO_LOG_TYPE_BW, 0);
- setup_log(&agg_io_log[DDIR_TRIM], 0, IO_LOG_TYPE_BW, 0);
+ setup_log(&agg_io_log[DDIR_READ], 0, IO_LOG_TYPE_BW, 0, "agg-read_bw.log");
+ setup_log(&agg_io_log[DDIR_WRITE], 0, IO_LOG_TYPE_BW, 0, "agg-write_bw.log");
+ setup_log(&agg_io_log[DDIR_TRIM], 0, IO_LOG_TYPE_BW, 0, "agg-trim_bw.log");
}
startup_mutex = fio_mutex_init(FIO_MUTEX_LOCKED);
if (!fio_abort) {
show_run_stats();
if (write_bw_log) {
- __finish_log(agg_io_log[DDIR_READ], "agg-read_bw.log");
- __finish_log(agg_io_log[DDIR_WRITE],
- "agg-write_bw.log");
- __finish_log(agg_io_log[DDIR_TRIM],
- "agg-write_bw.log");
+ int i;
+
+ for (i = 0; i < DDIR_RWDIR_CNT; i++) {
+ struct io_log *log = agg_io_log[i];
+
+ __finish_log(log);
+ }
}
}
int read_only = 0;
int status_interval = 0;
-static int write_lat_log;
-
static int prev_group_jobs;
unsigned long fio_debug = 0;
char fname[PATH_MAX];
int numjobs, file_alloced;
struct thread_options *o = &td->o;
+ char logname[PATH_MAX + 32];
/*
* the def_thread is just for options, it's not a real job
if (setup_rate(td))
goto err;
- if (o->lat_log_file || write_lat_log) {
+ if (o->lat_log_file) {
+ snprintf(logname, sizeof(logname), "%s_lat.log", o->lat_log_file);
setup_log(&td->lat_log, o->log_avg_msec, IO_LOG_TYPE_LAT,
- o->log_offset);
+ o->log_offset, logname);
+ snprintf(logname, sizeof(logname), "%s_slat.log", o->lat_log_file);
setup_log(&td->slat_log, o->log_avg_msec, IO_LOG_TYPE_SLAT,
- o->log_offset);
+ o->log_offset, logname);
+ snprintf(logname, sizeof(logname), "%s_clat.log", o->lat_log_file);
setup_log(&td->clat_log, o->log_avg_msec, IO_LOG_TYPE_CLAT,
- o->log_offset);
+ o->log_offset, logname);
}
- if (o->bw_log_file || write_bw_log)
+ if (o->bw_log_file) {
+ snprintf(logname, sizeof(logname), "%s_bw.log", o->bw_log_file);
setup_log(&td->bw_log, o->log_avg_msec, IO_LOG_TYPE_BW,
- o->log_offset);
- if (o->iops_log_file)
+ o->log_offset, logname);
+ }
+ if (o->iops_log_file) {
+ snprintf(logname, sizeof(logname), "%s_iops.log", o->iops_log_file);
setup_log(&td->iops_log, o->log_avg_msec, IO_LOG_TYPE_IOPS,
- o->log_offset);
+ o->log_offset, logname);
+ }
if (!o->name)
o->name = strdup(jobname);
}
break;
case 'l':
- write_lat_log = 1;
+ log_err("fio: --latency-log is deprecated. Use per-job latency log options.\n");
+ do_exit++;
+ exit_val = 1;
break;
case 'b':
write_bw_log = 1;
}
void setup_log(struct io_log **log, unsigned long avg_msec, int log_type,
- int log_offset)
+ int log_offset, const char *filename)
{
struct io_log *l = malloc(sizeof(*l));
l->log_offset = log_offset;
l->log = malloc(l->max_samples * log_entry_sz(l));
l->avg_msec = avg_msec;
+ l->filename = strdup(filename);
*log = l;
}
}
#endif
-void __finish_log(struct io_log *log, const char *name)
+static void free_log(struct io_log *log)
+{
+ free(log->log);
+ free(log->filename);
+ free(log);
+}
+
+void __finish_log(struct io_log *log)
{
uint64_t i;
void *buf;
FILE *f;
- f = fopen(name, "a");
+ f = fopen(log->filename, "a");
if (!f) {
perror("fopen log");
return;
fclose(f);
clear_file_buffer(buf);
- free(log->log);
- free(log);
+ free_log(log);
}
-static int finish_log_named(struct thread_data *td, struct io_log *log,
- const char *prefix, const char *postfix,
- int trylock)
+static int finish_log(struct thread_data *td, struct io_log *log, int trylock)
{
- char file_name[256];
-
- snprintf(file_name, sizeof(file_name), "%s_%s.log", prefix, postfix);
-
if (trylock) {
- if (fio_trylock_file(file_name))
+ if (fio_trylock_file(log->filename))
return 1;
} else
- fio_lock_file(file_name);
+ fio_lock_file(log->filename);
if (td->client_type == FIO_CLIENT_TYPE_GUI) {
- fio_send_iolog(td, log, file_name);
- free(log->log);
- free(log);
+ fio_send_iolog(td, log, log->filename);
+ free_log(log);
} else
- __finish_log(log, file_name);
+ __finish_log(log);
- fio_unlock_file(file_name);
+ fio_unlock_file(log->filename);
return 0;
}
-static int finish_log(struct thread_data *td, struct io_log *log,
- const char *name, int trylock)
-{
- return finish_log_named(td, log, td->o.name, name, trylock);
-}
-
-static int write_this_log(struct thread_data *td, struct io_log *log,
- const char *log_file, const char *name, int try)
+static int write_iops_log(struct thread_data *td, int try)
{
- int ret;
+ struct io_log *log = td->iops_log;
if (!log)
return 0;
- if (log_file)
- ret = finish_log_named(td, log, log_file, name, try);
- else
- ret = finish_log(td, log, name, try);
-
- return ret;
-}
-
-static int write_iops_log(struct thread_data *td, int try)
-{
- struct thread_options *o = &td->o;
-
- return write_this_log(td, td->iops_log, o->iops_log_file, "iops", try);
+ return finish_log(td, log, try);
}
static int write_slat_log(struct thread_data *td, int try)
{
- struct thread_options *o = &td->o;
+ struct io_log *log = td->slat_log;
- return write_this_log(td, td->slat_log, o->lat_log_file, "slat", try);
+ if (!log)
+ return 0;
+
+ return finish_log(td, log, try);
}
static int write_clat_log(struct thread_data *td, int try)
{
- struct thread_options *o = &td->o;
+ struct io_log *log = td->clat_log;
- return write_this_log(td, td->clat_log, o->lat_log_file, "clat" , try);
+ if (!log)
+ return 0;
+
+ return finish_log(td, log, try);
}
static int write_lat_log(struct thread_data *td, int try)
{
- struct thread_options *o = &td->o;
+ struct io_log *log = td->lat_log;
+
+ if (!log)
+ return 0;
- return write_this_log(td, td->lat_log, o->lat_log_file, "lat", try);
+ return finish_log(td, log, try);
}
static int write_bandw_log(struct thread_data *td, int try)
{
- struct thread_options *o = &td->o;
+ struct io_log *log = td->bw_log;
+
+ if (!log)
+ return 0;
- return write_this_log(td, td->bw_log, o->bw_log_file, "bw", try);
+ return finish_log(td, log, try);
}
enum {