Re: [PATCH 07/11] zbd: prevent experimental verify with zonemode=zbd

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

 



On Fri, 2022-10-21 at 15:34 +0900, Shin'ichiro Kawasaki wrote:
> When experimental_verify options is specified, fio does not record

s/experimental_verify options/the experimental_verify option/

> normal I/O metadata to create verify read unit. Instead, fio resets file
> status after normal I/O and before verify start, then replay I/Os to
> regenerate write unit and adjust it to verify read. This I/O replay does
> not work for zonemode=zbd since zone status needs to be restored at
> verify start to the status before the normal I/O. However, such status
> restore moves write pointers and erases data pattern for verify.
> 
> Check that the options experimental_verify and zonemode=zbd are not
> specified together and error out in case they are both specified. Also
> remove the helper function zbd_replay_write_order() which is called from
> zbd_adjust_block(). This function adjusts verify read unit to meet zone
> write restrictions for experimental verify, but such adjustment does not
> work because zone status is not restored before verify start.
> 
> Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx>

Thanks for killing zbd_replay_write_order()! It never worked 100% and was very
fragile.

With the commit message nit, looks good.

Tested-by: Dmitry Fomichev <dmitry.fomichev@xxxxxxx>
Reviewed-by: Dmitry Fomichev <dmitry.fomichev@xxxxxxx>
> ---
>  zbd.c | 46 ++++++----------------------------------------
>  zbd.h |  2 --
>  2 files changed, 6 insertions(+), 42 deletions(-)
> 
> diff --git a/zbd.c b/zbd.c
> index b2f43860..ba9b9fee 100644
> --- a/zbd.c
> +++ b/zbd.c
> @@ -288,7 +288,6 @@ static int zbd_reset_zone(struct thread_data *td, struct
> fio_file *f,
>         pthread_mutex_unlock(&f->zbd_info->mutex);
>  
>         z->wp = z->start;
> -       z->verify_block = 0;
>  
>         td->ts.nr_zone_resets++;
>  
> @@ -1082,6 +1081,11 @@ int zbd_setup_files(struct thread_data *td)
>         if (!zbd_verify_bs())
>                 return 1;
>  
> +       if (td->o.experimental_verify) {
> +               log_err("zonemode=zbd does not support experimental verify\n");
> +               return 1;
> +       }
> +
>         for_each_file(td, f, i) {
>                 struct zoned_block_device_info *zbd = f->zbd_info;
>                 struct fio_zone_info *z;
> @@ -1518,42 +1522,6 @@ out:
>         return z;
>  }
>  
> -/* The caller must hold z->mutex. */
> -static struct fio_zone_info *zbd_replay_write_order(struct thread_data *td,
> -                                                   struct io_u *io_u,
> -                                                   struct fio_zone_info *z)
> -{
> -       const struct fio_file *f = io_u->file;
> -       const uint64_t min_bs = td->o.min_bs[DDIR_WRITE];
> -
> -       if (!zbd_open_zone(td, f, z)) {
> -               zone_unlock(z);
> -               z = zbd_convert_to_open_zone(td, io_u);
> -               assert(z);
> -       }
> -
> -       if (z->verify_block * min_bs >= z->capacity) {
> -               log_err("%s: %d * %"PRIu64" >= %"PRIu64"\n",
> -                       f->file_name, z->verify_block, min_bs, z->capacity);
> -               /*
> -                * If the assertion below fails during a test run, adding
> -                * "--experimental_verify=1" to the command line may help.
> -                */
> -               assert(false);
> -       }
> -
> -       io_u->offset = z->start + z->verify_block * min_bs;
> -       if (io_u->offset + io_u->buflen >= zbd_zone_capacity_end(z)) {
> -               log_err("%s: %llu + %llu >= %"PRIu64"\n",
> -                       f->file_name, io_u->offset, io_u->buflen,
> -                       zbd_zone_capacity_end(z));
> -               assert(false);
> -       }
> -       z->verify_block += io_u->buflen / min_bs;
> -
> -       return z;
> -}
> -
>  /*
>   * Find another zone which has @min_bytes of readable data. Search in zones
>   * @zb + 1 .. @zl. For random workload, also search in zones @zb - 1 .. @zf.
> @@ -1904,10 +1872,8 @@ enum io_u_action zbd_adjust_block(struct thread_data
> *td, struct io_u *io_u)
>  
>         switch (io_u->ddir) {
>         case DDIR_READ:
> -               if (td->runstate == TD_VERIFYING && td_write(td)) {
> -                       zb = zbd_replay_write_order(td, io_u, zb);
> +               if (td->runstate == TD_VERIFYING && td_write(td))
>                         goto accept;
> -               }
>  
>                 /*
>                  * Check that there is enough written data in the zone to do an
> diff --git a/zbd.h b/zbd.h
> index 0a73b41d..d425707e 100644
> --- a/zbd.h
> +++ b/zbd.h
> @@ -25,7 +25,6 @@ enum io_u_action {
>   * @start: zone start location (bytes)
>   * @wp: zone write pointer location (bytes)
>   * @capacity: maximum size usable from the start of a zone (bytes)
> - * @verify_block: number of blocks that have been verified for this zone
>   * @mutex: protects the modifiable members in this structure
>   * @type: zone type (BLK_ZONE_TYPE_*)
>   * @cond: zone state (BLK_ZONE_COND_*)
> @@ -39,7 +38,6 @@ struct fio_zone_info {
>         uint64_t                start;
>         uint64_t                wp;
>         uint64_t                capacity;
> -       uint32_t                verify_block;
>         enum zbd_zone_type      type:2;
>         enum zbd_zone_cond      cond:4;
>         unsigned int            has_wp:1;





[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