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