Cleanup logging
authorJens Axboe <axboe@fb.com>
Tue, 1 Jul 2014 22:29:12 +0000 (16:29 -0600)
committerJens Axboe <axboe@fb.com>
Tue, 1 Jul 2014 22:31:36 +0000 (16:31 -0600)
If the log knows the filename it is supposed to log to, then we
don't need to have part of that on the init side and the other
part on the flush side. So clean it up so that the caller of
setup_log() provides everything we need. This gets rid of
various ways of ending the log, and opens us up to doing
log flushing mid-run.

Signed-off-by: Jens Axboe <axboe@fb.com>
backend.c
init.c
iolog.c
iolog.h

index ac6ed3e45fc2c8cc319a6a614165214ae266464a..95a7572d86bdf06798428ebc635e7622fd3bc32a 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -2020,9 +2020,9 @@ int fio_backend(void)
                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);
@@ -2041,11 +2041,13 @@ int fio_backend(void)
        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);
+                       }
                }
        }
 
diff --git a/init.c b/init.c
index 4f8b38d6e6324f5acab8ccd074a23cdeaf74d3ca..2017dd302726023423fb98ac704e66bba4a9180d 100644 (file)
--- a/init.c
+++ b/init.c
@@ -64,8 +64,6 @@ int write_bw_log = 0;
 int read_only = 0;
 int status_interval = 0;
 
-static int write_lat_log;
-
 static int prev_group_jobs;
 
 unsigned long fio_debug = 0;
@@ -1056,6 +1054,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
        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
@@ -1145,20 +1144,27 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
        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);
@@ -1756,7 +1762,9 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        }
                        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;
diff --git a/iolog.c b/iolog.c
index a79efe2afb491a96657f0638a52b5ad63029add4..a8bead11292c824eb3371f4f2c3e7a8545108cf7 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -540,7 +540,7 @@ int init_iolog(struct thread_data *td)
 }
 
 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));
 
@@ -551,6 +551,7 @@ void setup_log(struct io_log **log, unsigned long avg_msec, int log_type,
        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;
 }
 
@@ -580,13 +581,20 @@ static void clear_file_buffer(void *buf)
 }
 #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;
@@ -615,90 +623,75 @@ void __finish_log(struct io_log *log, const char *name)
 
        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 {
diff --git a/iolog.h b/iolog.h
index eed92971062b7dc058fc777b4c746826e59a1ec4..2c9b2b29cc7c5e6527ac3a251aa99a9394df59dd 100644 (file)
--- a/iolog.h
+++ b/iolog.h
@@ -52,6 +52,8 @@ struct io_log {
        uint64_t max_samples;
        void *log;
 
+       char *filename;
+
        unsigned int log_type;
 
        /*
@@ -167,8 +169,8 @@ extern void add_iops_sample(struct thread_data *, enum fio_ddir, unsigned int,
                                struct timeval *);
 extern void init_disk_util(struct thread_data *);
 extern void update_rusage_stat(struct thread_data *);
-extern void setup_log(struct io_log **, unsigned long, int, int);
-extern void __finish_log(struct io_log *, const char *);
+extern void setup_log(struct io_log **, unsigned long, int, int, const char *);
+extern void __finish_log(struct io_log *);
 extern struct io_log *agg_io_log[DDIR_RWDIR_CNT];
 extern int write_bw_log;
 extern void add_agg_sample(unsigned long, enum fio_ddir, unsigned int);