Fio 2.1.11
[fio.git] / init.c
diff --git a/init.c b/init.c
index c2d6109f079ac2c156cb306fc5e420ac364590d6..cf1d7f938fb33acfda49b540d94c65249245e070 100644 (file)
--- a/init.c
+++ b/init.c
@@ -170,6 +170,13 @@ static struct option l_opts[FIO_NR_OPTIONS] = {
                .has_arg        = required_argument,
                .val            = 'x' | FIO_CLIENT_FLAG,
        },
+#ifdef CONFIG_ZLIB
+       {
+               .name           = (char *) "inflate-log",
+               .has_arg        = required_argument,
+               .val            = 'X' | FIO_CLIENT_FLAG,
+       },
+#endif
        {
                .name           = (char *) "alloc-size",
                .has_arg        = required_argument,
@@ -1145,25 +1152,70 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                goto err;
 
        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, 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, 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, logname);
+               struct log_params p = {
+                       .td = td,
+                       .avg_msec = o->log_avg_msec,
+                       .log_type = IO_LOG_TYPE_LAT,
+                       .log_offset = o->log_offset,
+                       .log_gz = o->log_gz,
+                       .log_gz_store = o->log_gz_store,
+               };
+               const char *suf;
+
+               if (p.log_gz_store)
+                       suf = "log.fz";
+               else
+                       suf = "log";
+
+               snprintf(logname, sizeof(logname), "%s_lat.%d.%s",
+                               o->lat_log_file, td->thread_number, suf);
+               setup_log(&td->lat_log, &p, logname);
+               snprintf(logname, sizeof(logname), "%s_slat.%d.%s",
+                               o->lat_log_file, td->thread_number, suf);
+               setup_log(&td->slat_log, &p, logname);
+               snprintf(logname, sizeof(logname), "%s_clat.%d.%s",
+                               o->lat_log_file, td->thread_number, suf);
+               setup_log(&td->clat_log, &p, logname);
        }
        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, logname);
+               struct log_params p = {
+                       .td = td,
+                       .avg_msec = o->log_avg_msec,
+                       .log_type = IO_LOG_TYPE_BW,
+                       .log_offset = o->log_offset,
+                       .log_gz = o->log_gz,
+                       .log_gz_store = o->log_gz_store,
+               };
+               const char *suf;
+
+               if (p.log_gz_store)
+                       suf = "log.fz";
+               else
+                       suf = "log";
+
+               snprintf(logname, sizeof(logname), "%s_bw.%d.%s",
+                               o->bw_log_file, td->thread_number, suf);
+               setup_log(&td->bw_log, &p, 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, logname);
+               struct log_params p = {
+                       .td = td,
+                       .avg_msec = o->log_avg_msec,
+                       .log_type = IO_LOG_TYPE_IOPS,
+                       .log_offset = o->log_offset,
+                       .log_gz = o->log_gz,
+                       .log_gz_store = o->log_gz_store,
+               };
+               const char *suf;
+
+               if (p.log_gz_store)
+                       suf = "log.fz";
+               else
+                       suf = "log";
+
+               snprintf(logname, sizeof(logname), "%s_iops.%d.%s",
+                               o->iops_log_file, td->thread_number, suf);
+               setup_log(&td->iops_log, &p, logname);
        }
 
        if (!o->name)
@@ -1517,7 +1569,7 @@ static void usage(const char *name)
        printf("%s [options] [job options] <job file(s)>\n", name);
        printf("  --debug=options\tEnable debug logging. May be one/more of:\n"
                "\t\t\tprocess,file,io,mem,blktrace,verify,random,parse,\n"
-               "\t\t\tdiskutil,job,mutex,profile,time,net,rate\n");
+               "\t\t\tdiskutil,job,mutex,profile,time,net,rate,compress\n");
        printf("  --parse-only\t\tParse options only, don't start any IO\n");
        printf("  --output\t\tWrite output to file\n");
        printf("  --runtime\t\tRuntime in seconds\n");
@@ -1555,6 +1607,9 @@ static void usage(const char *name)
        printf("  --idle-prof=option\tReport cpu idleness on a system or percpu basis\n"
                "\t\t\t(option=system,percpu) or run unit work\n"
                "\t\t\tcalibration only (option=calibrate)\n");
+#ifdef CONFIG_ZLIB
+       printf("  --inflate-log=log\tInflate and output compressed log\n");
+#endif
        printf("\nFio was written by Jens Axboe <jens.axboe@oracle.com>");
        printf("\n                   Jens Axboe <jaxboe@fusionio.com>");
        printf("\n                   Jens Axboe <axboe@fb.com>\n");
@@ -1622,6 +1677,10 @@ struct debug_level debug_levels[] = {
          .help = "Rate logging",
          .shift = FD_RATE,
        },
+       { .name = "compress",
+         .help = "Log compression logging",
+         .shift = FD_COMPRESS,
+       },
        { .name = NULL, },
 };
 
@@ -1886,6 +1945,13 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        nr_job_sections++;
                        break;
                        }
+#ifdef CONFIG_ZLIB
+               case 'X':
+                       exit_val = iolog_file_inflate(optarg);
+                       did_arg++;
+                       do_exit++;
+                       break;
+#endif
                case 'p':
                        did_arg = 1;
                        if (exec_profile)
@@ -1943,10 +2009,8 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        if (!ret && !strcmp(opt, "ioengine")) {
                                free_ioengine(td);
                                if (ioengine_load(td)) {
-                                       if (td) {
-                                               put_job(td);
-                                               td = NULL;
-                                       }
+                                       put_job(td);
+                                       td = NULL;
                                        do_exit++;
                                        break;
                                }