1#!/usr/bin/env bash 2 3testdir=$(readlink -f $(dirname $0)) 4rootdir=$(readlink -f $testdir/../../..) 5source $rootdir/test/common/autotest_common.sh 6source $rootdir/test/nvmf/common.sh 7 8PLUGIN_DIR=$rootdir/examples/nvme/fio_plugin 9 10MALLOC_BDEV_SIZE=64 11MALLOC_BLOCK_SIZE=512 12 13function disconnect_init() { 14 nvmfappstart -m 0xF0 15 16 $rpc_py bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE -b Malloc0 17 18 $rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS 19 $rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 20 21 $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc0 22 $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $1 -s $NVMF_PORT 23 $rpc_py nvmf_subsystem_add_listener discovery -t $TEST_TRANSPORT -a $1 -s $NVMF_PORT 24} 25 26# Test to make sure we don't segfault or access null pointers when we try to connect to 27# a discovery controller that doesn't exist yet. 28function nvmf_target_disconnect_tc1() { 29 set +e 30 $SPDK_EXAMPLE_DIR/reconnect -q 32 -o 4096 -w randrw -M 50 -t 10 -c 0xF \ 31 -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" 32 # If the program crashes, the high bit of $? will be set so we will get a value in the hundreds. 33 # But if the reconnect code detects errors and exits normally it will return 1. 34 if [ $? != 1 ]; then 35 set -e 36 exit 1 37 fi 38 set -e 39} 40 41function nvmf_target_disconnect_tc2() { 42 disconnect_init $NVMF_FIRST_TARGET_IP 43 44 # If perf doesn't shut down, this test will time out. 45 $SPDK_EXAMPLE_DIR/reconnect -q 32 -o 4096 -w randrw -M 50 -t 10 -c 0xF \ 46 -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" & 47 reconnectpid=$! 48 49 sleep 2 50 kill -9 $nvmfpid 51 52 sleep 2 53 disconnect_init $NVMF_FIRST_TARGET_IP 54 55 wait $reconnectpid 56 sync 57} 58 59function nvmf_target_disconnect_tc3() { 60 $SPDK_EXAMPLE_DIR/reconnect -q 32 -o 4096 -w randrw -M 50 -t 10 -c 0xF \ 61 -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT alt_traddr:$NVMF_SECOND_TARGET_IP" & 62 reconnectpid=$! 63 64 sleep 2 65 kill -9 $nvmfpid 66 67 sleep 2 68 disconnect_init $NVMF_SECOND_TARGET_IP 69 70 wait $reconnectpid 71 sync 72} 73 74nvmftestinit 75run_test "nvmf_target_disconnect_tc1" nvmf_target_disconnect_tc1 76run_test "nvmf_target_disconnect_tc2" nvmf_target_disconnect_tc2 77if [ -n "$NVMF_SECOND_TARGET_IP" ]; then 78 run_test "nvmf_target_disconnect_tc3" nvmf_target_disconnect_tc3 79fi 80 81trap - SIGINT SIGTERM EXIT 82nvmftestfini 83