Commit 32b1a291 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

test/nvmf: add digest test



The tests verifies that data digest errors are caught and the requests
are retried.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: If97883b5eef67a1a18733429ac725429658c2f21
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20444


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent 9424e9eb
Loading
Loading
Loading
Loading
+81 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (C) 2023 Intel Corporation.  All rights reserved.
#

testdir=$(readlink -f "$(dirname "$0")")
rootdir=$(readlink -f "$testdir/../../../")

set -- "--transport=tcp" "$@"

source "$rootdir/test/common/autotest_common.sh"
source "$rootdir/test/nvmf/common.sh"

nqn=nqn.2016-06.io.spdk:cnode1
bperfsock=/var/tmp/bperf.sock
runtime=2

bperf_rpc() { "$rootdir/scripts/rpc.py" -s "$bperfsock" "$@"; }
bperf_py() { "$rootdir/examples/bdev/bdevperf/bdevperf.py" -s "$bperfsock" "$@"; }

cleanup() {
	[[ -n "$bperfpid" ]] && killprocess $bperfpid || :
	nvmftestfini
}

get_transient_errcount() {
	bperf_rpc bdev_get_iostat -b "$1" \
		| jq -r '.bdevs[0]
			| .driver_specific
			| .nvme_error
			| .status_code
			| .command_transient_transport_error'
}

run_bperf() {
	local rw bs qd

	rw=$1 bs=$2 qd=$3
	"$rootdir/build/examples/bdevperf" -m 2 -r "$bperfsock" -w $rw -o $bs -t $runtime -q $qd -z &
	bperfpid=$!

	waitforlisten "$bperfpid" "$bperfsock"
	bperf_rpc bdev_nvme_set_options --nvme-error-stat --bdev-retry-count -1
	# Make sure error injection is disabled when the controller is being attached
	rpc_cmd accel_error_inject_error -o crc32c -t disable
	bperf_rpc bdev_nvme_attach_controller --ddgst -t tcp -a "$NVMF_FIRST_TARGET_IP" \
		-s "$NVMF_PORT" -f ipv4 -n "$nqn" -b nvme0
	# Inject digest errors
	rpc_cmd accel_error_inject_error -o crc32c -t corrupt -i $((qd * 2))

	bperf_py "perform_tests"
	# Make sure that the digest errors were actually caught
	(($(get_transient_errcount nvme0n1) > 0))

	killprocess $bperfpid
}

# This test only makes sense for the TCP transport
[[ "$TEST_TRANSPORT" != "tcp" ]] && exit 1

nvmftestinit
nvmfappstart --wait-for-rpc

rpc_cmd << CONFIG
	accel_assign_opc -o crc32c -m error
	framework_start_init
	bdev_null_create null0 100 4096
	nvmf_create_transport $NVMF_TRANSPORT_OPTS
	nvmf_create_subsystem "$nqn" -a
	nvmf_subsystem_add_ns "$nqn" null0
	nvmf_subsystem_add_listener -t tcp -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" "$nqn"
CONFIG

trap cleanup SIGINT SIGTERM EXIT

# Test the reads - the host should detect digest errors and retry the requests until successful.
run_bperf randread 4096 128
run_bperf randread $((128 * 1024)) 16

trap - SIGINT SIGTERM EXIT
nvmftestfini
+1 −0
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ run_test "nvmf_discovery_remove_ifc" $rootdir/test/nvmf/host/discovery_remove_if
if [[ $SPDK_TEST_NVMF_MDNS -eq 1 && "$SPDK_TEST_NVMF_TRANSPORT" == "tcp" ]]; then
	# Skipping tests on RDMA because the rdma stack fails to configure the same IP for host and target.
	run_test "nvmf_mdns_discovery" $rootdir/test/nvmf/host/mdns_discovery.sh "${TEST_ARGS[@]}"
	run_test "nvmf_digest" "$rootdir/test/nvmf/host/digest.sh" "${TEST_ARGS[@]}"
fi

if [[ $SPDK_TEST_USDT -eq 1 ]]; then