xref: /spdk/test/nvmf/host/timeout.sh (revision 4fafd3fe65b701bfbe94e7b858f6ba2a9d77eddb)
1#!/usr/bin/env bash
2#  SPDX-License-Identifier: BSD-3-Clause
3#  Copyright (C) 2022 Intel Corporation
4#  All rights reserved.
5#
6testdir=$(readlink -f $(dirname $0))
7rootdir=$(readlink -f $testdir/../../..)
8source $rootdir/test/common/autotest_common.sh
9source $rootdir/test/nvmf/common.sh
10
11MALLOC_BDEV_SIZE=64
12MALLOC_BLOCK_SIZE=512
13
14rpc_py="$rootdir/scripts/rpc.py"
15bpf_sh="$rootdir/scripts/bpftrace.sh"
16
17bdevperf_rpc_sock=/var/tmp/bdevperf.sock
18
19nvmftestinit
20
21nvmfappstart -m 0x3
22
23trap 'process_shm --id $NVMF_APP_SHM_ID; killprocess $bdevperf_pid || :; nvmftestfini; exit 1' SIGINT SIGTERM EXIT
24
25$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192
26$rpc_py bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE -b Malloc0
27$rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001
28$rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc0
29$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT
30
31$rootdir/build/examples/bdevperf -m 0x4 -z -r $bdevperf_rpc_sock -q 128 -o 4096 -w verify -t 10 -f &
32bdevperf_pid=$!
33
34waitforlisten $bdevperf_pid $bdevperf_rpc_sock
35
36function get_bdev() {
37	$rpc_py -s $bdevperf_rpc_sock bdev_get_bdevs | jq -r '.[].name'
38}
39
40function get_controller() {
41	$rpc_py -s $bdevperf_rpc_sock bdev_nvme_get_controllers | jq -r '.[].name'
42}
43
44# Case 1 test ctrlr_loss_timeout_sec time to try reconnecting to a ctrlr before deleting it
45$rpc_py -s $bdevperf_rpc_sock bdev_nvme_set_options -r -1
46$rpc_py -s $bdevperf_rpc_sock bdev_nvme_attach_controller -b NVMe0 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP \
47	-s $NVMF_PORT -f ipv4 -n nqn.2016-06.io.spdk:cnode1 \
48	--ctrlr-loss-timeout-sec 5 --reconnect-delay-sec 2
49
50$rootdir/examples/bdev/bdevperf/bdevperf.py -s $bdevperf_rpc_sock perform_tests &
51rpc_pid=$!
52
53sleep 1
54
55$rpc_py nvmf_subsystem_remove_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT
56sleep 2
57[[ "$(get_controller)" == "NVMe0" ]]
58[[ "$(get_bdev)" == "NVMe0n1" ]]
59
60# wait for the ctrlr_loss_timeout_sec time 2 sec and check bdevs and controller are deleted
61sleep 5
62[[ "$(get_controller)" == "" ]]
63[[ "$(get_bdev)" == "" ]]
64
65wait $rpc_pid
66
67killprocess $bdevperf_pid
68
69# Case 2 test fast_io_fail_timeout_sec
70# Time to wait until ctrlr is reconnected before failing I/O to ctrlr
71$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT
72
73$rootdir/build/examples/bdevperf -m 0x4 -z -r $bdevperf_rpc_sock -q 128 -o 4096 -w verify -t 10 -f &
74bdevperf_pid=$!
75
76waitforlisten $bdevperf_pid $bdevperf_rpc_sock
77
78$rpc_py -s $bdevperf_rpc_sock bdev_nvme_set_options -r -1
79$rpc_py -s $bdevperf_rpc_sock bdev_nvme_attach_controller -b NVMe0 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP \
80	-s $NVMF_PORT -f ipv4 -n nqn.2016-06.io.spdk:cnode1 \
81	--ctrlr-loss-timeout-sec 5 --fast-io-fail-timeout-sec 2 --reconnect-delay-sec 1
82
83$rootdir/examples/bdev/bdevperf/bdevperf.py -s $bdevperf_rpc_sock perform_tests &
84rpc_pid=$!
85
86sleep 1
87$rpc_py nvmf_subsystem_remove_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT
88
89# ctrlr should try to reconnect and I/O submitted should be queued until the listener is added back before 5 sec fast_io_fail_timeout_sec
90sleep 1
91$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT
92wait $rpc_pid
93
94# TODO: Check the IO fail if we wait for 5 sec, needs information from bdevperf
95
96$rootdir/examples/bdev/bdevperf/bdevperf.py -s $bdevperf_rpc_sock perform_tests &
97rpc_pid=$!
98sleep 1
99$rpc_py nvmf_subsystem_remove_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT
100# bdevperf fails to process the I/O fast_io_fail_timeout_sec expires at 2 sec
101sleep 3
102$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT
103wait $rpc_pid
104
105killprocess $bdevperf_pid
106
107# Case 3 test reconnect_delay_sec
108# Time to delay a reconnect trial
109$rootdir/build/examples/bdevperf -m 0x4 -z -r $bdevperf_rpc_sock -q 128 -o 4096 -w randread -t 10 -f &
110bdevperf_pid=$!
111
112waitforlisten $bdevperf_pid $bdevperf_rpc_sock
113
114#start_trace
115$bpf_sh $bdevperf_pid $rootdir/scripts/bpf/nvmf_timeout.bt &> $testdir/trace.txt &
116dtrace_pid=$!
117
118$rpc_py -s $bdevperf_rpc_sock bdev_nvme_set_options -r -1 -e 9
119
120$rpc_py -s $bdevperf_rpc_sock bdev_nvme_attach_controller -b NVMe0 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP \
121	-s $NVMF_PORT -f ipv4 -n nqn.2016-06.io.spdk:cnode1 \
122	--ctrlr-loss-timeout-sec 5 --reconnect-delay-sec 2
123$rootdir/examples/bdev/bdevperf/bdevperf.py -s $bdevperf_rpc_sock perform_tests &
124rpc_pid=$!
125sleep 1
126$rpc_py nvmf_subsystem_remove_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT
127
128wait $rpc_pid
129cat $testdir/trace.txt
130
131# Check the frequency of delay reconnect
132if (("$(grep -c "reconnect delay bdev controller NVMe0" < $testdir/trace.txt)" <= 2)); then
133	false
134fi
135
136kill $dtrace_pid
137rm -f $testdir/trace.txt
138
139killprocess $bdevperf_pid
140
141$rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1
142
143trap - SIGINT SIGTERM EXIT
144
145nvmftestfini
146