Commit 19f0c9a0 authored by Michal Berger's avatar Michal Berger Committed by Tomasz Zawadzki
Browse files

autotest: Replace fio.py with a bash wrapper in tests



fio.py simply wraps itself around fio and doesn't do anything that
would require python to be in use. Having it in a simple bash form
makes it easier to integrate it with autotest's common sh tooling
and to debug any potential issues with the underlying tests.

This also fixes #1919 by making sure only proper nvme devices are
selected for the nvmf targets.

Fixes: #1919.

Signed-off-by: default avatarMichal Berger <michalx.berger@intel.com>
Change-Id: I111d00df3c7b2517f431cae865e258a665c2ecb3
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7684


Community-CI: Broadcom CI
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent 55189bee
Loading
Loading
Loading
Loading

scripts/fio-wrapper

0 → 100755
+139 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash
rootdir=$(readlink -f "$(dirname "$0")/../")

shopt -s nullglob extglob

fio_config() {
	local devs=("$@") dev

	cat <<- FIO
		[global]
		thread=1
		invalidate=1
		rw=$testtype
		time_based=1
		runtime=$runtime
		ioengine=libaio
		direct=1
		bs=$blocksize
		iodepth=$iodepth
		norandommap=$((verify == 1 ? 0 : 1))
		numjobs=$numjobs
		verify_dump=1
	FIO

	if ((verify == 1)); then
		cat <<- FIO
			do_verify=$verify
			verify=crc32c-intel
		FIO
	fi

	for dev in "${!devs[@]}"; do
		cat <<- FIO
			[job$dev]
			filename=/dev/${devs[dev]}
		FIO
	done
}

run_fio() {
	fio_config "$@" | fio -
}

get_iscsi() {
	while read -r; do
		[[ $REPLY =~ "Attached scsi disk "(sd[a-z]+) ]] && echo "${BASH_REMATCH[1]}"
	done < <(iscsiadm -m session -P 3)
}

get_nvme() {
	local blocks nvme nvme_sub
	for nvme in /sys/class/nvme/nvme+([0-9]); do
		# Make sure we touch only the block devices which belong to bdev subsystem and
		# use supported protocols.
		[[ $(< "$nvme/transport") == tcp || $(< "$nvme/transport") == rdma ]] || continue
		for nvme_sub in /sys/class/nvme-subsystem/nvme-subsys+([0-9]); do
			[[ -e $nvme_sub/${nvme##*/} ]] || continue
			[[ $(< "$nvme_sub/model") == "SPDK bdev Controller"* ]] || continue
			blocks+=("$nvme_sub/${nvme##*/}"n*)
		done
	done
	printf '%s\n' "${blocks[@]##*/}"
}

get_devices() {
	local devs=("$@")

	if ((${#devs[@]} == 0)); then
		case "$protocol" in
			iscsi) devs=($(get_iscsi)) ;;
			nvmf) devs=($(get_nvme)) ;;
			*) ;;
		esac
	fi
	printf '%s\n' "${devs[@]}"
}

configure_devices() {
	local devs=("$@") dev qd

	for dev in "${devs[@]}"; do
		qd=128
		# Disable all merge tries"
		echo 2 > "/sys/block/$dev/queue/nomerges"
		# FIXME: nr_requests already has its default value at 128. Also, when no
		# scheduler is associated with the device this value cannot be changed
		# and is automatically adjusted as well.
		# echo 128 > "/sys/block/$dev/queue/nr_requests"
		if [[ -e /sys/block/$dev/device/queue_depth ]]; then
			# FIXME: Is this really needed though? Can't we use the default? This is not
			# very deterministic as depending on the device we may end up with different
			# qd in the range of 1-128.
			while ((qd > 0)) && ! echo "$qd" > "/sys/block/$dev/device/queue_depth"; do
				((--qd))
			done 2> /dev/null
			if ((qd == 0)); then
				printf 'Failed to set queue_depth (%s)\n' "$dev"
				return 1
			fi
			printf 'queue_depth set to %u (%s)\n' "$qd" "$dev"
		else
			printf 'Could not set queue depth (%s)\n' "$dev" >&2
		fi
		echo none > "/sys/block/$dev/queue/scheduler"
	done
}

# Defaults
blocksize=4096
iodepth=1
numjobs=1
protocol="nvmf"
runtime=1
testtype="read"
verify=0

# Keep short args compatible with fio.py
while getopts :i:d:n:p:r:t:v arg; do
	case "$arg" in
		i) blocksize=$OPTARG ;;
		d) iodepth=$OPTARG ;;
		n) numjobs=$OPTARG ;;
		p) protocol=$OPTARG ;;
		r) runtime=$OPTARG ;;
		t) testtype=$OPTARG ;;
		v) verify=1 ;;
		*) ;;
	esac
done
shift $((OPTIND - 1))

devices=($(get_devices "$@"))
if ((${#devices[@]} == 0)); then
	printf '* No devices were found for the test, aborting\n' >&2
	exit 1
fi

fio_config "${devices[@]}"
configure_devices "${devices[@]}" && run_fio "${devices[@]}"
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ MALLOC_BDEV_SIZE=64
MALLOC_BLOCK_SIZE=512

rpc_py="$rootdir/scripts/rpc.py"
fio_py="$rootdir/scripts/fio.py"
fio_py="$rootdir/scripts/fio-wrapper"

timing_enter start_iscsi_tgt

+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ MALLOC_BDEV_SIZE=64
MALLOC_BLOCK_SIZE=4096

rpc_py="$rootdir/scripts/rpc.py"
fio_py="$rootdir/scripts/fio.py"
fio_py="$rootdir/scripts/fio-wrapper"

timing_enter start_iscsi_tgt

+1 −1
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@ source $rootdir/test/iscsi_tgt/common.sh
iscsitestinit

rpc_py="$rootdir/scripts/rpc.py"
fio_py="$rootdir/scripts/fio.py"
fio_py="$rootdir/scripts/fio-wrapper"

source "$rootdir/test/common/applications.sh"
NETMASK=127.0.0.0/24
+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ NULL_BDEV_SIZE=64
NULL_BLOCK_SIZE=512

rpc_py=$rootdir/scripts/rpc.py
fio_py=$rootdir/scripts/fio.py
fio_py=$rootdir/scripts/fio-wrapper

rpc_addr1="/var/tmp/spdk0.sock"
rpc_addr2="/var/tmp/spdk1.sock"
Loading