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;