X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=t%2Fzbd%2Ftest-zbd-support;h=bd41fffb3298b32be0a5fa0752060cdd4e96f157;hb=6463db6c1d3a2a961008e87a86d464b596886f1a;hp=d316d880c08d9c43601e213bbc5aa2a5dac2e969;hpb=cb6ee92a7fbf7e373074409d9570dc9b27dece17;p=fio.git diff --git a/t/zbd/test-zbd-support b/t/zbd/test-zbd-support index d316d880..bd41fffb 100755 --- a/t/zbd/test-zbd-support +++ b/t/zbd/test-zbd-support @@ -85,7 +85,8 @@ run_fio() { fio=$(dirname "$0")/../../fio - opts=("--aux-path=/tmp" "--allow_file_create=0" "$@") + opts=("--aux-path=/tmp" "--allow_file_create=0" \ + "--significant_figures=10" "$@") { echo; echo "fio ${opts[*]}"; echo; } >>"${logfile}.${test_number}" "${dynamic_analyzer[@]}" "$fio" "${opts[@]}" @@ -141,9 +142,8 @@ test2() { if [ -z "$is_zbd" ]; then opts+=("--zonesize=${zone_size}") fi - run_fio "${opts[@]}" 2>&1 | - tee -a "${logfile}.${test_number}" | - grep -q 'No I/O performed' + run_fio "${opts[@]}" >> "${logfile}.${test_number}" 2>&1 || return $? + ! grep -q 'WRITE:' "${logfile}.${test_number}" } # Run fio against an empty zone. This causes fio to report "No I/O performed". @@ -160,12 +160,12 @@ test3() { opts+=("--zonesize=${zone_size}") fi run_fio "${opts[@]}" >> "${logfile}.${test_number}" 2>&1 || return $? - grep -q "No I/O performed" "${logfile}.${test_number}" + grep -q 'READ:' "${logfile}.${test_number}" rc=$? if [ -n "$is_zbd" ]; then - [ $rc = 0 ] - else [ $rc != 0 ] + else + [ $rc = 0 ] fi } @@ -707,8 +707,9 @@ test42() { grep -q 'Specifying the zone size is mandatory for regular block devices with --zonemode=zbd' } -# Check whether fio handles --zonesize=1 correctly. +# Check whether fio handles --zonesize=1 correctly for regular block devices. test43() { + [ -n "$is_zbd" ] && return 0 read_one_block --zonemode=zbd --zonesize=1 | grep -q 'zone size must be at least 512 bytes for --zonemode=zbd' } @@ -731,6 +732,59 @@ test45() { grep -q "fio: first I/O failed. If .* is a zoned block device, consider --zonemode=zbd" } +# Random write to sequential zones, libaio, 8 jobs, queue depth 64 per job +test46() { + local size + + size=$((4 * zone_size)) + run_fio_on_seq --ioengine=libaio --iodepth=64 --rw=randwrite --bs=4K \ + --group_reporting=1 --numjobs=8 \ + >> "${logfile}.${test_number}" 2>&1 || return $? + check_written $((size * 8)) || return $? +} + +# Check whether fio handles --zonemode=zbd --zoneskip=1 correctly. +test47() { + local bs + + [ -z "$is_zbd" ] && return 0 + bs=$((logical_block_size)) + run_one_fio_job --ioengine=psync --rw=write --bs=$bs \ + --zonemode=zbd --zoneskip=1 \ + >> "${logfile}.${test_number}" 2>&1 && return 1 + grep -q 'zoneskip 1 is not a multiple of the device zone size' "${logfile}.${test_number}" +} + +# Multiple overlapping random write jobs for the same drive and with a +# limited number of open zones. This is similar to test29, but uses libaio +# to stress test zone locking. +test48() { + local i jobs=16 off opts=() + + off=$((first_sequential_zone_sector * 512 + 64 * zone_size)) + size=$((16*zone_size)) + [ -n "$is_zbd" ] && reset_zone "$dev" $((off / 512)) + opts=("--aux-path=/tmp" "--allow_file_create=0" "--significant_figures=10") + opts+=("--debug=zbd") + opts+=("--ioengine=libaio" "--rw=randwrite" "--direct=1") + opts+=("--time_based" "--runtime=30") + opts+=("--zonemode=zbd" "--zonesize=${zone_size}") + opts+=("--max_open_zones=4") + for ((i=0;i>"${logfile}.${test_number}" + + timeout -v -s KILL 45s \ + "${dynamic_analyzer[@]}" "$fio" "${opts[@]}" \ + >> "${logfile}.${test_number}" 2>&1 || return $? +} + tests=() dynamic_analyzer=() reset_all_zones= @@ -761,8 +815,8 @@ source "$(dirname "$0")/functions" || exit $? dev=$1 realdev=$(readlink -f "$dev") basename=$(basename "$realdev") -major=$((0x$(stat -L -c '%t' "$realdev"))) -minor=$((0x$(stat -L -c '%T' "$realdev"))) +major=$((0x$(stat -L -c '%t' "$realdev"))) || exit $? +minor=$((0x$(stat -L -c '%T' "$realdev"))) || exit $? disk_size=$(($(<"/sys/dev/block/$major:$minor/size")*512)) # When the target is a partition device, get basename of its holder device to # access sysfs path of the holder device @@ -802,9 +856,8 @@ case "$(<"/sys/class/block/$basename/queue/zoned")" in esac if [ "${#tests[@]}" = 0 ]; then - for ((i=1;i<=45;i++)); do - tests+=("$i") - done + readarray -t tests < <(declare -F | grep "test[0-9]*" | \ + tr -c -d "[:digit:]\n" | sort -n) fi logfile=$0.log