diff options
Diffstat (limited to 'src/spdk/test/nvmf/host')
-rwxr-xr-x | src/spdk/test/nvmf/host/aer.sh | 50 | ||||
-rwxr-xr-x | src/spdk/test/nvmf/host/bdevperf.sh | 50 | ||||
-rwxr-xr-x | src/spdk/test/nvmf/host/fio.sh | 82 | ||||
-rwxr-xr-x | src/spdk/test/nvmf/host/identify.sh | 54 | ||||
-rwxr-xr-x | src/spdk/test/nvmf/host/identify_kernel_nvmf.sh | 71 | ||||
-rwxr-xr-x | src/spdk/test/nvmf/host/perf.sh | 93 | ||||
-rwxr-xr-x | src/spdk/test/nvmf/host/target_disconnect.sh | 89 |
7 files changed, 489 insertions, 0 deletions
diff --git a/src/spdk/test/nvmf/host/aer.sh b/src/spdk/test/nvmf/host/aer.sh new file mode 100755 index 000000000..1c438c686 --- /dev/null +++ b/src/spdk/test/nvmf/host/aer.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../../..) +source $rootdir/test/common/autotest_common.sh +source $rootdir/test/nvmf/common.sh + +rpc_py="$rootdir/scripts/rpc.py" + +nvmftestinit +nvmfappstart -m 0xF + +$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 + +$rpc_py bdev_malloc_create 64 512 --name Malloc0 +$rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 -m 2 +$rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc0 +$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT + +$rpc_py nvmf_get_subsystems + +AER_TOUCH_FILE=/tmp/aer_touch_file +rm -f $AER_TOUCH_FILE + +# Namespace Attribute Notice Tests +$rootdir/test/nvme/aer/aer -r "\ + trtype:$TEST_TRANSPORT \ + adrfam:IPv4 \ + traddr:$NVMF_FIRST_TARGET_IP \ + trsvcid:$NVMF_PORT \ + subnqn:nqn.2016-06.io.spdk:cnode1" -n 2 -t $AER_TOUCH_FILE & +aerpid=$! + +# Waiting for aer start to work +waitforfile $AER_TOUCH_FILE + +# Add a new namespace +$rpc_py bdev_malloc_create 64 4096 --name Malloc1 +$rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc1 -n 2 +$rpc_py nvmf_get_subsystems + +wait $aerpid + +$rpc_py bdev_malloc_delete Malloc0 +$rpc_py bdev_malloc_delete Malloc1 +$rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 + +trap - SIGINT SIGTERM EXIT + +nvmftestfini diff --git a/src/spdk/test/nvmf/host/bdevperf.sh b/src/spdk/test/nvmf/host/bdevperf.sh new file mode 100755 index 000000000..776550c4d --- /dev/null +++ b/src/spdk/test/nvmf/host/bdevperf.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../../..) +source $rootdir/test/common/autotest_common.sh +source $rootdir/test/nvmf/common.sh + +MALLOC_BDEV_SIZE=64 +MALLOC_BLOCK_SIZE=512 + +rpc_py="$rootdir/scripts/rpc.py" + +function tgt_init() { + nvmfappstart -m 0xF + + $rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 + $rpc_py bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE -b Malloc0 + $rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 + $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc0 + $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT +} + +nvmftestinit +# There is an intermittent error relating to this test and Soft-RoCE. for now, just +# skip this test if we are using rxe. TODO: get to the bottom of GitHub issue #1165 +if [ $TEST_TRANSPORT == "rdma" ] && check_ip_is_soft_roce $NVMF_FIRST_TARGET_IP; then + echo "Using software RDMA, skipping the host bdevperf tests." + exit 0 +fi + +tgt_init + +"$rootdir/test/bdev/bdevperf/bdevperf" --json <(gen_nvmf_target_json) -q 128 -o 4096 -w verify -t 1 + +"$rootdir/test/bdev/bdevperf/bdevperf" --json <(gen_nvmf_target_json) -q 128 -o 4096 -w verify -t 15 -f & +bdevperfpid=$! + +sleep 3 +kill -9 $nvmfpid + +sleep 3 +tgt_init + +wait $bdevperfpid +sync +$rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 + +trap - SIGINT SIGTERM EXIT + +nvmftestfini diff --git a/src/spdk/test/nvmf/host/fio.sh b/src/spdk/test/nvmf/host/fio.sh new file mode 100755 index 000000000..85f9a00f1 --- /dev/null +++ b/src/spdk/test/nvmf/host/fio.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../../..) +source $rootdir/test/common/autotest_common.sh +source $rootdir/scripts/common.sh +source $rootdir/test/nvmf/common.sh + +rpc_py="$rootdir/scripts/rpc.py" + +nvmftestinit + +if [[ $CONFIG_FIO_PLUGIN != y ]]; then + echo "FIO not available" + exit 1 +fi + +timing_enter start_nvmf_tgt + +"${NVMF_APP[@]}" -m 0xF & +nvmfpid=$! + +trap 'process_shm --id $NVMF_APP_SHM_ID; nvmftestfini; exit 1' SIGINT SIGTERM EXIT + +waitforlisten $nvmfpid +$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 +timing_exit start_nvmf_tgt + +$rpc_py bdev_malloc_create 64 512 -b Malloc1 +$rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 +$rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc1 +$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT + +PLUGIN_DIR=$rootdir/examples/nvme/fio_plugin + +# Test fio_plugin as host with malloc backend +fio_nvme $PLUGIN_DIR/example_config.fio --filename="trtype=$TEST_TRANSPORT adrfam=IPv4 \ +traddr=$NVMF_FIRST_TARGET_IP trsvcid=$NVMF_PORT ns=1" + +# second test mocking multiple SGL elements +fio_nvme $PLUGIN_DIR/mock_sgl_config.fio --filename="trtype=$TEST_TRANSPORT adrfam=IPv4 \ +traddr=$NVMF_FIRST_TARGET_IP trsvcid=$NVMF_PORT ns=1" +$rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 + +if [ $RUN_NIGHTLY -eq 1 ]; then + # Test fio_plugin as host with nvme lvol backend + bdfs=$(get_nvme_bdfs) + $rpc_py bdev_nvme_attach_controller -b Nvme0 -t PCIe -a $(echo $bdfs | awk '{ print $1 }') -i $NVMF_FIRST_TARGET_IP + ls_guid=$($rpc_py bdev_lvol_create_lvstore -c 1073741824 Nvme0n1 lvs_0) + get_lvs_free_mb $ls_guid + $rpc_py bdev_lvol_create -l lvs_0 lbd_0 $free_mb + $rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode2 -a -s SPDK00000000000001 + $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode2 lvs_0/lbd_0 + $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode2 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT + fio_nvme $PLUGIN_DIR/example_config.fio --filename="trtype=$TEST_TRANSPORT adrfam=IPv4 \ + traddr=$NVMF_FIRST_TARGET_IP trsvcid=$NVMF_PORT ns=1" + $rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode2 + + # Test fio_plugin as host with nvme lvol nested backend + ls_nested_guid=$($rpc_py bdev_lvol_create_lvstore --clear-method none lvs_0/lbd_0 lvs_n_0) + get_lvs_free_mb $ls_nested_guid + $rpc_py bdev_lvol_create -l lvs_n_0 lbd_nest_0 $free_mb + $rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode3 -a -s SPDK00000000000001 + $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode3 lvs_n_0/lbd_nest_0 + $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode3 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT + fio_nvme $PLUGIN_DIR/example_config.fio --filename="trtype=$TEST_TRANSPORT adrfam=IPv4 \ + traddr=$NVMF_FIRST_TARGET_IP trsvcid=$NVMF_PORT ns=1" + $rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode3 + + sync + # Delete lvol_bdev and destroy lvol_store. + $rpc_py bdev_lvol_delete lvs_n_0/lbd_nest_0 + $rpc_py bdev_lvol_delete_lvstore -l lvs_n_0 + $rpc_py bdev_lvol_delete lvs_0/lbd_0 + $rpc_py bdev_lvol_delete_lvstore -l lvs_0 + $rpc_py bdev_nvme_detach_controller Nvme0 +fi + +trap - SIGINT SIGTERM EXIT + +rm -f ./local-test-0-verify.state +nvmftestfini diff --git a/src/spdk/test/nvmf/host/identify.sh b/src/spdk/test/nvmf/host/identify.sh new file mode 100755 index 000000000..412626388 --- /dev/null +++ b/src/spdk/test/nvmf/host/identify.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../../..) +source $rootdir/test/common/autotest_common.sh +source $rootdir/test/nvmf/common.sh + +MALLOC_BDEV_SIZE=64 +MALLOC_BLOCK_SIZE=512 + +rpc_py="$rootdir/scripts/rpc.py" + +nvmftestinit + +timing_enter start_nvmf_tgt + +"${NVMF_APP[@]}" -m 0xF & +nvmfpid=$! + +trap 'process_shm --id $NVMF_APP_SHM_ID; nvmftestfini; exit 1' SIGINT SIGTERM EXIT + +waitforlisten $nvmfpid +$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 +timing_exit start_nvmf_tgt + +$rpc_py bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE -b Malloc0 +$rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 +# NOTE: This will assign the same NGUID and EUI64 to all bdevs, +# but currently we only have one (see above), so this is OK. +$rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc0 \ + --nguid "ABCDEF0123456789ABCDEF0123456789" \ + --eui64 "ABCDEF0123456789" +$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT + +$rpc_py nvmf_get_subsystems + +$SPDK_EXAMPLE_DIR/identify -r "\ + trtype:$TEST_TRANSPORT \ + adrfam:IPv4 \ + traddr:$NVMF_FIRST_TARGET_IP \ + trsvcid:$NVMF_PORT \ + subnqn:nqn.2014-08.org.nvmexpress.discovery" -L all +$SPDK_EXAMPLE_DIR/identify -r "\ + trtype:$TEST_TRANSPORT \ + adrfam:IPv4 \ + traddr:$NVMF_FIRST_TARGET_IP \ + trsvcid:$NVMF_PORT \ + subnqn:nqn.2016-06.io.spdk:cnode1" -L all +sync +$rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 + +trap - SIGINT SIGTERM EXIT + +nvmftestfini diff --git a/src/spdk/test/nvmf/host/identify_kernel_nvmf.sh b/src/spdk/test/nvmf/host/identify_kernel_nvmf.sh new file mode 100755 index 000000000..d6dd2916b --- /dev/null +++ b/src/spdk/test/nvmf/host/identify_kernel_nvmf.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../../..) +source $rootdir/test/common/autotest_common.sh +source $rootdir/test/nvmf/common.sh + +nvmftestinit + +subsystemname=nqn.2016-06.io.spdk:testnqn + +modprobe null_blk nr_devices=1 +modprobe nvmet +modprobe nvmet-rdma +modprobe nvmet-fc +modprobe lpfc + +if [ ! -d /sys/kernel/config/nvmet/subsystems/$subsystemname ]; then + mkdir /sys/kernel/config/nvmet/subsystems/$subsystemname +fi +echo 1 > /sys/kernel/config/nvmet/subsystems/$subsystemname/attr_allow_any_host + +if [ ! -d /sys/kernel/config/nvmet/subsystems/$subsystemname/namespaces/1 ]; then + mkdir /sys/kernel/config/nvmet/subsystems/$subsystemname/namespaces/1 +fi + +echo -n /dev/nullb0 > /sys/kernel/config/nvmet/subsystems/$subsystemname/namespaces/1/device_path +echo 1 > /sys/kernel/config/nvmet/subsystems/$subsystemname/namespaces/1/enable + +if [ ! -d /sys/kernel/config/nvmet/ports/1 ]; then + mkdir /sys/kernel/config/nvmet/ports/1 +fi + +echo -n rdma > /sys/kernel/config/nvmet/ports/1/addr_trtype +echo -n ipv4 > /sys/kernel/config/nvmet/ports/1/addr_adrfam +echo -n $NVMF_FIRST_TARGET_IP > /sys/kernel/config/nvmet/ports/1/addr_traddr +echo -n $NVMF_PORT > /sys/kernel/config/nvmet/ports/1/addr_trsvcid + +ln -s /sys/kernel/config/nvmet/subsystems/$subsystemname /sys/kernel/config/nvmet/ports/1/subsystems/$subsystemname + +sleep 4 + +$SPDK_EXAMPLE_DIR/identify -r "\ + trtype:$TEST_TRANSPORT \ + adrfam:IPv4 \ + traddr:$NVMF_FIRST_TARGET_IP \ + trsvcid:$NVMF_PORT \ + subnqn:nqn.2014-08.org.nvmexpress.discovery" -t all +$SPDK_EXAMPLE_DIR/identify -r "\ + trtype:$TEST_TRANSPORT \ + adrfam:IPv4 \ + traddr:$NVMF_FIRST_TARGET_IP \ + trsvcid:$NVMF_PORT \ + subnqn:$subsystemname" + +rm -rf /sys/kernel/config/nvmet/ports/1/subsystems/$subsystemname + +echo 0 > /sys/kernel/config/nvmet/subsystems/$subsystemname/namespaces/1/enable +echo -n 0 > /sys/kernel/config/nvmet/subsystems/$subsystemname/namespaces/1/device_path + +rmdir --ignore-fail-on-non-empty /sys/kernel/config/nvmet/subsystems/$subsystemname/namespaces/1 +rmdir --ignore-fail-on-non-empty /sys/kernel/config/nvmet/subsystems/$subsystemname +rmdir --ignore-fail-on-non-empty /sys/kernel/config/nvmet/ports/1 + +rmmod lpfc +rmmod nvmet_fc +rmmod nvmet-rdma +rmmod null_blk +rmmod nvmet + +nvmftestfini diff --git a/src/spdk/test/nvmf/host/perf.sh b/src/spdk/test/nvmf/host/perf.sh new file mode 100755 index 000000000..69fa28f0b --- /dev/null +++ b/src/spdk/test/nvmf/host/perf.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../../..) +source $rootdir/test/common/autotest_common.sh +source $rootdir/test/nvmf/common.sh + +MALLOC_BDEV_SIZE=64 +MALLOC_BLOCK_SIZE=512 + +rpc_py="$rootdir/scripts/rpc.py" + +nvmftestinit +nvmfappstart -m 0xF + +$rootdir/scripts/gen_nvme.sh --json | $rpc_py load_subsystem_config + +local_nvme_trid="trtype:PCIe traddr:"$($rpc_py framework_get_config bdev | jq -r '.[].params | select(.name=="Nvme0").traddr') +bdevs="$bdevs $($rpc_py bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE)" + +if [ -n "$local_nvme_trid" ]; then + bdevs="$bdevs Nvme0n1" +fi + +$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS +$rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 +for bdev in $bdevs; do + $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 $bdev +done +$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT + +# Test multi-process access to local NVMe device +if [ -n "$local_nvme_trid" ]; then + if [ $SPDK_RUN_NON_ROOT -eq 1 ]; then + perf_app="sudo -u $(logname) $SPDK_EXAMPLE_DIR/perf" + else + perf_app="$SPDK_EXAMPLE_DIR/perf" + fi + $perf_app -i $NVMF_APP_SHM_ID -q 32 -o 4096 -w randrw -M 50 -t 1 -r "$local_nvme_trid" +fi + +$SPDK_EXAMPLE_DIR/perf -q 1 -o 4096 -w randrw -M 50 -t 1 -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" +$SPDK_EXAMPLE_DIR/perf -q 32 -o 4096 -w randrw -M 50 -t 1 -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" +$SPDK_EXAMPLE_DIR/perf -q 128 -o 262144 -w randrw -M 50 -t 2 -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" +sync +$rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 + +if [ $RUN_NIGHTLY -eq 1 ]; then + # Configure nvme devices with nvmf lvol_bdev backend + if [ -n "$local_nvme_trid" ]; then + ls_guid=$($rpc_py bdev_lvol_create_lvstore Nvme0n1 lvs_0) + get_lvs_free_mb $ls_guid + # We don't need to create an lvol larger than 20G for this test. + # decreasing the size of the nested lvol allows us to take less time setting up + #before running I/O. + if [ $free_mb -gt 20480 ]; then + free_mb=20480 + fi + lb_guid=$($rpc_py bdev_lvol_create -u $ls_guid lbd_0 $free_mb) + + # Create lvol bdev for nested lvol stores + ls_nested_guid=$($rpc_py bdev_lvol_create_lvstore $lb_guid lvs_n_0) + get_lvs_free_mb $ls_nested_guid + if [ $free_mb -gt 20480 ]; then + free_mb=20480 + fi + lb_nested_guid=$($rpc_py bdev_lvol_create -u $ls_nested_guid lbd_nest_0 $free_mb) + $rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 + for bdev in $lb_nested_guid; do + $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 $bdev + done + $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT + # Test perf as host with different io_size and qd_depth in nightly + qd_depth=("1" "32" "128") + io_size=("512" "131072") + for qd in "${qd_depth[@]}"; do + for o in "${io_size[@]}"; do + $SPDK_EXAMPLE_DIR/perf -q $qd -o $o -w randrw -M 50 -t 10 -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" + done + done + + # Delete subsystems, lvol_bdev and destroy lvol_store. + $rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 + $rpc_py bdev_lvol_delete "$lb_nested_guid" + $rpc_py bdev_lvol_delete_lvstore -l lvs_n_0 + $rpc_py bdev_lvol_delete "$lb_guid" + $rpc_py bdev_lvol_delete_lvstore -l lvs_0 + fi +fi + +trap - SIGINT SIGTERM EXIT + +nvmftestfini diff --git a/src/spdk/test/nvmf/host/target_disconnect.sh b/src/spdk/test/nvmf/host/target_disconnect.sh new file mode 100755 index 000000000..82521196b --- /dev/null +++ b/src/spdk/test/nvmf/host/target_disconnect.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../../..) +source $rootdir/test/common/autotest_common.sh +source $rootdir/test/nvmf/common.sh + +PLUGIN_DIR=$rootdir/examples/nvme/fio_plugin + +MALLOC_BDEV_SIZE=64 +MALLOC_BLOCK_SIZE=512 + +rpc_py="$rootdir/scripts/rpc.py" + +function disconnect_init() { + nvmfappstart -m 0xF0 + + $rpc_py bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE -b Malloc0 + + $rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS + $rpc_py nvmf_subsystem_create nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 + + $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc0 + $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $1 -s $NVMF_PORT +} + +# Test to make sure we don't segfault or access null pointers when we try to connect to +# a discovery controller that doesn't exist yet. +function nvmf_target_disconnect_tc1() { + set +e + $SPDK_EXAMPLE_DIR/reconnect -q 32 -o 4096 -w randrw -M 50 -t 10 -c 0xF \ + -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" + # If the program crashes, the high bit of $? will be set so we will get a value in the hundreds. + # But if the reconnect code detects errors and exits normally it will return 1. + if [ $? != 1 ]; then + set -e + exit 1 + fi + set -e +} + +function nvmf_target_disconnect_tc2() { + disconnect_init $NVMF_FIRST_TARGET_IP + + # If perf doesn't shut down, this test will time out. + $SPDK_EXAMPLE_DIR/reconnect -q 32 -o 4096 -w randrw -M 50 -t 10 -c 0xF \ + -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" & + reconnectpid=$! + + sleep 2 + kill -9 $nvmfpid + + sleep 2 + disconnect_init $NVMF_FIRST_TARGET_IP + + wait $reconnectpid + sync +} + +function nvmf_target_disconnect_tc3() { + $SPDK_EXAMPLE_DIR/reconnect -q 32 -o 4096 -w randrw -M 50 -t 10 -c 0xF \ + -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT alt_traddr:$NVMF_SECOND_TARGET_IP" & + reconnectpid=$! + + sleep 2 + kill -9 $nvmfpid + + sleep 2 + disconnect_init $NVMF_SECOND_TARGET_IP + + wait $reconnectpid + sync +} + +nvmftestinit +# There is an intermittent error relating to this test and Soft-RoCE. for now, just +# skip this test if we are using rxe. TODO: get to the bottom of GitHub issue #1043 +if [ $TEST_TRANSPORT == "rdma" ] && check_ip_is_soft_roce $NVMF_FIRST_TARGET_IP; then + echo "Using software RDMA, skipping the target disconnect tests." +else + run_test "nvmf_target_disconnect_tc1" nvmf_target_disconnect_tc1 + run_test "nvmf_target_disconnect_tc2" nvmf_target_disconnect_tc2 + if [ -n "$NVMF_SECOND_TARGET_IP" ]; then + run_test "nvmf_target_disconnect_tc3" nvmf_target_disconnect_tc3 + fi +fi + +trap - SIGINT SIGTERM EXIT +nvmftestfini |