Add 'unlink_each_loop' option
authormrturtledev <mrturtledev@gmail.com>
Mon, 8 Aug 2016 15:57:14 +0000 (09:57 -0600)
committerJens Axboe <axboe@fb.com>
Mon, 8 Aug 2016 15:57:14 +0000 (09:57 -0600)
If this option is set, fio will unlink the files after each loop
of a job has completed.

Original patch by Martin, various tweaks and updates from me.

Signed-off-by: Jens Axboe <axboe@fb.com>
HOWTO
backend.c
cconv.c
fio.1
options.c
server.h
thread_options.h

diff --git a/HOWTO b/HOWTO
index 0085b7471ff669119b669495b591a3053ff10c32..9d71a96cc844c0dfa5a248d49e59f6813db254b9 100644 (file)
--- a/HOWTO
+++ b/HOWTO
@@ -1334,6 +1334,8 @@ unlink=bool       Unlink the job files when done. Not the default, as repeated
                runs of that job would then waste time recreating the file
                set again and again.
 
+unlink_each_loop=bool  Unlink job files after each iteration or loop.
+
 loops=int      Run the specified number of iterations of this job. Used
                to repeat the same workload a given number of times. Defaults
                to 1.
index c3ad8312de67f13d48e5e67ee9ae117945ba9a22..58727114ab8fb86878bb73c1bc8c7293cc58d37b 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -571,6 +571,28 @@ static inline bool io_in_polling(struct thread_data *td)
        return !td->o.iodepth_batch_complete_min &&
                   !td->o.iodepth_batch_complete_max;
 }
+/*
+ * Unlinks files from thread data fio_file structure
+ */
+static int unlink_all_files(struct thread_data *td)
+{
+       struct fio_file *f;
+       unsigned int i;
+       int ret = 0;
+
+       for_each_file(td, f, i) {
+               if (f->filetype != FIO_TYPE_FILE)
+                       continue;
+               ret = td_io_unlink_file(td, f);
+               if (ret)
+                       break;
+       }
+
+       if (ret)
+               td_verror(td, ret, "unlink_all_files");
+
+       return ret;
+}
 
 /*
  * The main verify engine. Runs over the writes we previously submitted,
@@ -1667,9 +1689,13 @@ static void *thread_main(void *data)
                fio_gettime(&td->start, NULL);
                memcpy(&td->tv_cache, &td->start, sizeof(td->start));
 
-               if (clear_state)
+               if (clear_state) {
                        clear_io_state(td, 0);
 
+                       if (o->unlink_each_loop && unlink_all_files(td))
+                               break;
+               }
+
                prune_io_piece_log(td);
 
                if (td->o.verify_only && (td_write(td) || td_rw(td)))
diff --git a/cconv.c b/cconv.c
index 837963d37354b85a9e3d47a62fd1baaecf642f3a..8d9a0a8e00e9255bd01e097f39ce38ee28b4d50b 100644 (file)
--- a/cconv.c
+++ b/cconv.c
@@ -174,6 +174,7 @@ void convert_thread_options_to_cpu(struct thread_options *o,
        o->verify_batch = le32_to_cpu(top->verify_batch);
        o->use_thread = le32_to_cpu(top->use_thread);
        o->unlink = le32_to_cpu(top->unlink);
+       o->unlink_each_loop = le32_to_cpu(top->unlink_each_loop);
        o->do_disk_util = le32_to_cpu(top->do_disk_util);
        o->override_sync = le32_to_cpu(top->override_sync);
        o->rand_repeatable = le32_to_cpu(top->rand_repeatable);
@@ -367,6 +368,7 @@ void convert_thread_options_to_net(struct thread_options_pack *top,
        top->verify_batch = cpu_to_le32(o->verify_batch);
        top->use_thread = cpu_to_le32(o->use_thread);
        top->unlink = cpu_to_le32(o->unlink);
+       top->unlink_each_loop = cpu_to_le32(o->unlink_each_loop);
        top->do_disk_util = cpu_to_le32(o->do_disk_util);
        top->override_sync = cpu_to_le32(o->override_sync);
        top->rand_repeatable = cpu_to_le32(o->rand_repeatable);
diff --git a/fio.1 b/fio.1
index d1acebcdeef1e55f50686ab3cb877ad2aa52ed9b..696664afb0818d40e7d6d217b7af60ee10fefd05 100644 (file)
--- a/fio.1
+++ b/fio.1
@@ -1246,6 +1246,9 @@ multiple times. Thus it will not work on eg network or splice IO.
 .BI unlink \fR=\fPbool
 Unlink job files when done.  Default: false.
 .TP
+.BI unlink_each_loop \fR=\fPbool
+Unlink job files after each iteration or loop.  Default: false.
+.TP
 .BI loops \fR=\fPint
 Specifies the number of iterations (runs of the same workload) of this job.
 Default: 1.
index 56d3e2b6027e3aa5215a48a0af078902308a2c30..7cd5121988c05d08c1925db2be301e6ea3b07a9f 100644 (file)
--- a/options.c
+++ b/options.c
@@ -3432,6 +3432,16 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_FILE,
                .group  = FIO_OPT_G_INVALID,
        },
+       {
+               .name   = "unlink_each_loop",
+               .lname  = "Unlink file after each loop of a job",
+               .type   = FIO_OPT_BOOL,
+               .off1   = td_var_offset(unlink_each_loop),
+               .help   = "Unlink created files after each loop in a job has completed",
+               .def    = "0",
+               .category = FIO_OPT_C_FILE,
+               .group  = FIO_OPT_G_INVALID,
+       },
        {
                .name   = "exitall",
                .lname  = "Exit-all on terminate",
index c17c3bb571ae05839e4160656009d87ad29b6365..fb384fb15feb7ea185230bfcbb39794179443371 100644 (file)
--- a/server.h
+++ b/server.h
@@ -38,7 +38,7 @@ struct fio_net_cmd_reply {
 };
 
 enum {
-       FIO_SERVER_VER                  = 55,
+       FIO_SERVER_VER                  = 56,
 
        FIO_SERVER_MAX_FRAGMENT_PDU     = 1024,
        FIO_SERVER_MAX_CMD_MB           = 2048,
index 449c66f5b8afcb2756670424627da4c15516f897..d70fda3f949145ff99dec4026a9e6b137f0f078e 100644 (file)
@@ -121,6 +121,7 @@ struct thread_options {
        unsigned int verify_state_save;
        unsigned int use_thread;
        unsigned int unlink;
+       unsigned int unlink_each_loop;
        unsigned int do_disk_util;
        unsigned int override_sync;
        unsigned int rand_repeatable;
@@ -378,6 +379,7 @@ struct thread_options_pack {
        uint32_t verify_state_save;
        uint32_t use_thread;
        uint32_t unlink;
+       uint32_t unlink_each_loop;
        uint32_t do_disk_util;
        uint32_t override_sync;
        uint32_t rand_repeatable;
@@ -396,7 +398,6 @@ struct thread_options_pack {
        uint32_t bs_unaligned;
        uint32_t fsync_on_close;
        uint32_t bs_is_seq_rand;
-       uint32_t pad1;
 
        uint32_t random_distribution;
        uint32_t exitall_error;