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 8MALLOC_BDEV_SIZE=64 9MALLOC_BLOCK_SIZE=512 10 11rpc_py="$rootdir/scripts/rpc.py" 12 13nvmftestinit 14 15if [ -z $NVMF_SECOND_TARGET_IP ]; then 16 echo "only one NIC for nvmf test" 17 nvmftestfini 18 exit 0 19fi 20 21if [ "$TEST_TRANSPORT" != "tcp" ]; then 22 echo "run this test only with TCP transport for now" 23 nvmftestfini 24 exit 0 25fi 26 27nvmfappstart -m 0xF 28 29$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 30 31$rpc_py bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE -b Malloc0 32$rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 -r 33$rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc0 34$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT 35$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_SECOND_TARGET_IP -s $NVMF_PORT 36 37nvme connect -t $TEST_TRANSPORT -n "nqn.2016-06.io.spdk:cnode1" -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" 38nvme connect -t $TEST_TRANSPORT -n "nqn.2016-06.io.spdk:cnode1" -a "$NVMF_SECOND_TARGET_IP" -s "$NVMF_PORT" 39 40waitforserial "$NVMF_SERIAL" 41 42# We assume only a single subsystem. 43subsys_id=$(nvme list-subsys | sed -n 's/nqn.2016-06.io.spdk:cnode1//p' | sed 's/[^0-9]*//g') 44ctrl1_id=$(nvme list-subsys | sed -n "s/traddr=$NVMF_FIRST_TARGET_IP trsvcid=$NVMF_PORT//p" | sed 's/[^0-9]*//g') 45ctrl2_id=$(nvme list-subsys | sed -n "s/traddr=$NVMF_SECOND_TARGET_IP trsvcid=$NVMF_PORT//p" | sed 's/[^0-9]*//g') 46 47[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl1_id"n1/ana_state) == "optimized" ] 48[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl2_id"n1/ana_state) == "optimized" ] 49 50# Set IO policy to numa 51echo numa > /sys/class/nvme-subsystem/nvme-subsys$subsys_id/iopolicy 52 53$rootdir/scripts/fio.py -p nvmf -i 4096 -d 128 -t randrw -r 6 -v & 54fio_pid=$! 55 56sleep 1 57 58$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" -n inaccessible 59$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_SECOND_TARGET_IP" -s "$NVMF_PORT" -n non_optimized 60 61sleep 1 62 63[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl1_id"n1/ana_state) == "inaccessible" ] 64[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl2_id"n1/ana_state) == "non-optimized" ] 65 66$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" -n non_optimized 67$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_SECOND_TARGET_IP" -s "$NVMF_PORT" -n inaccessible 68 69sleep 1 70 71[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl1_id"n1/ana_state) == "non-optimized" ] 72[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl2_id"n1/ana_state) == "inaccessible" ] 73 74wait $fio_pid 75 76$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" -n optimized 77$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_SECOND_TARGET_IP" -s "$NVMF_PORT" -n optimized 78 79sleep 1 80 81[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl1_id"n1/ana_state) == "optimized" ] 82[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl2_id"n1/ana_state) == "optimized" ] 83 84# Set IO policy to round-robin 85echo round-robin > /sys/class/nvme-subsystem/nvme-subsys$subsys_id/iopolicy 86 87$rootdir/scripts/fio.py -p nvmf -i 4096 -d 128 -t randrw -r 6 -v & 88fio_pid=$! 89 90sleep 1 91 92$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" -n inaccessible 93$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_SECOND_TARGET_IP" -s "$NVMF_PORT" -n non_optimized 94 95sleep 1 96 97[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl1_id"n1/ana_state) == "inaccessible" ] 98[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl2_id"n1/ana_state) == "non-optimized" ] 99 100$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" -n non_optimized 101$rpc_py nvmf_subsystem_listener_set_ana_state nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a "$NVMF_SECOND_TARGET_IP" -s "$NVMF_PORT" -n inaccessible 102 103sleep 1 104 105[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl1_id"n1/ana_state) == "non-optimized" ] 106[ $(cat /sys/block/nvme"$subsys_id"c"$ctrl2_id"n1/ana_state) == "inaccessible" ] 107 108wait $fio_pid 109 110nvme disconnect -n "nqn.2016-06.io.spdk:cnode1" || true 111 112$rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 113 114rm -f ./local-job0-0-verify.state 115rm -f ./local-job1-1-verify.state 116 117trap - SIGINT SIGTERM EXIT 118 119nvmftestfini 120