diff --git a/test/nvmf/shutdown/shutdown.sh b/test/nvmf/shutdown/shutdown.sh index d8938f25a..f247a1871 100755 --- a/test/nvmf/shutdown/shutdown.sh +++ b/test/nvmf/shutdown/shutdown.sh @@ -23,6 +23,30 @@ if [ -z $NVMF_FIRST_TARGET_IP ]; then exit 0 fi +function waitforio() { + # $1 = RPC socket + if [ -z "$1" ]; then + exit 1 + fi + # $2 = bdev name + if [ -z "$2" ]; then + exit 1 + fi + local ret=1 + local i + for (( i = 10; i != 0; i-- )); do + read_io_count=$($rpc_py -s $1 get_bdevs_iostat -b $2 | jq -r '.[1].num_read_ops') + # A few I/O will happen during initial examine. So wait until at least 100 I/O + # have completed to know that bdevperf is really generating the I/O. + if [ $read_io_count -ge 100 ]; then + ret=0 + break + fi + sleep 0.25 + done + return $ret +} + timing_enter shutdown timing_enter start_nvmf_tgt # Start up the NVMf target in another process @@ -91,8 +115,7 @@ perfpid=$! waitforlisten $perfpid /var/tmp/bdevperf.sock $rpc_py -s /var/tmp/bdevperf.sock wait_subsystem_init -# Sleep for a few seconds to allow I/O to begin -sleep 5 +waitforio /var/tmp/bdevperf.sock Nvme1n1 # Kill bdevperf half way through killprocess $perfpid @@ -114,8 +137,7 @@ $rpc_py -s /var/tmp/bdevperf.sock wait_subsystem_init # Expand the trap to clean up bdevperf if something goes wrong trap "process_shm --id $NVMF_APP_SHM_ID; killprocess $pid; kill -9 $perfpid; nvmfcleanup; nvmftestfini $1; exit 1" SIGINT SIGTERM EXIT -# Sleep for a few seconds to allow I/O to begin -sleep 5 +waitforio /var/tmp/bdevperf.sock Nvme1n1 # Kill the target half way through killprocess $pid