Re: [PATCH v2 32/36] t/zbd: add checks for offline zone condition

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

 



Hi Dmitry, thank you for posting the series.

On Dec 24, 2020 / 11:12, Dmitry Fomichev wrote:
> Some tests, e.g. #39 an #40, try to read the first zone of the drive.
> It is assumed that the first zone is readable. However, if the first
> zone is offline, the read fails along with the entire test.
> 
> This commit adds two functions to perform zone report and find the
> first and the last zones that are not offline. Several test cases
> now call these functions to avoid test failures described above.
> 
> Fixes for two more test failures are included in this commit -
> 
> Test #14 tries to write to conventional zones if they are found at
> the beginning of the LBA range of the drive, but it assumes that
> these zones are online. This may not always be the case. Add "offset"
> to avoid the i/o to be attempted to run against any preceding offline
> zones.
> 
> Similarly, in test #17, the script tries to find the last zone.
> Check for the case when the last zone is offline. The test doesn't
> set the i/o file size, but it works OK in most of the cases because
> typically this test operates on the last physical zone. With the
> online lookup in place, this may not always be the case and if there
> are any offline zones that trail the last non-offline zone,
> then the i/o will try to access that zone and fail. Add the "size"
> to avoid the i/o to be attempted to run against any trailing offline
> zones.
> 
> Signed-off-by: Dmitry Fomichev <dmitry.fomichev@xxxxxxx>
> ---
>  t/zbd/functions        | 56 ++++++++++++++++++++++++++++++++++++++++--
>  t/zbd/test-zbd-support | 31 +++++++++++++++++++----
>  2 files changed, 80 insertions(+), 7 deletions(-)
> 
> diff --git a/t/zbd/functions b/t/zbd/functions
> index 1a64a215..cc26c2ab 100644
> --- a/t/zbd/functions
> +++ b/t/zbd/functions
> @@ -71,7 +71,7 @@ first_sequential_zone() {
>  
>      if [ -n "${blkzone}" ] && [ ! -n "${use_libzbc}" ]; then
>  	${blkzone} report "$dev" |
> -	    sed -n 's/^[[:blank:]]*start:[[:blank:]]\([0-9a-zA-Z]*\),[[:blank:]]len[[:blank:]]\([0-9a-zA-Z]*\),.*type:[[:blank:]]2(.*/\1 \2/p' |
> +	    sed -n 's/^[[:blank:]]*start:[[:blank:]]\([0-9a-zA-Z]*\),[[:blank:]]len[[:blank:]]\([0-9a-zA-Z]*\),.*zcond:\(14\|[[:blank:]][0-4]\)(.*type:[[:blank:]]\([2]\)(.*/\1 \2/p' |
>  	    {
>  		read -r starting_sector length &&
>  		    # Convert from hex to decimal
> @@ -79,7 +79,7 @@ first_sequential_zone() {
>  	    }
>      else
>  	${zbc_report_zones} "$dev" |
> -	    sed -n 's/^Zone [0-9]*: type 0x2 .*, sector \([0-9]*\), \([0-9]*\) sectors,.*$/\1 \2/p' |
> +	    sed -n 's/^Zone [0-9]*: type 0x2 .*,.*,[[:blank:]]cond[[:blank:]]0x[0-4e][[:blank:]], sector \([0-9]*\), \([0-9]*\) sectors.*$/\1 \2/p' |

In my environment, the hunk above resulted in no output from the sed command.
The zbc_report_zones command output is as follows:

    Zone 00746: type 0x2 (Sequential-write-required), cond 0x2 (Implicit-open), reset recommended 0, non_seq 0, sector 391118848, 524288 sectors, wp 391120048

Then I think the sed command should be like this:

    sed -n 's/^Zone [0-9]*: type 0x2 .*,[[:blank:]]cond[[:blank:]]0x[0-4e][[:blank:]].*, sector \([0-9]*\), \([0-9]*\) sectors.*$/\1 \2/p' |

-- 
Best Regards,
Shin'ichiro Kawasaki


>  	    head -n1
>      fi
>  }
> @@ -121,6 +121,58 @@ total_zone_capacity() {
>  	echo $((capacity * 512))
>  }
>  
> +# Reports the starting sector and length of the first zone of device $1
> +# that is not in offline (or similar) condition.
> +first_online_zone() {
> +    local dev=$1
> +
> +    if [ -z "$is_zbd" ]; then
> +	echo 0
> +	return
> +    fi
> +
> +    if [ -n "${blkzone}" ] && [ ! -n "${use_libzbc}" ]; then
> +	${blkzone} report "$dev" |
> +	    sed -n 's/^[[:blank:]]*start:[[:blank:]]\([0-9a-zA-Z]*\),[[:blank:]]len[[:blank:]]\([0-9a-zA-Z]*\),.*zcond:\(14\|[[:blank:]][0-4]\)(.*type:[[:blank:]][12](.*/\1/p' |
> +	    head -n1 |
> +	    {
> +		read -r starting_sector &&
> +		    # Convert from hex to decimal
> +		    echo $((starting_sector))
> +	    }
> +    else
> +	${zbc_report_zones} "$dev" |
> +	    sed -n 's/^Zone[[:blank:]][0-9]*:[[:blank:]]type[[:blank:]]0x[12][[:blank:]].*,[[:blank:]]cond[[:blank:]]0x[0-4e][[:blank:]].*,[[:blank:]]sector[[:blank:]]\([0-9]*\),.*$/\1/p' |
> +	    head -n1
> +    fi
> +}
> +
> +# Reports the starting sector and length of the last zone of device $1
> +# that is not in offline (or similar) condition.
> +last_online_zone() {
> +    local dev=$1
> +
> +    if [ -z "$is_zbd" ]; then
> +	echo 0
> +	return
> +    fi
> +
> +    if [ -n "${blkzone}" ] && [ ! -n "${use_libzbc}" ]; then
> +	${blkzone} report "$dev" |
> +	    sed -n 's/^[[:blank:]]*start:[[:blank:]]\([0-9a-zA-Z]*\),[[:blank:]]len[[:blank:]]\([0-9a-zA-Z]*\),.*zcond:\(14\|[[:blank:]][0-4]\)(.*type:[[:blank:]][12](.*/\1/p' |
> +	    tail -1 |
> +	    {
> +		read -r starting_sector &&
> +		    # Convert from hex to decimal
> +		    echo $((starting_sector))
> +	    }
> +    else
> +	${zbc_report_zones} "$dev" |
> +	    sed -n 's/^Zone[[:blank:]][0-9]*:[[:blank:]]type[[:blank:]]0x[12][[:blank:]].*,[[:blank:]]cond[[:blank:]]0x[0-4e][[:blank:]].*,[[:blank:]]sector[[:blank:]]\([0-9]*\),.*$/\1/p' |
> +	    tail -1
> +    fi
> +}
> +
>  max_open_zones() {
>      local dev=$1
>  
> diff --git a/t/zbd/test-zbd-support b/t/zbd/test-zbd-support
> index 033c2ebc..0b8015df 100755
> --- a/t/zbd/test-zbd-support
> +++ b/t/zbd/test-zbd-support
> @@ -464,15 +464,20 @@ test13() {
>  
>  # Random write to conventional zones.
>  test14() {
> -    local size
> +    local off size
>  
> +    if ! result=($(first_online_zone "$dev")); then
> +	echo "Failed to determine first online zone"
> +	exit 1
> +    fi
> +    off=${result[0]}
>      prep_write
>      size=$((16 * 2**20)) # 20 MB
>      require_conv_zone_bytes "${size}" || return $SKIP_TESTCASE
>  
>      run_one_fio_job "$(ioengine "libaio")" --iodepth=64 --rw=randwrite --bs=16K \
>  		    --zonemode=zbd --zonesize="${zone_size}" --do_verify=1 \
> -		    --verify=md5 --size=$size				   \
> +		    --verify=md5 --offset=$off --size=$size\
>  		    >>"${logfile}.${test_number}" 2>&1 || return $?
>      check_written $((size)) || return $?
>      check_read $((size)) || return $?
> @@ -529,17 +534,26 @@ test16() {
>  
>  # Random reads and writes in the last zone.
>  test17() {
> -    local io off read size written
> +    local io off last read size written
>  
>      off=$(((disk_size / zone_size - 1) * zone_size))
>      size=$((disk_size - off))
> +    if ! last=($(last_online_zone "$dev")); then
> +	echo "Failed to determine last online zone"
> +	exit 1
> +    fi
> +    if [[ "$((last * 512))" -lt "$off" ]]; then
> +	off=$((last * 512))
> +	size=$zone_size
> +    fi
>      if [ -n "$is_zbd" ]; then
>  	reset_zone "$dev" $((off / 512)) || return $?
>      fi
>      prep_write
>      run_one_fio_job "$(ioengine "libaio")" --iodepth=8 --rw=randrw --bs=4K \
>  		    --zonemode=zbd --zonesize="${zone_size}"		\
> -		    --offset=$off --loops=2 --norandommap=1\
> +		    --offset=$off --loops=2 --norandommap=1 \
> +		    --size="$size"\
>  		    >>"${logfile}.${test_number}" 2>&1 || return $?
>      written=$(fio_written <"${logfile}.${test_number}")
>      read=$(fio_read <"${logfile}.${test_number}")
> @@ -867,10 +881,17 @@ test38() {
>  
>  # Read one block from a block device.
>  read_one_block() {
> +    local off
>      local bs
>  
> +    if ! result=($(first_online_zone "$dev")); then
> +	echo "Failed to determine first online zone"
> +	exit 1
> +    fi
> +    off=${result[0]}
>      bs=$((logical_block_size))
> -    run_one_fio_job --rw=read "$(ioengine "psync")" --bs=$bs --size=$bs "$@" 2>&1 |
> +    run_one_fio_job --rw=read "$(ioengine "psync")" --offset=$off --bs=$bs \
> +		    --size=$bs "$@" 2>&1 |
>  	tee -a "${logfile}.${test_number}"
>  }
>  
> -- 
> 2.28.0
> 



[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