init: ensure that read/write use the same random seed for verify
authorJens Axboe <axboe@kernel.dk>
Tue, 17 Apr 2018 23:48:43 +0000 (17:48 -0600)
committerJens Axboe <axboe@kernel.dk>
Tue, 17 Apr 2018 23:51:40 +0000 (17:51 -0600)
If we are verifying, then reads need to use the same blockrange
random trim as writes. Otherwise doing a deferred verify of
a write job may not yield the same block size ranges, causing
verify to fail.

Example of failed job:

$ cat job.fio
[global]
ioengine=sync
verify=md5
bsrange=1k-16k
rw=randwrite
randseed=50
size=10m
filename=foo

[write]
rw=randwrite
do_verify=0
write_iolog=wlog

[read]
rw=randread
do_verify=1
verify_fatal=1
verify_dump=1
write_iolog=rlog

$ fio --section=write job.fio
$ fio --section=read job.fio

Fixes: https://github.com/axboe/fio/issues/582
Signed-off-by: Jens Axboe <axboe@kernel.dk>
init.c

diff --git a/init.c b/init.c
index f5ff73d067bb62229b3a45e4d9fe74ffc31f3bb0..07d1cdd31df2b1cba4f4ce8a07b3c4ed96e92353 100644 (file)
--- a/init.c
+++ b/init.c
@@ -997,23 +997,26 @@ void td_fill_verify_state_seed(struct thread_data *td)
 
 static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64)
 {
+       unsigned int read_seed = td->rand_seeds[FIO_RAND_BS_OFF];
+       unsigned int write_seed = td->rand_seeds[FIO_RAND_BS1_OFF];
+       unsigned int trim_seed = td->rand_seeds[FIO_RAND_BS2_OFF];
        int i;
 
        /*
         * trimwrite is special in that we need to generate the same
         * offsets to get the "write after trim" effect. If we are
         * using bssplit to set buffer length distributions, ensure that
-        * we seed the trim and write generators identically.
+        * we seed the trim and write generators identically. Ditto for
+        * verify, read and writes must have the same seed, if we are doing
+        * read verify.
         */
-       if (td_trimwrite(td)) {
-               init_rand_seed(&td->bsrange_state[DDIR_READ], td->rand_seeds[FIO_RAND_BS_OFF], use64);
-               init_rand_seed(&td->bsrange_state[DDIR_WRITE], td->rand_seeds[FIO_RAND_BS1_OFF], use64);
-               init_rand_seed(&td->bsrange_state[DDIR_TRIM], td->rand_seeds[FIO_RAND_BS1_OFF], use64);
-       } else {
-               init_rand_seed(&td->bsrange_state[DDIR_READ], td->rand_seeds[FIO_RAND_BS_OFF], use64);
-               init_rand_seed(&td->bsrange_state[DDIR_WRITE], td->rand_seeds[FIO_RAND_BS1_OFF], use64);
-               init_rand_seed(&td->bsrange_state[DDIR_TRIM], td->rand_seeds[FIO_RAND_BS2_OFF], use64);
-       }
+       if (td->o.verify != VERIFY_NONE)
+               write_seed = read_seed;
+       if (td_trimwrite(td))
+               trim_seed = write_seed;
+       init_rand_seed(&td->bsrange_state[DDIR_READ], read_seed, use64);
+       init_rand_seed(&td->bsrange_state[DDIR_WRITE], write_seed, use64);
+       init_rand_seed(&td->bsrange_state[DDIR_TRIM], trim_seed, use64);
 
        td_fill_verify_state_seed(td);
        init_rand_seed(&td->rwmix_state, td->rand_seeds[FIO_RAND_MIX_OFF], false);