xref: /spdk/test/nvmf/target/shutdown.sh (revision 78d09f1ff992042de4a101e4cc33c994c355ea85)
1bba25f4aSJim Harris#!/usr/bin/env bash
2eb53c232Spaul luse#  SPDX-License-Identifier: BSD-3-Clause
3eb53c232Spaul luse#  Copyright (C) 2017 Intel Corporation
44e45c563SAlexey Marchuk#  Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES.
5eb53c232Spaul luse#  All rights reserved.
6eb53c232Spaul luse#
7bba25f4aSJim Harristestdir=$(readlink -f $(dirname $0))
8bba25f4aSJim Harrisrootdir=$(readlink -f $testdir/../../..)
9bba25f4aSJim Harrissource $rootdir/test/common/autotest_common.sh
10bba25f4aSJim Harrissource $rootdir/test/nvmf/common.sh
11bba25f4aSJim Harris
1203c30943SJim HarrisMALLOC_BDEV_SIZE=64
13bba25f4aSJim HarrisMALLOC_BLOCK_SIZE=512
14bba25f4aSJim Harris
155dfd4f26SBen Walkerfunction starttarget() {
16cbda5664SMichal Berger	nvmftestinit
17cbda5664SMichal Berger
185dfd4f26SBen Walker	# Start the target
198cc72fe4SMichal Berger	nvmfappstart -m 0x1E
20bba25f4aSJim Harris
21015ef22aSSeth Howell	$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192
22bba25f4aSJim Harris
231f7d7a78SMichal Berger	num_subsystems=({1..10})
24bba25f4aSJim Harris
25bba25f4aSJim Harris	timing_enter create_subsystems
26bba25f4aSJim Harris	# Create subsystems
27bba25f4aSJim Harris	rm -rf $testdir/rpcs.txt
281f7d7a78SMichal Berger	for i in "${num_subsystems[@]}"; do
2902925187SMaciej Wawryk		cat <<- EOL >> $testdir/rpcs.txt
3002925187SMaciej Wawryk			bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE -b Malloc$i
3102925187SMaciej Wawryk			nvmf_create_subsystem nqn.2016-06.io.spdk:cnode$i -a -s SPDK$i
3202925187SMaciej Wawryk			nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode$i Malloc$i
3302925187SMaciej Wawryk			nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode$i -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT
3402925187SMaciej Wawryk		EOL
35bba25f4aSJim Harris	done
36bba25f4aSJim Harris	$rpc_py < $testdir/rpcs.txt
37bba25f4aSJim Harris	timing_exit create_subsystems
38bba25f4aSJim Harris
395dfd4f26SBen Walker}
405dfd4f26SBen Walker
415dfd4f26SBen Walkerfunction stoptarget() {
425dfd4f26SBen Walker	rm -f ./local-job0-0-verify.state
435dfd4f26SBen Walker	rm -rf $testdir/bdevperf.conf
445dfd4f26SBen Walker	rm -rf $testdir/rpcs.txt
455dfd4f26SBen Walker
465dfd4f26SBen Walker	nvmftestfini
475dfd4f26SBen Walker}
485dfd4f26SBen Walker
495dfd4f26SBen Walkerfunction waitforio() {
505dfd4f26SBen Walker	# $1 = RPC socket
515dfd4f26SBen Walker	if [ -z "$1" ]; then
525dfd4f26SBen Walker		exit 1
535dfd4f26SBen Walker	fi
545dfd4f26SBen Walker	# $2 = bdev name
555dfd4f26SBen Walker	if [ -z "$2" ]; then
565dfd4f26SBen Walker		exit 1
575dfd4f26SBen Walker	fi
585dfd4f26SBen Walker	local ret=1
595dfd4f26SBen Walker	local i
605dfd4f26SBen Walker	for ((i = 10; i != 0; i--)); do
615dfd4f26SBen Walker		read_io_count=$($rpc_py -s $1 bdev_get_iostat -b $2 | jq -r '.bdevs[0].num_read_ops')
625dfd4f26SBen Walker		# A few I/O will happen during initial examine.  So wait until at least 100 I/O
635dfd4f26SBen Walker		#  have completed to know that bdevperf is really generating the I/O.
645dfd4f26SBen Walker		if [ $read_io_count -ge 100 ]; then
655dfd4f26SBen Walker			ret=0
665dfd4f26SBen Walker			break
675dfd4f26SBen Walker		fi
685dfd4f26SBen Walker		sleep 0.25
695dfd4f26SBen Walker	done
705dfd4f26SBen Walker	return $ret
715dfd4f26SBen Walker}
725dfd4f26SBen Walker
735dfd4f26SBen Walker# Test 1: Kill the initiator unexpectedly with no I/O outstanding
74844c8ec3SMichal Bergerfunction nvmf_shutdown_tc1() {
755dfd4f26SBen Walker	starttarget
765dfd4f26SBen Walker
775dfd4f26SBen Walker	# Run bdev_svc, which connects but does not issue I/O
781f7d7a78SMichal Berger	$rootdir/test/app/bdev_svc/bdev_svc -m 0x1 -i 1 -r /var/tmp/bdevperf.sock --json <(gen_nvmf_target_json "${num_subsystems[@]}") &
795dfd4f26SBen Walker	perfpid=$!
805dfd4f26SBen Walker	waitforlisten $perfpid /var/tmp/bdevperf.sock
815dfd4f26SBen Walker	$rpc_py -s /var/tmp/bdevperf.sock framework_wait_init
825dfd4f26SBen Walker
835dfd4f26SBen Walker	# Kill bdev_svc
845dfd4f26SBen Walker	kill -9 $perfpid || true
855dfd4f26SBen Walker	rm -f /var/run/spdk_bdev1
865dfd4f26SBen Walker
875dfd4f26SBen Walker	# Verify the target stays up
885dfd4f26SBen Walker	sleep 1
895dfd4f26SBen Walker	kill -0 $nvmfpid
905dfd4f26SBen Walker
915dfd4f26SBen Walker	# Connect with bdevperf and confirm it works
927640e3fcSKrzysztof Karas	$rootdir/build/examples/bdevperf --json <(gen_nvmf_target_json "${num_subsystems[@]}") \
937640e3fcSKrzysztof Karas		-q 64 -o 65536 -w verify -t 1
945dfd4f26SBen Walker
955dfd4f26SBen Walker	stoptarget
965dfd4f26SBen Walker}
975dfd4f26SBen Walker
985dfd4f26SBen Walker# Test 2: Kill initiator unexpectedly with I/O outstanding
99844c8ec3SMichal Bergerfunction nvmf_shutdown_tc2() {
1005dfd4f26SBen Walker	starttarget
1015dfd4f26SBen Walker
1025dfd4f26SBen Walker	# Run bdevperf
10329784f35SKrzysztof Karas	$rootdir/build/examples/bdevperf -r /var/tmp/bdevperf.sock --json <(gen_nvmf_target_json "${num_subsystems[@]}") -q 64 -o 65536 -w verify -t 10 &
1045dfd4f26SBen Walker	perfpid=$!
1055dfd4f26SBen Walker	waitforlisten $perfpid /var/tmp/bdevperf.sock
1065dfd4f26SBen Walker	$rpc_py -s /var/tmp/bdevperf.sock framework_wait_init
1075dfd4f26SBen Walker
1085dfd4f26SBen Walker	waitforio /var/tmp/bdevperf.sock Nvme1n1
1095dfd4f26SBen Walker
1105dfd4f26SBen Walker	# Kill bdevperf half way through
1115dfd4f26SBen Walker	killprocess $perfpid
1125dfd4f26SBen Walker
1135dfd4f26SBen Walker	# Verify the target stays up
1145dfd4f26SBen Walker	sleep 1
1155dfd4f26SBen Walker	kill -0 $nvmfpid
1165dfd4f26SBen Walker
1175dfd4f26SBen Walker	stoptarget
1185dfd4f26SBen Walker}
1195dfd4f26SBen Walker
1205dfd4f26SBen Walker# Test 3: Kill the target unexpectedly with I/O outstanding
121844c8ec3SMichal Bergerfunction nvmf_shutdown_tc3() {
1225dfd4f26SBen Walker	starttarget
1235dfd4f26SBen Walker
1245dfd4f26SBen Walker	# Run bdevperf
12529784f35SKrzysztof Karas	$rootdir/build/examples/bdevperf -r /var/tmp/bdevperf.sock --json <(gen_nvmf_target_json "${num_subsystems[@]}") -q 64 -o 65536 -w verify -t 10 &
1265dfd4f26SBen Walker	perfpid=$!
1275dfd4f26SBen Walker	waitforlisten $perfpid /var/tmp/bdevperf.sock
1285dfd4f26SBen Walker	$rpc_py -s /var/tmp/bdevperf.sock framework_wait_init
1295dfd4f26SBen Walker
1305dfd4f26SBen Walker	# Expand the trap to clean up bdevperf if something goes wrong
1315dfd4f26SBen Walker	trap 'process_shm --id $NVMF_APP_SHM_ID; kill -9 $perfpid || true; nvmftestfini; exit 1' SIGINT SIGTERM EXIT
1325dfd4f26SBen Walker
1335dfd4f26SBen Walker	waitforio /var/tmp/bdevperf.sock Nvme1n1
1345dfd4f26SBen Walker
1355dfd4f26SBen Walker	# Kill the target half way through
1365dfd4f26SBen Walker	killprocess $nvmfpid
1375dfd4f26SBen Walker	sleep 1
138a59ab6dfSMichal Berger	NOT wait $perfpid
1395dfd4f26SBen Walker
1405dfd4f26SBen Walker	stoptarget
1415dfd4f26SBen Walker}
1425dfd4f26SBen Walker
1434e45c563SAlexey Marchuk# Test 4: Kill the target unexpectedly with I/O outstanding, highly fragmented payload
1444e45c563SAlexey Marchukfunction nvmf_shutdown_tc4() {
1454e45c563SAlexey Marchuk	starttarget
1464e45c563SAlexey Marchuk
1474e45c563SAlexey Marchuk	# Run nvme_perf with highly fragmented payload
1484e45c563SAlexey Marchuk	$rootdir/build/bin/spdk_nvme_perf -q 128 -o 45056 -O 4096 -w randwrite -t 20 -r "trtype:$TEST_TRANSPORT adrfam:IPV4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" -P 4 &
1494e45c563SAlexey Marchuk	perfpid=$!
1504e45c563SAlexey Marchuk	sleep 5
1514e45c563SAlexey Marchuk	# Expand the trap to clean up bdevperf if something goes wrong
1524e45c563SAlexey Marchuk	trap 'process_shm --id $NVMF_APP_SHM_ID; kill -9 $perfpid || true; nvmftestfini; exit 1' SIGINT SIGTERM EXIT
1534e45c563SAlexey Marchuk
1544e45c563SAlexey Marchuk	# Kill the target half way through
1554e45c563SAlexey Marchuk	killprocess $nvmfpid
1564e45c563SAlexey Marchuk	sleep 1
157a59ab6dfSMichal Berger	# Due to IOs are completed with errors, perf exits with bad status
158a59ab6dfSMichal Berger	NOT wait $perfpid
1594e45c563SAlexey Marchuk	stoptarget
1604e45c563SAlexey Marchuk}
1614e45c563SAlexey Marchuk
162cb90136cSSeth Howellrun_test "nvmf_shutdown_tc1" nvmf_shutdown_tc1
163cb90136cSSeth Howellrun_test "nvmf_shutdown_tc2" nvmf_shutdown_tc2
164cb90136cSSeth Howellrun_test "nvmf_shutdown_tc3" nvmf_shutdown_tc3
165*78d09f1fSKonrad Sztyber# Temporarily disable on e810 due to issue #3523
166*78d09f1fSKonrad Sztyberif ! [[ "$SPDK_TEST_NVMF_NICS" == "e810" && "$TEST_TRANSPORT" == "rdma" ]]; then
1674e45c563SAlexey Marchuk	run_test "nvmf_shutdown_tc4" nvmf_shutdown_tc4
168*78d09f1fSKonrad Sztyberfi
169bba25f4aSJim Harris
170bba25f4aSJim Harristrap - SIGINT SIGTERM EXIT
171