Re: [PATCH V3] Adds verify_only option

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jens, Ping?
Still able to integrate this patch?

thanks,
grant

On Tue, Sep 17, 2013 at 2:06 PM, Juan Casse <jcasse@xxxxxxxxxxxx> wrote:
> When this option is set, a dry run (no actual io is performed) of the
> workload will be done in order to compute the numberio for each block
> header without overwriting the data on disk. Then, do_verify() will be
> effectively verifying data that was written in a previous fio run.
> In the case that "loops" is set to more than 1, do_verify() will delay
> the verification of numberio to the last iteration when the same
> numberio state that would have been written to disk in a previous
> fio run has been reached.
>
> Signed-off-by: Juan Casse <jcasse@xxxxxxxxxxxx>
> Reviewed-by: Grant Grundler <grundler@xxxxxxxxxxxx>
> ---
> This patch depends on "[PATCH] Adds check for numberio during verify phase"
> sent on September 5, 2013.
>
>  HOWTO            | 11 ++++++++++-
>  README           |  2 ++
>  backend.c        | 43 ++++++++++++++++++++++++++++++++++++++++++-
>  init.c           | 17 +++++++++++++++++
>  options.c        |  9 +++++++++
>  thread_options.h |  2 ++
>  verify.c         |  8 ++++++--
>  7 files changed, 88 insertions(+), 4 deletions(-)
>
> diff --git a/HOWTO b/HOWTO
> index 005dac2..a3ca770 100644
> --- a/HOWTO
> +++ b/HOWTO
> @@ -1039,6 +1039,13 @@ 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.
>
> +verify_only    Do not perform specified workload---only verify data still
> +               matches previous invocation of this workload. This option
> +               allows one to check data multiple times at a later date
> +               without overwriting it. This option makes sense only for
> +               workloads that write data, and does not support workloads
> +               with the time_based option set.
> +
>  do_verify=bool Run the verify phase after a write phase. Only makes sense if
>                 verify is set. Defaults to 1.
>
> @@ -1077,7 +1084,9 @@ verify=str        If writing to a file, fio can verify the file contents
>
>                         meta    Write extra information about each io
>                                 (timestamp, block number etc.). The block
> -                               number is verified. See also verify_pattern.
> +                               number is verified. The io sequence number is
> +                               verified for workloads that write data.
> +                               See also verify_pattern.
>
>                         null    Only pretend to verify. Useful for testing
>                                 internals with ioengine=null, not for much
> diff --git a/README b/README
> index 15a0731..7942069 100644
> --- a/README
> +++ b/README
> @@ -141,6 +141,8 @@ $ fio
>         --latency-log           Generate per-job latency logs
>         --bandwidth-log         Generate per-job bandwidth logs
>         --minimal               Minimal (terse) output
> +       --verifyonly            Skip workload io and only verify data
> +                               (includes stale data check)
>         --output-format=type    Output format (terse,json,normal)
>         --terse-version=type    Terse version output format (default 3, or 2 or 4).
>         --version               Print version info and exit
> diff --git a/backend.c b/backend.c
> index b9c1c12..c74c001 100644
> --- a/backend.c
> +++ b/backend.c
> @@ -1104,6 +1104,44 @@ static int exec_string(struct thread_options *o, const char *string, const char
>  }
>
>  /*
> + * Dry run to compute correct state of numberio for verification.
> + */
> +static uint64_t do_dry_run(struct thread_data *td)
> +{
> +       uint64_t bytes_done[DDIR_RWDIR_CNT] = { 0, 0, 0 };
> +
> +       td_set_runstate(td, TD_RUNNING);
> +
> +       while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) ||
> +               (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td)) {
> +               struct io_u *io_u;
> +               int ret;
> +
> +               if (td->terminate || td->done)
> +                       break;
> +
> +               io_u = get_io_u(td);
> +               if (!io_u)
> +                       break;
> +
> +               io_u->flags |= IO_U_F_FLIGHT;
> +               io_u->error = 0;
> +               io_u->resid = 0;
> +               if (ddir_rw(acct_ddir(io_u)))
> +                       td->io_issues[acct_ddir(io_u)]++;
> +               if (ddir_rw(io_u->ddir)) {
> +                       io_u_mark_depth(td, 1);
> +                       td->ts.total_io_u[io_u->ddir]++;
> +               }
> +
> +               ret = io_u_sync_complete(td, io_u, bytes_done);
> +               (void) ret;
> +       }
> +
> +       return bytes_done[DDIR_WRITE] + bytes_done[DDIR_TRIM];
> +}
> +
> +/*
>   * Entry point for the thread based jobs. The process based jobs end up
>   * here as well, after a little setup.
>   */
> @@ -1311,7 +1349,10 @@ static void *thread_main(void *data)
>
>                 prune_io_piece_log(td);
>
> -               verify_bytes = do_io(td);
> +               if (td->o.verify_only && (td_write(td) || td_rw(td)))
> +                       verify_bytes = do_dry_run(td);
> +               else
> +                       verify_bytes = do_io(td);
>
>                 clear_state = 1;
>
> diff --git a/init.c b/init.c
> index 1afc341..34d1f14 100644
> --- a/init.c
> +++ b/init.c
> @@ -60,6 +60,8 @@ int write_bw_log = 0;
>  int read_only = 0;
>  int status_interval = 0;
>
> +int verify_only = 0;
> +
>  static int write_lat_log;
>
>  static int prev_group_jobs;
> @@ -139,6 +141,11 @@ static struct option l_opts[FIO_NR_OPTIONS] = {
>                 .val            = 'r' | FIO_CLIENT_FLAG,
>         },
>         {
> +               .name           = (char *) "verifyonly",
> +               .has_arg        = no_argument,
> +               .val            = 'y' | FIO_CLIENT_FLAG,
> +       },
> +       {
>                 .name           = (char *) "eta",
>                 .has_arg        = required_argument,
>                 .val            = 'e' | FIO_CLIENT_FLAG,
> @@ -928,6 +935,13 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
>         int numjobs, file_alloced;
>         struct thread_options *o = &td->o;
>
> +       /*
> +        * Ensure job option verify_only is set when provided as a
> +        * command-line argument.
> +        */
> +       if (verify_only)
> +               o->verify_only = 1;
> +
>         /*
>          * the def_thread is just for options, it's not a real job
>          */
> @@ -1661,6 +1675,9 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
>                 case 'r':
>                         read_only = 1;
>                         break;
> +               case 'y':
> +                       verify_only = 1;
> +                       break;
>                 case 'v':
>                         if (!cur_client) {
>                                 log_info("%s\n", fio_version_string);
> diff --git a/options.c b/options.c
> index caf89d3..e6b9ec9 100644
> --- a/options.c
> +++ b/options.c
> @@ -1935,6 +1935,15 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
>                 .group  = FIO_OPT_G_RUNTIME,
>         },
>         {
> +               .name   = "verify_only",
> +               .lname  = "Verify only",
> +               .type   = FIO_OPT_STR_SET,
> +               .off1   = td_var_offset(verify_only),
> +               .help   = "Verifies previously written data is still valid",
> +               .category = FIO_OPT_C_GENERAL,
> +               .group  = FIO_OPT_G_RUNTIME,
> +       },
> +       {
>                 .name   = "ramp_time",
>                 .lname  = "Ramp time",
>                 .type   = FIO_OPT_STR_VAL_TIME,
> diff --git a/thread_options.h b/thread_options.h
> index 3f345c5..c9660b4 100644
> --- a/thread_options.h
> +++ b/thread_options.h
> @@ -107,6 +107,8 @@ struct thread_options {
>         unsigned int fsync_on_close;
>         unsigned int bs_is_seq_rand;
>
> +       unsigned int verify_only;
> +
>         unsigned int random_distribution;
>
>         fio_fp64_t zipf_theta;
> diff --git a/verify.c b/verify.c
> index 63def12..9343ab9 100644
> --- a/verify.c
> +++ b/verify.c
> @@ -373,10 +373,14 @@ static int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc)
>          * For read-only workloads, the program cannot be certain of the
>          * last numberio written to a block. Checking of numberio will be done
>          * only for workloads that write data.
> +        * For verify_only, numberio will be checked in the last iteration when
> +        * the correct state of numberio, that would have been written to each
> +        * block in a previous run of fio, has been reached.
>          */
>         if (td_write(td) || td_rw(td))
> -               if (vh->numberio != io_u->numberio)
> -                       ret = EILSEQ;
> +               if (!td->o.verify_only || td->o.loops == 0)
> +                       if (vh->numberio != io_u->numberio)
> +                               ret = EILSEQ;
>
>         if (!ret)
>                 return 0;
> --
> 1.7.12.4
>
--
To unsubscribe from this list: send the line "unsubscribe fio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Linux SCSI]     [Linux IDE]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux