xref: /spdk/test/common/autotest_common.sh (revision 1baf379e697af87dcceee5d06b0fc38aefe7a7dd)
13b660ea8SDarek Stojaczykfunction xtrace_disable() {
2190b2245SSeth Howell	if [ "$XTRACE_DISABLED" != "yes" ]; then
33b660ea8SDarek Stojaczyk		PREV_BASH_OPTS="$-"
4190b2245SSeth Howell		if [[ "$PREV_BASH_OPTS" == *"x"* ]]; then
5190b2245SSeth Howell			XTRACE_DISABLED="yes"
6190b2245SSeth Howell		fi
73b660ea8SDarek Stojaczyk		set +x
839fe5c84SSeth Howell        elif [ -z $XTRACE_NESTING_LEVEL ]; then
939fe5c84SSeth Howell                XTRACE_NESTING_LEVEL=1
1039fe5c84SSeth Howell        else
1139fe5c84SSeth Howell                XTRACE_NESTING_LEVEL=$((++XTRACE_NESTING_LEVEL))
12190b2245SSeth Howell	fi
133b660ea8SDarek Stojaczyk}
143b660ea8SDarek Stojaczyk
15fadcb08dSDarek Stojaczykxtrace_disable
16fadcb08dSDarek Stojaczykset -e
17fadcb08dSDarek Stojaczykshopt -s expand_aliases
18fadcb08dSDarek Stojaczyk
198d2247e2SDarek Stojaczyk# Dummy function to be called after restoring xtrace just so that it appears in the
208d2247e2SDarek Stojaczyk# xtrace log. This way we can consistently track when xtrace is enabled/disabled.
218d2247e2SDarek Stojaczykfunction xtrace_enable() {
228d2247e2SDarek Stojaczyk	# We have to do something inside a function in bash, and calling any command
238d2247e2SDarek Stojaczyk	# (even `:`) will produce an xtrace entry, so we just define another function.
248d2247e2SDarek Stojaczyk	function xtrace_dummy() { :; }
258d2247e2SDarek Stojaczyk}
268d2247e2SDarek Stojaczyk
27fadcb08dSDarek Stojaczyk# Keep it as alias to avoid xtrace_enable backtrace always pointing to xtrace_restore.
28fadcb08dSDarek Stojaczyk# xtrace_enable will appear as called directly from the user script, from the same line
29fadcb08dSDarek Stojaczyk# that "called" xtrace_restore.
3039fe5c84SSeth Howellalias xtrace_restore=\
3139fe5c84SSeth Howell'if [ -z $XTRACE_NESTING_LEVEL ]; then
3239fe5c84SSeth Howell        if [[ "$PREV_BASH_OPTS" == *"x"* ]]; then
3339fe5c84SSeth Howell		XTRACE_DISABLED="no"; PREV_BASH_OPTS=""; set -x; xtrace_enable;
3439fe5c84SSeth Howell	fi
3539fe5c84SSeth Howellelse
3639fe5c84SSeth Howell	XTRACE_NESTING_LEVEL=$((--XTRACE_NESTING_LEVEL));
3739fe5c84SSeth Howell	if [ $XTRACE_NESTING_LEVEL -eq "0" ]; then
3839fe5c84SSeth Howell		unset XTRACE_NESTING_LEVEL
3939fe5c84SSeth Howell	fi
4039fe5c84SSeth Howellfi'
41c9e5d2a6SSeth Howell
42c9e5d2a6SSeth Howell: ${RUN_NIGHTLY:=0}
43c9e5d2a6SSeth Howellexport RUN_NIGHTLY
44c9e5d2a6SSeth Howell
45b96cf2efSPawel Niedzwiecki: ${RUN_NIGHTLY_FAILING:=0}
46b96cf2efSPawel Niedzwieckiexport RUN_NIGHTLY_FAILING
47b96cf2efSPawel Niedzwiecki
48c9e5d2a6SSeth Howell# Set defaults for missing test config options
490560976dSPawel Niedzwiecki: ${SPDK_BUILD_DOC=0}; export SPDK_BUILD_DOC
509a25fc12STomasz Zawadzki: ${SPDK_BUILD_PACKAGE=0}; export SPDK_BUILD_PACKAGE
510560976dSPawel Niedzwiecki: ${SPDK_BUILD_SHARED_OBJECT=0}; export SPDK_BUILD_SHARED_OBJECT
520560976dSPawel Niedzwiecki: ${SPDK_RUN_VALGRIND=0}; export SPDK_RUN_VALGRIND
530560976dSPawel Niedzwiecki: ${SPDK_RUN_FUNCTIONAL_TEST=0}; export SPDK_RUN_FUNCTIONAL_TEST
540560976dSPawel Niedzwiecki: ${SPDK_TEST_UNITTEST=0}; export SPDK_TEST_UNITTEST
552f476a63SSeth Howell: ${SPDK_TEST_AUTOBUILD=0}; export SPDK_TEST_AUTOBUILD
560560976dSPawel Niedzwiecki: ${SPDK_TEST_ISAL=0}; export SPDK_TEST_ISAL
570560976dSPawel Niedzwiecki: ${SPDK_TEST_ISCSI=0}; export SPDK_TEST_ISCSI
580560976dSPawel Niedzwiecki: ${SPDK_TEST_ISCSI_INITIATOR=0}; export SPDK_TEST_ISCSI_INITIATOR
590560976dSPawel Niedzwiecki: ${SPDK_TEST_NVME=0}; export SPDK_TEST_NVME
600560976dSPawel Niedzwiecki: ${SPDK_TEST_NVME_CLI=0}; export SPDK_TEST_NVME_CLI
61efbcd259STomasz Kulasek: ${SPDK_TEST_NVME_CUSE=0}; export SPDK_TEST_NVME_CUSE
620560976dSPawel Niedzwiecki: ${SPDK_TEST_NVMF=0}; export SPDK_TEST_NVMF
63d19b101cSSeth Howell: ${SPDK_TEST_NVMF_TRANSPORT="rdma"}; export SPDK_TEST_NVMF_TRANSPORT
640560976dSPawel Niedzwiecki: ${SPDK_TEST_RBD=0}; export SPDK_TEST_RBD
650560976dSPawel Niedzwiecki: ${SPDK_TEST_VHOST=0}; export SPDK_TEST_VHOST
660560976dSPawel Niedzwiecki: ${SPDK_TEST_BLOCKDEV=0}; export SPDK_TEST_BLOCKDEV
670560976dSPawel Niedzwiecki: ${SPDK_TEST_IOAT=0}; export SPDK_TEST_IOAT
680560976dSPawel Niedzwiecki: ${SPDK_TEST_EVENT=0}; export SPDK_TEST_EVENT
690560976dSPawel Niedzwiecki: ${SPDK_TEST_BLOBFS=0}; export SPDK_TEST_BLOBFS
700560976dSPawel Niedzwiecki: ${SPDK_TEST_VHOST_INIT=0}; export SPDK_TEST_VHOST_INIT
710560976dSPawel Niedzwiecki: ${SPDK_TEST_PMDK=0}; export SPDK_TEST_PMDK
720560976dSPawel Niedzwiecki: ${SPDK_TEST_LVOL=0}; export SPDK_TEST_LVOL
730560976dSPawel Niedzwiecki: ${SPDK_TEST_JSON=0}; export SPDK_TEST_JSON
740560976dSPawel Niedzwiecki: ${SPDK_TEST_REDUCE=0}; export SPDK_TEST_REDUCE
7514a62d67STomasz Kulasek: ${SPDK_TEST_VPP=0}; export SPDK_TEST_VPP
760560976dSPawel Niedzwiecki: ${SPDK_RUN_ASAN=0}; export SPDK_RUN_ASAN
770560976dSPawel Niedzwiecki: ${SPDK_RUN_UBSAN=0}; export SPDK_RUN_UBSAN
780560976dSPawel Niedzwiecki: ${SPDK_RUN_INSTALLED_DPDK=0}; export SPDK_RUN_INSTALLED_DPDK
79714a5646SBen Walker: ${SPDK_RUN_NON_ROOT=0}; export SPDK_RUN_NON_ROOT
800560976dSPawel Niedzwiecki: ${SPDK_TEST_CRYPTO=0}; export SPDK_TEST_CRYPTO
81ef2e614cSWojciech Malikowski: ${SPDK_TEST_FTL=0}; export SPDK_TEST_FTL
820560976dSPawel Niedzwiecki: ${SPDK_TEST_OCF=0}; export SPDK_TEST_OCF
830699216fSWojciech Malikowski: ${SPDK_TEST_FTL_EXTENDED=0}; export SPDK_TEST_FTL_EXTENDED
841d717c7cSWojciech Malikowski: ${SPDK_TEST_VMD=0}; export SPDK_TEST_VMD
852176f081SChunyang Hui: ${SPDK_TEST_OPAL=0}; export SPDK_TEST_OPAL
867612ac47SDarek Stojaczyk: ${SPDK_AUTOTEST_X=true}; export SPDK_AUTOTEST_X
87c9e5d2a6SSeth Howell
8805dde5c2STomasz Zawadzki# Export PYTHONPATH with addition of RPC framework. New scripts can be created
8905dde5c2STomasz Zawadzki# specific use cases for tests.
9005dde5c2STomasz Zawadzkiexport PYTHONPATH=$PYTHONPATH:$rootdir/scripts
9105dde5c2STomasz Zawadzki
92f657669eSKarol Latecki# Don't create Python .pyc files. When running with sudo these will be
93f657669eSKarol Latecki# created with root ownership and can cause problems when cleaning the repository.
94f657669eSKarol Lateckiexport PYTHONDONTWRITEBYTECODE=1
95f657669eSKarol Latecki
96f40d2451SSeth Howell# Export flag to skip the known bug that exists in librados
97f40d2451SSeth Howell# Bug is reported on ceph bug tracker with number 24078
98f40d2451SSeth Howellexport ASAN_OPTIONS=new_delete_type_mismatch=0
99f40d2451SSeth Howellexport UBSAN_OPTIONS='halt_on_error=1:print_stacktrace=1:abort_on_error=1'
100f40d2451SSeth Howell
1019fda9814STomasz Zawadzki# Export LeakSanitizer option to use suppression file in order to prevent false positives
1029fda9814STomasz Zawadzki# and known leaks in external executables or libraries from showing up.
1039fda9814STomasz Zawadzkiasan_suppression_file="/var/tmp/asan_suppression_file"
1049fda9814STomasz Zawadzkisudo rm -rf "$asan_suppression_file"
10502925187SMaciej Wawrykcat << EOL >> "$asan_suppression_file"
1069fda9814STomasz Zawadzki# ASAN has some bugs around thread_local variables.  We have a destructor in place
1079fda9814STomasz Zawadzki# to free the thread contexts, but ASAN complains about the leak before those
1089fda9814STomasz Zawadzki# destructors have a chance to run.  So suppress this one specific leak using
1099fda9814STomasz Zawadzki# LSAN_OPTIONS.
11002925187SMaciej Wawrykleak:spdk_fs_alloc_thread_ctx
1119fda9814STomasz Zawadzki
1121bed9c1fSTomasz Zawadzki# Suppress known leaks in fio project
11302925187SMaciej Wawrykleak:/usr/src/fio/parse.c
11402925187SMaciej Wawrykleak:/usr/src/fio/iolog.c
11502925187SMaciej Wawrykleak:/usr/src/fio/init.c
11602925187SMaciej Wawrykleak:fio_memalign
11702925187SMaciej Wawrykleak:spdk_fio_io_u_init
1181bed9c1fSTomasz Zawadzki
1191891f2e5STomasz Zawadzki# Suppress leaks in libiscsi
12002925187SMaciej Wawrykleak:libiscsi.so
12102925187SMaciej WawrykEOL
1221891f2e5STomasz Zawadzki
1238e70c6e3STomasz Kulasek# Suppress leaks in libfuse3
1248e70c6e3STomasz Kulasekecho "leak:libfuse3.so" >> "$asan_suppression_file"
1258e70c6e3STomasz Kulasek
1269fda9814STomasz Zawadzkiexport LSAN_OPTIONS=suppressions="$asan_suppression_file"
1279fda9814STomasz Zawadzki
128f40d2451SSeth Howellexport DEFAULT_RPC_ADDR="/var/tmp/spdk.sock"
129f40d2451SSeth Howell
130f04277f0SJohn Meneghiniif [ -z "$DEPENDENCY_DIR" ]; then
131f04277f0SJohn Meneghini	export DEPENDENCY_DIR=/home/sys_sgsw
132f04277f0SJohn Meneghinielse
133f04277f0SJohn Meneghini	export DEPENDENCY_DIR
134f04277f0SJohn Meneghinifi
135f04277f0SJohn Meneghini
136c9e5d2a6SSeth Howell# pass our valgrind desire on to unittest.sh
137c9e5d2a6SSeth Howellif [ $SPDK_RUN_VALGRIND -eq 0 ]; then
138c9e5d2a6SSeth Howell	export valgrind=''
139c9e5d2a6SSeth Howellfi
140c9e5d2a6SSeth Howell
141f40d2451SSeth Howellif [ "$(uname -s)" = "Linux" ]; then
14238d4a2a2SPawel Kaminski	MAKE="make"
143f40d2451SSeth Howell	MAKEFLAGS=${MAKEFLAGS:--j$(nproc)}
144f40d2451SSeth Howell	DPDK_LINUX_DIR=/usr/share/dpdk/x86_64-default-linuxapp-gcc
145f40d2451SSeth Howell	if [ -d $DPDK_LINUX_DIR ] && [ $SPDK_RUN_INSTALLED_DPDK -eq 1 ]; then
146f40d2451SSeth Howell		WITH_DPDK_DIR=$DPDK_LINUX_DIR
147f40d2451SSeth Howell	fi
148f40d2451SSeth Howell	# Override the default HUGEMEM in scripts/setup.sh to allocate 8GB in hugepages.
149f40d2451SSeth Howell	export HUGEMEM=8192
150f40d2451SSeth Howellelif [ "$(uname -s)" = "FreeBSD" ]; then
15138d4a2a2SPawel Kaminski	MAKE="gmake"
152772eb8ebSKarol Latecki	MAKEFLAGS=${MAKEFLAGS:--j$(sysctl -a | grep -E -i 'hw.ncpu' | awk '{print $2}')}
153f40d2451SSeth Howell	DPDK_FREEBSD_DIR=/usr/local/share/dpdk/x86_64-native-bsdapp-clang
154f40d2451SSeth Howell	if [ -d $DPDK_FREEBSD_DIR ] && [ $SPDK_RUN_INSTALLED_DPDK -eq 1 ]; then
155f40d2451SSeth Howell		WITH_DPDK_DIR=$DPDK_FREEBSD_DIR
156f40d2451SSeth Howell	fi
157f40d2451SSeth Howell	# FreeBSD runs a much more limited set of tests, so keep the default 2GB.
158f40d2451SSeth Howell	export HUGEMEM=2048
159f40d2451SSeth Howellelse
160f40d2451SSeth Howell	echo "Unknown OS \"$(uname -s)\""
161f40d2451SSeth Howell	exit 1
162f40d2451SSeth Howellfi
163f40d2451SSeth Howell
164c9e5d2a6SSeth Howellconfig_params='--enable-debug --enable-werror'
165c9e5d2a6SSeth Howell
166848daf27SPawel Wodkowskiif echo -e "#include <libunwind.h>\nint main(int argc, char *argv[]) {return 0;}\n" | \
167848daf27SPawel Wodkowski	gcc -o /dev/null -lunwind -x c - 2>/dev/null; then
168ae2b2f64SPawel Wodkowski	config_params+=' --enable-log-bt'
169848daf27SPawel Wodkowskifi
170848daf27SPawel Wodkowski
1718a43cd27Spaul luse# for options with dependencies but no test flag, set them here
1728a43cd27Spaul luseif [ -f /usr/include/infiniband/verbs.h ]; then
1738a43cd27Spaul luse	config_params+=' --with-rdma'
1748a43cd27Spaul lusefi
1758a43cd27Spaul luse
1768a43cd27Spaul luseif [ -d /usr/src/fio ]; then
1778a43cd27Spaul luse	config_params+=' --with-fio=/usr/src/fio'
1788a43cd27Spaul lusefi
1798a43cd27Spaul luse
1808a43cd27Spaul luseif [ -d ${DEPENDENCY_DIR}/vtune_codes ]; then
1818a43cd27Spaul luse	config_params+=' --with-vtune='${DEPENDENCY_DIR}'/vtune_codes'
1828a43cd27Spaul lusefi
1838a43cd27Spaul luse
1848a43cd27Spaul luseif [ -d /usr/include/iscsi ]; then
185fb9c4ee6SKarol Latecki	libiscsi_version=$(grep LIBISCSI_API_VERSION /usr/include/iscsi/iscsi.h | head -1 | awk '{print $3}' | awk -F '(' '{print $2}' | awk -F ')' '{print $1}')
1868a43cd27Spaul luse	if [ $libiscsi_version -ge 20150621 ]; then
1878a43cd27Spaul luse		config_params+=' --with-iscsi-initiator'
1888a43cd27Spaul luse	fi
1898a43cd27Spaul lusefi
1908a43cd27Spaul luse
191efbcd259STomasz Kulasekif [ $SPDK_TEST_NVME_CUSE -eq 1 ]; then
192efbcd259STomasz Kulasek	config_params+=' --with-nvme-cuse'
193efbcd259STomasz Kulasekfi
194efbcd259STomasz Kulasek
1958a43cd27Spaul luse# for options with both dependencies and a test flag, set them here
1968a43cd27Spaul luseif [ -f /usr/include/libpmemblk.h ] && [ $SPDK_TEST_PMDK -eq 1 ]; then
1978a43cd27Spaul luse	config_params+=' --with-pmdk'
1988a43cd27Spaul lusefi
1998a43cd27Spaul luse
2008a43cd27Spaul luseif [ -f /usr/include/libpmem.h ] && [ $SPDK_TEST_REDUCE -eq 1 ]; then
2018a43cd27Spaul luse	if [ $SPDK_TEST_ISAL -eq 1 ]; then
2028a43cd27Spaul luse		config_params+=' --with-reduce'
2038a43cd27Spaul luse	else
2048a43cd27Spaul luse		echo "reduce not enabled because isal is not enabled."
2058a43cd27Spaul luse	fi
2068a43cd27Spaul lusefi
2078a43cd27Spaul luse
2088a43cd27Spaul luseif [ -d /usr/include/rbd ] &&  [ -d /usr/include/rados ] && [ $SPDK_TEST_RBD -eq 1 ]; then
2098a43cd27Spaul luse	config_params+=' --with-rbd'
2108a43cd27Spaul lusefi
2118a43cd27Spaul luse
21214a62d67STomasz Kulasekif [ $SPDK_TEST_VPP -eq 1 ]; then
2139307ff5aSTomasz Kulasek	VPP_PATH="/usr/local/src/vpp-19.04/build-root/install-vpp_debug-native/vpp/"
21414a62d67STomasz Kulasek	export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${VPP_PATH}/lib/
21514a62d67STomasz Kulasek	export PATH=${PATH}:${VPP_PATH}/bin/
21614a62d67STomasz Kulasek	config_params+=" --with-vpp=${VPP_PATH}"
21714a62d67STomasz Kulasekfi
21814a62d67STomasz Kulasek
2198a43cd27Spaul luse# for options with no required dependencies, just test flags, set them here
22051606ed4SPaul Luseif [ $SPDK_TEST_CRYPTO -eq 1 ]; then
22151606ed4SPaul Luse	config_params+=' --with-crypto'
22251606ed4SPaul Lusefi
22351606ed4SPaul Luse
2242fde729fSVitaliy Mysakif [ $SPDK_TEST_OCF -eq 1 ]; then
22534bdceabSVitaliy Mysak	config_params+=" --with-ocf"
2262fde729fSVitaliy Mysakfi
2272fde729fSVitaliy Mysak
228e20401c8SDarek Stojaczykif [ $SPDK_RUN_UBSAN -eq 1 ]; then
229e20401c8SDarek Stojaczyk	config_params+=' --enable-ubsan'
230e20401c8SDarek Stojaczykfi
231e20401c8SDarek Stojaczyk
232e20401c8SDarek Stojaczykif [ $SPDK_RUN_ASAN -eq 1 ]; then
233e20401c8SDarek Stojaczyk	config_params+=' --enable-asan'
234e20401c8SDarek Stojaczykfi
235e20401c8SDarek Stojaczyk
23685e70f4eSDarek Stojaczykif [ "$(uname -s)" = "Linux" ]; then
237c9e5d2a6SSeth Howell	config_params+=' --enable-coverage'
23885e70f4eSDarek Stojaczykfi
239c9e5d2a6SSeth Howell
2408a43cd27Spaul luseif [ $SPDK_TEST_ISAL -eq 0 ]; then
2418a43cd27Spaul luse	config_params+=' --without-isal'
2428a43cd27Spaul lusefi
2438a43cd27Spaul luse
2447fa15e28SXiaodong Liuif [ $SPDK_TEST_BLOBFS -eq 1 ]; then
2457fa15e28SXiaodong Liu	if [[ -d /usr/include/fuse3 ]] && [[ -d /usr/local/include/fuse3 ]]; then
2467fa15e28SXiaodong Liu		config_params+=' --with-fuse'
2477fa15e28SXiaodong Liu	else
2487fa15e28SXiaodong Liu		echo "FUSE not enabled because libfuse3 is not installed."
2497fa15e28SXiaodong Liu	fi
2507fa15e28SXiaodong Liufi
2517fa15e28SXiaodong Liu
252c9e5d2a6SSeth Howell# By default, --with-dpdk is not set meaning the SPDK build will use the DPDK submodule.
253c9e5d2a6SSeth Howell# If a DPDK installation is found in a well-known location though, WITH_DPDK_DIR will be
254c9e5d2a6SSeth Howell# set which will override the default and use that DPDK installation instead.
2551ccc878eSKarol Lateckiif [ -n "$WITH_DPDK_DIR" ]; then
256c9e5d2a6SSeth Howell	config_params+=" --with-dpdk=$WITH_DPDK_DIR"
257c9e5d2a6SSeth Howellfi
258c9e5d2a6SSeth Howell
259c9e5d2a6SSeth Howellexport config_params
260c9e5d2a6SSeth Howell
261c9e5d2a6SSeth Howellif [ -z "$output_dir" ]; then
262c9e5d2a6SSeth Howell	if [ -z "$rootdir" ] || [ ! -d "$rootdir/../output" ]; then
263c9e5d2a6SSeth Howell		output_dir=.
264c9e5d2a6SSeth Howell	else
265c9e5d2a6SSeth Howell		output_dir=$rootdir/../output
266c9e5d2a6SSeth Howell	fi
267c9e5d2a6SSeth Howell	export output_dir
268c9e5d2a6SSeth Howellfi
269c9e5d2a6SSeth Howell
2706a8a1b6bSJim HarrisTEST_MODE=
2716a8a1b6bSJim Harrisfor i in "$@"; do
2726a8a1b6bSJim Harris	case "$i" in
2736a8a1b6bSJim Harris		--iso)
2746a8a1b6bSJim Harris			TEST_MODE=iso
2756a8a1b6bSJim Harris			;;
2766a8a1b6bSJim Harris		--transport=*)
2776a8a1b6bSJim Harris			TEST_TRANSPORT="${i#*=}"
2786a8a1b6bSJim Harris			;;
2796a8a1b6bSJim Harris		--sock=*)
2806a8a1b6bSJim Harris			TEST_SOCK="${i#*=}"
2816a8a1b6bSJim Harris			;;
2826a8a1b6bSJim Harris	esac
2836a8a1b6bSJim Harrisdone
2846a8a1b6bSJim Harris
285c9e5d2a6SSeth Howellfunction timing() {
286c9e5d2a6SSeth Howell	direction="$1"
287c9e5d2a6SSeth Howell	testname="$2"
288c9e5d2a6SSeth Howell
289c9e5d2a6SSeth Howell	now=$(date +%s)
290c9e5d2a6SSeth Howell
291c9e5d2a6SSeth Howell	if [ "$direction" = "enter" ]; then
292c9e5d2a6SSeth Howell		export timing_stack="${timing_stack};${now}"
293c9e5d2a6SSeth Howell		export test_stack="${test_stack};${testname}"
294c9e5d2a6SSeth Howell	else
2957c00bdabSDarek Stojaczyk		touch "$output_dir/timing.txt"
296c9e5d2a6SSeth Howell		child_time=$(grep "^${test_stack:1};" $output_dir/timing.txt | awk '{s+=$2} END {print s}')
297c9e5d2a6SSeth Howell
298c9e5d2a6SSeth Howell		start_time=$(echo "$timing_stack" | sed -e 's@^.*;@@')
299c9e5d2a6SSeth Howell		timing_stack=$(echo "$timing_stack" | sed -e 's@;[^;]*$@@')
300c9e5d2a6SSeth Howell
301c9e5d2a6SSeth Howell		elapsed=$((now - start_time - child_time))
302c9e5d2a6SSeth Howell		echo "${test_stack:1} $elapsed" >> $output_dir/timing.txt
303c9e5d2a6SSeth Howell
304c9e5d2a6SSeth Howell		test_stack=$(echo "$test_stack" | sed -e 's@;[^;]*$@@')
305c9e5d2a6SSeth Howell	fi
306c9e5d2a6SSeth Howell}
307c9e5d2a6SSeth Howell
308c9e5d2a6SSeth Howellfunction timing_enter() {
3093b660ea8SDarek Stojaczyk	xtrace_disable
310c9e5d2a6SSeth Howell	timing "enter" "$1"
3113b660ea8SDarek Stojaczyk	xtrace_restore
312c9e5d2a6SSeth Howell}
313c9e5d2a6SSeth Howell
314c9e5d2a6SSeth Howellfunction timing_exit() {
3153b660ea8SDarek Stojaczyk	xtrace_disable
316c9e5d2a6SSeth Howell	timing "exit" "$1"
3173b660ea8SDarek Stojaczyk	xtrace_restore
318c9e5d2a6SSeth Howell}
319c9e5d2a6SSeth Howell
320c9e5d2a6SSeth Howellfunction timing_finish() {
321c9e5d2a6SSeth Howell	flamegraph='/usr/local/FlameGraph/flamegraph.pl'
322c9e5d2a6SSeth Howell	if [ -x "$flamegraph" ]; then
323c9e5d2a6SSeth Howell		"$flamegraph" \
324c9e5d2a6SSeth Howell			--title 'Build Timing' \
325c9e5d2a6SSeth Howell			--nametype 'Step:' \
326c9e5d2a6SSeth Howell			--countname seconds \
327c9e5d2a6SSeth Howell			$output_dir/timing.txt \
328c9e5d2a6SSeth Howell			>$output_dir/timing.svg
329c9e5d2a6SSeth Howell	fi
330c9e5d2a6SSeth Howell}
331c9e5d2a6SSeth Howell
332a562812dSSeth Howellfunction create_test_list() {
333a571eb03SSeth Howell	grep -rshI --exclude="autotest_common.sh" \
334a571eb03SSeth Howell	--exclude="$rootdir/test/common/autotest_common.sh" \
335a571eb03SSeth Howell	-e "run_test " $rootdir | grep -v "#" \
336a571eb03SSeth Howell	| sed 's/^.*run_test/run_test/' | awk '{print $2}' | \
337a571eb03SSeth Howell	sed 's/\"//g' | sort > $output_dir/all_tests.txt || true
338a562812dSSeth Howell}
339a562812dSSeth Howell
340327668c8STomasz Kulasekfunction gdb_attach() {
341327668c8STomasz Kulasek	gdb -q --batch \
342327668c8STomasz Kulasek		-ex 'handle SIGHUP nostop pass' \
343327668c8STomasz Kulasek		-ex 'handle SIGQUIT nostop pass' \
344327668c8STomasz Kulasek		-ex 'handle SIGPIPE nostop pass' \
345327668c8STomasz Kulasek		-ex 'handle SIGALRM nostop pass' \
346327668c8STomasz Kulasek		-ex 'handle SIGTERM nostop pass' \
347327668c8STomasz Kulasek		-ex 'handle SIGUSR1 nostop pass' \
348327668c8STomasz Kulasek		-ex 'handle SIGUSR2 nostop pass' \
349327668c8STomasz Kulasek		-ex 'handle SIGCHLD nostop pass' \
350327668c8STomasz Kulasek		-ex 'set print thread-events off' \
351327668c8STomasz Kulasek		-ex 'cont' \
352327668c8STomasz Kulasek		-ex 'thread apply all bt' \
353327668c8STomasz Kulasek		-ex 'quit' \
354327668c8STomasz Kulasek		--tty=/dev/stdout \
355327668c8STomasz Kulasek		-p $1
356327668c8STomasz Kulasek}
357327668c8STomasz Kulasek
358c9e5d2a6SSeth Howellfunction process_core() {
359c9e5d2a6SSeth Howell	ret=0
360f1131f1dSMaciej Wawryk	while IFS= read -r -d '' core;
361f1131f1dSMaciej Wawryk	do
362c9e5d2a6SSeth Howell		exe=$(eu-readelf -n "$core" | grep psargs | sed "s/.*psargs: \([^ \'\" ]*\).*/\1/")
363b606baabSKarol Latecki		if [[ ! -f "$exe" ]]; then
364b606baabSKarol Latecki			exe=$(eu-readelf -n "$core" | grep -oP -m1 "$exe.+")
365b606baabSKarol Latecki		fi
366c9e5d2a6SSeth Howell		echo "exe for $core is $exe"
3671ccc878eSKarol Latecki		if [[ -n "$exe" ]]; then
368005e18a8SDarek Stojaczyk			if hash gdb &>/dev/null; then
369c9e5d2a6SSeth Howell				gdb -batch -ex "thread apply all bt full" $exe $core
370c9e5d2a6SSeth Howell			fi
371c9e5d2a6SSeth Howell			cp $exe $output_dir
372c9e5d2a6SSeth Howell		fi
373c9e5d2a6SSeth Howell		mv $core $output_dir
374c9e5d2a6SSeth Howell		chmod a+r $output_dir/$core
375c9e5d2a6SSeth Howell		ret=1
376f1131f1dSMaciej Wawryk	done < <(find . -type f \( -name 'core\.?[0-9]*' -o -name '*.core' \) -print0)
377c9e5d2a6SSeth Howell	return $ret
378c9e5d2a6SSeth Howell}
379c9e5d2a6SSeth Howell
380af32aa1bSKarol Lateckifunction process_shm() {
381af32aa1bSKarol Latecki	type=$1
382af32aa1bSKarol Latecki	id=$2
383af32aa1bSKarol Latecki	if [ "$type" = "--pid" ]; then
384af32aa1bSKarol Latecki		id="pid${id}"
385af32aa1bSKarol Latecki	elif [ "$type" = "--id" ]; then
386af32aa1bSKarol Latecki		id="${id}"
387af32aa1bSKarol Latecki	else
388af32aa1bSKarol Latecki		echo "Please specify to search for pid or shared memory id."
389af32aa1bSKarol Latecki		return 1
390af32aa1bSKarol Latecki	fi
391af32aa1bSKarol Latecki
392af32aa1bSKarol Latecki	shm_files=$(find /dev/shm -name "*.${id}" -printf "%f\n")
393af32aa1bSKarol Latecki
394af32aa1bSKarol Latecki	if [[ -z $shm_files ]]; then
395af32aa1bSKarol Latecki		echo "SHM File for specified PID or shared memory id: ${id} not found!"
396af32aa1bSKarol Latecki		return 1
397af32aa1bSKarol Latecki	fi
398af32aa1bSKarol Latecki	for n in $shm_files; do
399af32aa1bSKarol Latecki		tar -C /dev/shm/ -cvzf $output_dir/${n}_shm.tar.gz ${n}
400af32aa1bSKarol Latecki	done
401af32aa1bSKarol Latecki	return 0
402af32aa1bSKarol Latecki}
403af32aa1bSKarol Latecki
404c9e5d2a6SSeth Howellfunction waitforlisten() {
405c9e5d2a6SSeth Howell	# $1 = process pid
406c9e5d2a6SSeth Howell	if [ -z "$1" ]; then
407c9e5d2a6SSeth Howell		exit 1
408c9e5d2a6SSeth Howell	fi
409c9e5d2a6SSeth Howell
410f751ea17SPawel Wodkowski	local rpc_addr="${2:-$DEFAULT_RPC_ADDR}"
411c9e5d2a6SSeth Howell
412c9e5d2a6SSeth Howell	echo "Waiting for process to start up and listen on UNIX domain socket $rpc_addr..."
413c9e5d2a6SSeth Howell	# turn off trace for this loop
4143b660ea8SDarek Stojaczyk	xtrace_disable
415f751ea17SPawel Wodkowski	local ret=0
416db1236efSPawel Wodkowski	local i
417db1236efSPawel Wodkowski	for (( i = 40; i != 0; i-- )); do
418c9e5d2a6SSeth Howell		# if the process is no longer running, then exit the script
419c9e5d2a6SSeth Howell		#  since it means the application crashed
420c9e5d2a6SSeth Howell		if ! kill -s 0 $1; then
421db1236efSPawel Wodkowski			echo "ERROR: process (pid: $1) is no longer running"
422f751ea17SPawel Wodkowski			ret=1
423f751ea17SPawel Wodkowski			break
424c9e5d2a6SSeth Howell		fi
4255bafc240STomasz Zawadzki
4266ee44c69SJim Harris		if $rootdir/scripts/rpc.py -t 1 -s "$rpc_addr" rpc_get_methods &>/dev/null; then
427db1236efSPawel Wodkowski			break
428c9e5d2a6SSeth Howell		fi
42982583134SDarek Stojaczyk
430db1236efSPawel Wodkowski		sleep 0.5
431c9e5d2a6SSeth Howell	done
432f751ea17SPawel Wodkowski
4333b660ea8SDarek Stojaczyk	xtrace_restore
434db1236efSPawel Wodkowski	if (( i == 0 )); then
435db1236efSPawel Wodkowski		echo "ERROR: timeout while waiting for process (pid: $1) to start listening on '$rpc_addr'"
436db1236efSPawel Wodkowski		ret=1
437f751ea17SPawel Wodkowski	fi
438db1236efSPawel Wodkowski	return $ret
439c9e5d2a6SSeth Howell}
440c9e5d2a6SSeth Howell
441c9e5d2a6SSeth Howellfunction waitfornbd() {
442bf9dbae5SPawel Wodkowski	local nbd_name=$1
443bf9dbae5SPawel Wodkowski	local i
444c9e5d2a6SSeth Howell
445c9e5d2a6SSeth Howell	for ((i=1; i<=20; i++)); do
446c9e5d2a6SSeth Howell		if grep -q -w $nbd_name /proc/partitions; then
447c9e5d2a6SSeth Howell			break
448c9e5d2a6SSeth Howell		else
449c9e5d2a6SSeth Howell			sleep 0.1
450c9e5d2a6SSeth Howell		fi
451c9e5d2a6SSeth Howell	done
452c9e5d2a6SSeth Howell
453c9e5d2a6SSeth Howell	# The nbd device is now recognized as a block device, but there can be
454c9e5d2a6SSeth Howell	#  a small delay before we can start I/O to that block device.  So loop
455c9e5d2a6SSeth Howell	#  here trying to read the first block of the nbd block device to a temp
456c9e5d2a6SSeth Howell	#  file.  Note that dd returns success when reading an empty file, so we
457c9e5d2a6SSeth Howell	#  need to check the size of the output file instead.
458c9e5d2a6SSeth Howell	for ((i=1; i<=20; i++)); do
459c9e5d2a6SSeth Howell		dd if=/dev/$nbd_name of=/tmp/nbdtest bs=4096 count=1 iflag=direct
460fb9c4ee6SKarol Latecki		size=$(stat -c %s /tmp/nbdtest)
461c9e5d2a6SSeth Howell		rm -f /tmp/nbdtest
462c9e5d2a6SSeth Howell		if [ "$size" != "0" ]; then
463c9e5d2a6SSeth Howell			return 0
464c9e5d2a6SSeth Howell		else
465c9e5d2a6SSeth Howell			sleep 0.1
466c9e5d2a6SSeth Howell		fi
467c9e5d2a6SSeth Howell	done
468c9e5d2a6SSeth Howell
469c9e5d2a6SSeth Howell	return 1
470c9e5d2a6SSeth Howell}
471c9e5d2a6SSeth Howell
472975e4614Spaul lusefunction waitforbdev() {
473975e4614Spaul luse	local bdev_name=$1
474975e4614Spaul luse	local i
475975e4614Spaul luse
476975e4614Spaul luse	for ((i=1; i<=20; i++)); do
477ab854135SBen Walker		if $rpc_py bdev_get_bdevs | jq -r '.[] .name' | grep -qw $bdev_name; then
478975e4614Spaul luse			return 0
479975e4614Spaul luse		fi
480ab854135SBen Walker
481ab854135SBen Walker		if $rpc_py bdev_get_bdevs | jq -r '.[] .aliases' | grep -qw $bdev_name; then
482ab854135SBen Walker			return 0
483ab854135SBen Walker		fi
484ab854135SBen Walker
485ab854135SBen Walker		sleep 0.1
486975e4614Spaul luse	done
487975e4614Spaul luse
488975e4614Spaul luse	return 1
489975e4614Spaul luse}
490975e4614Spaul luse
491c9e5d2a6SSeth Howellfunction killprocess() {
492c9e5d2a6SSeth Howell	# $1 = process pid
493c9e5d2a6SSeth Howell	if [ -z "$1" ]; then
494c9e5d2a6SSeth Howell		exit 1
495c9e5d2a6SSeth Howell	fi
496c9e5d2a6SSeth Howell
497f0a2cc82SKarol Latecki	if kill -0 $1; then
498714a5646SBen Walker		if [ "$(ps --no-headers -o comm= $1)" = "sudo" ]; then
499714a5646SBen Walker			# kill the child process, which is the actual app
500714a5646SBen Walker			# (assume $1 has just one child)
501074df1d8SPawel Kaminski			local child
502074df1d8SPawel Kaminski			child="$(pgrep -P $1)"
503714a5646SBen Walker			echo "killing process with pid $child"
504714a5646SBen Walker			kill $child
505714a5646SBen Walker		else
506c9e5d2a6SSeth Howell			echo "killing process with pid $1"
507c9e5d2a6SSeth Howell			kill $1
508714a5646SBen Walker		fi
509714a5646SBen Walker
510714a5646SBen Walker		# wait for the process regardless if its the dummy sudo one
511714a5646SBen Walker		# or the actual app - it should terminate anyway
512c9e5d2a6SSeth Howell		wait $1
51382f60376SGangCao	else
51482f60376SGangCao		# the process is not there anymore
51582f60376SGangCao		echo "Process with pid $1 is not found"
51682f60376SGangCao		exit 1
517f0a2cc82SKarol Latecki	fi
518c9e5d2a6SSeth Howell}
519c9e5d2a6SSeth Howell
520c9e5d2a6SSeth Howellfunction iscsicleanup() {
521c9e5d2a6SSeth Howell	echo "Cleaning up iSCSI connection"
522c9e5d2a6SSeth Howell	iscsiadm -m node --logout || true
523c9e5d2a6SSeth Howell	iscsiadm -m node -o delete || true
524c9e5d2a6SSeth Howell}
525c9e5d2a6SSeth Howell
526c9e5d2a6SSeth Howellfunction stop_iscsi_service() {
527c9e5d2a6SSeth Howell	if cat /etc/*-release | grep Ubuntu; then
528c9e5d2a6SSeth Howell		service open-iscsi stop
529c9e5d2a6SSeth Howell	else
530c9e5d2a6SSeth Howell		service iscsid stop
531c9e5d2a6SSeth Howell	fi
532c9e5d2a6SSeth Howell}
533c9e5d2a6SSeth Howell
534c9e5d2a6SSeth Howellfunction start_iscsi_service() {
535c9e5d2a6SSeth Howell	if cat /etc/*-release | grep Ubuntu; then
536c9e5d2a6SSeth Howell		service open-iscsi start
537c9e5d2a6SSeth Howell	else
538c9e5d2a6SSeth Howell		service iscsid start
539c9e5d2a6SSeth Howell	fi
540c9e5d2a6SSeth Howell}
541c9e5d2a6SSeth Howell
542c9e5d2a6SSeth Howellfunction rbd_setup() {
5430629b01dSTomasz Zawadzki	# $1 = monitor ip address
5445bafc240STomasz Zawadzki	# $2 = name of the namespace
5450629b01dSTomasz Zawadzki	if [ -z "$1" ]; then
5460629b01dSTomasz Zawadzki		echo "No monitor IP address provided for ceph"
5470629b01dSTomasz Zawadzki		exit 1
5480629b01dSTomasz Zawadzki	fi
5495bafc240STomasz Zawadzki	if [ -n "$2" ]; then
5505bafc240STomasz Zawadzki		if ip netns list | grep "$2"; then
5515bafc240STomasz Zawadzki			NS_CMD="ip netns exec $2"
5525bafc240STomasz Zawadzki		else
5535bafc240STomasz Zawadzki			echo "No namespace $2 exists"
5545bafc240STomasz Zawadzki			exit 1
5555bafc240STomasz Zawadzki		fi
5565bafc240STomasz Zawadzki	fi
5570629b01dSTomasz Zawadzki
558c9e5d2a6SSeth Howell	if hash ceph; then
559397521bdSSeth Howell		export PG_NUM=128
560c9e5d2a6SSeth Howell		export RBD_POOL=rbd
561c9e5d2a6SSeth Howell		export RBD_NAME=foo
5626907c36fSyidong0635		$NS_CMD $rootdir/scripts/ceph/stop.sh || true
5635bafc240STomasz Zawadzki		$NS_CMD $rootdir/scripts/ceph/start.sh $1
564397521bdSSeth Howell
5655bafc240STomasz Zawadzki		$NS_CMD ceph osd pool create $RBD_POOL $PG_NUM || true
5665bafc240STomasz Zawadzki		$NS_CMD rbd create $RBD_NAME --size 1000
567c9e5d2a6SSeth Howell	fi
568c9e5d2a6SSeth Howell}
569c9e5d2a6SSeth Howell
570c9e5d2a6SSeth Howellfunction rbd_cleanup() {
571c9e5d2a6SSeth Howell	if hash ceph; then
572d51ea8deSDaniel Verkamp		$rootdir/scripts/ceph/stop.sh || true
573ab1622aaSKarol Latecki		rm -f /var/tmp/ceph_raw.img
574c9e5d2a6SSeth Howell	fi
575c9e5d2a6SSeth Howell}
576c9e5d2a6SSeth Howell
577c9e5d2a6SSeth Howellfunction start_stub() {
57818f3a22bSJim Harris	# Disable ASLR for multi-process testing.  SPDK does support using DPDK multi-process,
5799d04d0efSJim Harris	# but ASLR can still be unreliable in some cases.
5809d04d0efSJim Harris	# We will reenable it again after multi-process testing is complete in kill_stub()
58118f3a22bSJim Harris	echo 0 > /proc/sys/kernel/randomize_va_space
582c9e5d2a6SSeth Howell	$rootdir/test/app/stub/stub $1 &
583c9e5d2a6SSeth Howell	stubpid=$!
584c9e5d2a6SSeth Howell	echo Waiting for stub to ready for secondary processes...
585c9e5d2a6SSeth Howell	while ! [ -e /var/run/spdk_stub0 ]; do
586c9e5d2a6SSeth Howell		sleep 1s
587c9e5d2a6SSeth Howell	done
588c9e5d2a6SSeth Howell	echo done.
589c9e5d2a6SSeth Howell}
590c9e5d2a6SSeth Howell
591c9e5d2a6SSeth Howellfunction kill_stub() {
592ef6832efSJim Harris	kill $1 $stubpid
593c9e5d2a6SSeth Howell	wait $stubpid
594c9e5d2a6SSeth Howell	rm -f /var/run/spdk_stub0
59518f3a22bSJim Harris	# Re-enable ASLR now that we are done with multi-process testing
59618f3a22bSJim Harris	# Note: "1" enables ASLR w/o randomizing data segments, "2" adds data segment
59718f3a22bSJim Harris	#  randomizing and is the default on all recent Linux kernels
59818f3a22bSJim Harris	echo 2 > /proc/sys/kernel/randomize_va_space
599c9e5d2a6SSeth Howell}
600c9e5d2a6SSeth Howell
601c9e5d2a6SSeth Howellfunction run_test() {
602cb90136cSSeth Howell	if [ $# -le 1 ]; then
603fd17f1aaSSeth Howell		echo "Not enough parameters"
604cb90136cSSeth Howell		echo "usage: run_test test_name test_script [script_params]"
605fd17f1aaSSeth Howell		exit 1
606fd17f1aaSSeth Howell	fi
607fd17f1aaSSeth Howell
6083b660ea8SDarek Stojaczyk	xtrace_disable
60937100484SSeth Howell	local test_name="$1"
61037100484SSeth Howell	shift
6111fafd71bSSeth Howell
612ea781d6dSSeth Howell	if [ -n "$test_domain" ]; then
613ea781d6dSSeth Howell		export test_domain="${test_domain}.${test_name}"
614ea781d6dSSeth Howell	else
615ea781d6dSSeth Howell		export test_domain="$test_name"
616ea781d6dSSeth Howell	fi
617ea781d6dSSeth Howell
6181fafd71bSSeth Howell	timing_enter $test_name
619c9e5d2a6SSeth Howell	echo "************************************"
620cb90136cSSeth Howell	echo "START TEST $test_name"
621c9e5d2a6SSeth Howell	echo "************************************"
6223b660ea8SDarek Stojaczyk	xtrace_restore
623c9e5d2a6SSeth Howell	time "$@"
6243b660ea8SDarek Stojaczyk	xtrace_disable
625c9e5d2a6SSeth Howell	echo "************************************"
626cb90136cSSeth Howell	echo "END TEST $test_name"
627c9e5d2a6SSeth Howell	echo "************************************"
6281fafd71bSSeth Howell	timing_exit $test_name
629ea781d6dSSeth Howell
630ea781d6dSSeth Howell	export test_domain=${test_domain%"$test_name"}
631ea781d6dSSeth Howell	if [ -n "$test_domain" ]; then
632ea781d6dSSeth Howell		export test_domain=${test_domain%?}
633ea781d6dSSeth Howell	fi
634ea781d6dSSeth Howell
635ea781d6dSSeth Howell	if [ -z "$test_domain" ]; then
636ea781d6dSSeth Howell		echo "top_level $test_name" >> $output_dir/test_completions.txt
637ea781d6dSSeth Howell	else
638ea781d6dSSeth Howell		echo "$test_domain $test_name" >> $output_dir/test_completions.txt
639ea781d6dSSeth Howell	fi
6403b660ea8SDarek Stojaczyk	xtrace_restore
641c9e5d2a6SSeth Howell}
642c9e5d2a6SSeth Howell
643c9e5d2a6SSeth Howellfunction print_backtrace() {
644b5d1b4f4SJim Harris	# if errexit is not enabled, don't print a backtrace
645b5d1b4f4SJim Harris	[[ "$-" =~ e ]] || return 0
646b5d1b4f4SJim Harris
6473b660ea8SDarek Stojaczyk	xtrace_disable
648c9e5d2a6SSeth Howell	echo "========== Backtrace start: =========="
649c9e5d2a6SSeth Howell	echo ""
650c9e5d2a6SSeth Howell	for i in $(seq 1 $((${#FUNCNAME[@]} - 1))); do
651c9e5d2a6SSeth Howell		local func="${FUNCNAME[$i]}"
652c9e5d2a6SSeth Howell		local line_nr="${BASH_LINENO[$((i - 1))]}"
653c9e5d2a6SSeth Howell		local src="${BASH_SOURCE[$i]}"
654*1baf379eSMichal Berger		local bt=""
655*1baf379eSMichal Berger
656*1baf379eSMichal Berger		if [[ -f $src ]]; then
657*1baf379eSMichal Berger			bt=$(nl -w 4 -ba -nln $src | grep -B 5 -A 5 "^${line_nr}[^0-9]" | \
658*1baf379eSMichal Berger			  sed "s/^/   /g" | sed "s/^   $line_nr /=> $line_nr /g")
659*1baf379eSMichal Berger		fi
660*1baf379eSMichal Berger
661c9e5d2a6SSeth Howell		echo "in $src:$line_nr -> $func()"
662c9e5d2a6SSeth Howell		echo "     ..."
663*1baf379eSMichal Berger		echo "${bt:-backtrace unavailable}"
664c9e5d2a6SSeth Howell		echo "     ..."
665c9e5d2a6SSeth Howell	done
666c9e5d2a6SSeth Howell	echo ""
667c9e5d2a6SSeth Howell	echo "========== Backtrace end =========="
6683b660ea8SDarek Stojaczyk	xtrace_restore
669c9e5d2a6SSeth Howell	return 0
670c9e5d2a6SSeth Howell}
671c9e5d2a6SSeth Howell
672c9e5d2a6SSeth Howellfunction part_dev_by_gpt () {
673c9e5d2a6SSeth Howell	if [ $(uname -s) = Linux ] && hash sgdisk && modprobe nbd; then
674c9e5d2a6SSeth Howell		conf=$1
675c9e5d2a6SSeth Howell		devname=$2
676c9e5d2a6SSeth Howell		rootdir=$3
677c9e5d2a6SSeth Howell		operation=$4
678c9e5d2a6SSeth Howell		local nbd_path=/dev/nbd0
679c9e5d2a6SSeth Howell		local rpc_server=/var/tmp/spdk-gpt-bdevs.sock
680c9e5d2a6SSeth Howell
681c9e5d2a6SSeth Howell		if [ ! -e $conf ]; then
682c9e5d2a6SSeth Howell			return 1
683c9e5d2a6SSeth Howell		fi
684c9e5d2a6SSeth Howell
685c9e5d2a6SSeth Howell		if [ -z "$operation" ]; then
686c9e5d2a6SSeth Howell			operation="create"
687c9e5d2a6SSeth Howell		fi
688c9e5d2a6SSeth Howell
689c9e5d2a6SSeth Howell		cp $conf ${conf}.gpt
690c9e5d2a6SSeth Howell		echo "[Gpt]" >> ${conf}.gpt
691c9e5d2a6SSeth Howell		echo "  Disable Yes" >> ${conf}.gpt
692c9e5d2a6SSeth Howell
693c9e5d2a6SSeth Howell		$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -c ${conf}.gpt &
694c9e5d2a6SSeth Howell		nbd_pid=$!
695c9e5d2a6SSeth Howell		echo "Process nbd pid: $nbd_pid"
696c9e5d2a6SSeth Howell		waitforlisten $nbd_pid $rpc_server
697c9e5d2a6SSeth Howell
698793d34e5Spaul luse		# Start bdev as an nbd device
699bf9dbae5SPawel Wodkowski		nbd_start_disks "$rpc_server" $devname $nbd_path
700c9e5d2a6SSeth Howell
701c9e5d2a6SSeth Howell		waitfornbd ${nbd_path:5}
702c9e5d2a6SSeth Howell
703c9e5d2a6SSeth Howell		if [ "$operation" = create ]; then
704c9e5d2a6SSeth Howell			parted -s $nbd_path mklabel gpt mkpart first '0%' '50%' mkpart second '50%' '100%'
705c9e5d2a6SSeth Howell
706c9e5d2a6SSeth Howell			# change the GUID to SPDK GUID value
70707fe6a43SSeth Howell			SPDK_GPT_GUID=$(grep SPDK_GPT_PART_TYPE_GUID $rootdir/module/bdev/gpt/gpt.h \
708c9e5d2a6SSeth Howell				| awk -F "(" '{ print $2}' | sed 's/)//g' \
709fb9c4ee6SKarol Latecki				| awk -F ", " '{ print $1 "-" $2 "-" $3 "-" $4 "-" $5}' | sed 's/0x//g')
710c9e5d2a6SSeth Howell			sgdisk -t 1:$SPDK_GPT_GUID $nbd_path
711c9e5d2a6SSeth Howell			sgdisk -t 2:$SPDK_GPT_GUID $nbd_path
712c9e5d2a6SSeth Howell		elif [ "$operation" = reset ]; then
713c9e5d2a6SSeth Howell			# clear the partition table
714c9e5d2a6SSeth Howell			dd if=/dev/zero of=$nbd_path bs=4096 count=8 oflag=direct
715c9e5d2a6SSeth Howell		fi
716c9e5d2a6SSeth Howell
717bf9dbae5SPawel Wodkowski		nbd_stop_disks "$rpc_server" $nbd_path
718d891b398SShuhei Matsumoto
719c9e5d2a6SSeth Howell		killprocess $nbd_pid
720c9e5d2a6SSeth Howell		rm -f ${conf}.gpt
721c9e5d2a6SSeth Howell	fi
722c9e5d2a6SSeth Howell
723c9e5d2a6SSeth Howell	return 0
724c9e5d2a6SSeth Howell}
725c9e5d2a6SSeth Howell
726c9e5d2a6SSeth Howellfunction discover_bdevs()
727c9e5d2a6SSeth Howell{
728c9e5d2a6SSeth Howell	local rootdir=$1
729c9e5d2a6SSeth Howell	local config_file=$2
730c9e5d2a6SSeth Howell	local rpc_server=/var/tmp/spdk-discover-bdevs.sock
731c9e5d2a6SSeth Howell
732c9e5d2a6SSeth Howell	if [ ! -e $config_file ]; then
733c9e5d2a6SSeth Howell		echo "Invalid Configuration File: $config_file"
73439e8a95cSPawel Kaminski		return 1
735c9e5d2a6SSeth Howell	fi
736c9e5d2a6SSeth Howell
737c9e5d2a6SSeth Howell	# Start the bdev service to query for the list of available
738c9e5d2a6SSeth Howell	# bdevs.
73933df76dcSSeth Howell	$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 \
7408e6b1fbdSDariusz Stojaczyk		-c $config_file &>/dev/null &
741c9e5d2a6SSeth Howell	stubpid=$!
742c9e5d2a6SSeth Howell	while ! [ -e /var/run/spdk_bdev0 ]; do
743c9e5d2a6SSeth Howell		sleep 1
744c9e5d2a6SSeth Howell	done
745c9e5d2a6SSeth Howell
746c9e5d2a6SSeth Howell	# Get all of the bdevs
747c9e5d2a6SSeth Howell	if [ -z "$rpc_server" ]; then
7482c49e910SMaciej Wawryk		$rootdir/scripts/rpc.py bdev_get_bdevs
749c9e5d2a6SSeth Howell	else
7502c49e910SMaciej Wawryk		$rootdir/scripts/rpc.py -s "$rpc_server" bdev_get_bdevs
751c9e5d2a6SSeth Howell	fi
752c9e5d2a6SSeth Howell
753c9e5d2a6SSeth Howell	# Shut down the bdev service
754c9e5d2a6SSeth Howell	kill $stubpid
755c9e5d2a6SSeth Howell	wait $stubpid
756c9e5d2a6SSeth Howell	rm -f /var/run/spdk_bdev0
757c9e5d2a6SSeth Howell}
758c9e5d2a6SSeth Howell
75953147e0dSMaciej Wawrykfunction waitforserial()
76053147e0dSMaciej Wawryk{
76153147e0dSMaciej Wawryk	local i=0
76253147e0dSMaciej Wawryk	local nvme_device_counter=1
76353147e0dSMaciej Wawryk	if [[ -n "$2" ]]; then
76453147e0dSMaciej Wawryk		nvme_device_counter=$2
76553147e0dSMaciej Wawryk	fi
76653147e0dSMaciej Wawryk
76753147e0dSMaciej Wawryk	while [ $(lsblk -l -o NAME,SERIAL | grep -c $1) -lt $nvme_device_counter ]; do
76853147e0dSMaciej Wawryk		[ $i -lt 15 ] || break
76953147e0dSMaciej Wawryk		i=$((i+1))
77053147e0dSMaciej Wawryk		echo "Waiting for devices"
77153147e0dSMaciej Wawryk		sleep 1
77253147e0dSMaciej Wawryk	done
77353147e0dSMaciej Wawryk
77453147e0dSMaciej Wawryk	if [[ $(lsblk -l -o NAME,SERIAL | grep -c $1) -lt $nvme_device_counter ]]; then
77553147e0dSMaciej Wawryk		return 1
77653147e0dSMaciej Wawryk	fi
77753147e0dSMaciej Wawryk
77853147e0dSMaciej Wawryk        return 0
77953147e0dSMaciej Wawryk}
78053147e0dSMaciej Wawryk
78153147e0dSMaciej Wawrykfunction waitforserial_disconnect()
78253147e0dSMaciej Wawryk{
78353147e0dSMaciej Wawryk	local i=0
78453147e0dSMaciej Wawryk	while lsblk -o NAME,SERIAL | grep -q -w $1; do
78553147e0dSMaciej Wawryk		[ $i -lt 15 ] || break
78653147e0dSMaciej Wawryk		i=$((i+1))
78753147e0dSMaciej Wawryk		echo "Waiting for disconnect devices"
78853147e0dSMaciej Wawryk		sleep 1
78953147e0dSMaciej Wawryk	done
79053147e0dSMaciej Wawryk
79153147e0dSMaciej Wawryk	if lsblk -l -o NAME | grep -q -w $1; then
79253147e0dSMaciej Wawryk		return 1
79353147e0dSMaciej Wawryk	fi
79453147e0dSMaciej Wawryk
79553147e0dSMaciej Wawryk	return 0
79653147e0dSMaciej Wawryk}
79753147e0dSMaciej Wawryk
798e3263286SSeth Howellfunction waitforblk()
799e3263286SSeth Howell{
800e3263286SSeth Howell	local i=0
801e3263286SSeth Howell	while ! lsblk -l -o NAME | grep -q -w $1; do
802e3263286SSeth Howell		[ $i -lt 15 ] || break
8030f0cd0a8SKarol Latecki		i=$((i+1))
804e3263286SSeth Howell		sleep 1
805e3263286SSeth Howell	done
806e3263286SSeth Howell
807e3263286SSeth Howell	if ! lsblk -l -o NAME | grep -q -w $1; then
808e3263286SSeth Howell		return 1
809e3263286SSeth Howell	fi
810e3263286SSeth Howell
811e3263286SSeth Howell	return 0
812e3263286SSeth Howell}
813e3263286SSeth Howell
8145232a73fSSeth Howellfunction waitforblk_disconnect()
8155232a73fSSeth Howell{
8165232a73fSSeth Howell	local i=0
8175232a73fSSeth Howell	while lsblk -l -o NAME | grep -q -w $1; do
8185232a73fSSeth Howell		[ $i -lt 15 ] || break
8190f0cd0a8SKarol Latecki		i=$((i+1))
8205232a73fSSeth Howell		sleep 1
8215232a73fSSeth Howell	done
8225232a73fSSeth Howell
8235232a73fSSeth Howell	if lsblk -l -o NAME | grep -q -w $1; then
8245232a73fSSeth Howell		return 1
8255232a73fSSeth Howell	fi
8265232a73fSSeth Howell
8275232a73fSSeth Howell	return 0
8285232a73fSSeth Howell}
8295232a73fSSeth Howell
830b118729fSJim Harrisfunction waitforfile()
831b118729fSJim Harris{
832b118729fSJim Harris	local i=0
833a44c7434STomasz Kulasek	while [ ! -e $1 ]; do
834b118729fSJim Harris		[ $i -lt 200 ] || break
8350f0cd0a8SKarol Latecki		i=$((i+1))
836b118729fSJim Harris		sleep 0.1
837b118729fSJim Harris	done
838b118729fSJim Harris
839a44c7434STomasz Kulasek	if [ ! -e $1 ]; then
840b118729fSJim Harris		return 1
841b118729fSJim Harris	fi
842b118729fSJim Harris
843b118729fSJim Harris	return 0
844b118729fSJim Harris}
845b118729fSJim Harris
846c9e5d2a6SSeth Howellfunction fio_config_gen()
847c9e5d2a6SSeth Howell{
848c9e5d2a6SSeth Howell	local config_file=$1
849c9e5d2a6SSeth Howell	local workload=$2
8503fbc84d3SGangCao	local bdev_type=$3
8513fbc84d3SGangCao	local fio_dir="/usr/src/fio"
852c9e5d2a6SSeth Howell
853c9e5d2a6SSeth Howell	if [ -e "$config_file" ]; then
854c9e5d2a6SSeth Howell		echo "Configuration File Already Exists!: $config_file"
85539e8a95cSPawel Kaminski		return 1
856c9e5d2a6SSeth Howell	fi
857c9e5d2a6SSeth Howell
858c9e5d2a6SSeth Howell	if [ -z "$workload" ]; then
859c9e5d2a6SSeth Howell		workload=randrw
860c9e5d2a6SSeth Howell	fi
861c9e5d2a6SSeth Howell
862c9e5d2a6SSeth Howell	touch $1
863c9e5d2a6SSeth Howell
864c9e5d2a6SSeth Howell	cat > $1 << EOL
865c9e5d2a6SSeth Howell[global]
866c9e5d2a6SSeth Howellthread=1
867c9e5d2a6SSeth Howellgroup_reporting=1
868c9e5d2a6SSeth Howelldirect=1
869c9e5d2a6SSeth Howellnorandommap=1
870c9e5d2a6SSeth Howellpercentile_list=50:99:99.9:99.99:99.999
871c9e5d2a6SSeth Howelltime_based=1
872c9e5d2a6SSeth Howellramp_time=0
873c9e5d2a6SSeth HowellEOL
874c9e5d2a6SSeth Howell
875c9e5d2a6SSeth Howell	if [ "$workload" == "verify" ]; then
87602925187SMaciej Wawryk		cat <<- EOL >> $config_file
87702925187SMaciej Wawryk		verify=sha1
87802925187SMaciej Wawryk		verify_backlog=1024
87902925187SMaciej Wawryk		rw=randwrite
88002925187SMaciej Wawryk		EOL
8813fbc84d3SGangCao
8823fbc84d3SGangCao		# To avoid potential data race issue due to the AIO device
8833fbc84d3SGangCao		# flush mechanism, add the flag to serialize the writes.
8843fbc84d3SGangCao		# This is to fix the intermittent IO failure issue of #935
8853fbc84d3SGangCao		if [ "$bdev_type" == "AIO" ]; then
8863fbc84d3SGangCao			if [[ $($fio_dir/fio --version) == *"fio-3"* ]]; then
8873fbc84d3SGangCao				echo "serialize_overlap=1" >> $config_file
8883fbc84d3SGangCao			fi
8893fbc84d3SGangCao		fi
890c9e5d2a6SSeth Howell	elif [ "$workload" == "trim" ]; then
891c9e5d2a6SSeth Howell		echo "rw=trimwrite" >> $config_file
892c9e5d2a6SSeth Howell	else
893c9e5d2a6SSeth Howell		echo "rw=$workload" >> $config_file
894c9e5d2a6SSeth Howell	fi
895c9e5d2a6SSeth Howell}
896c9e5d2a6SSeth Howell
897c9e5d2a6SSeth Howellfunction fio_config_add_job()
898c9e5d2a6SSeth Howell{
899c9e5d2a6SSeth Howell	config_file=$1
900c9e5d2a6SSeth Howell	filename=$2
901c9e5d2a6SSeth Howell
902c9e5d2a6SSeth Howell	if [ ! -e "$config_file" ]; then
903c9e5d2a6SSeth Howell		echo "Configuration File Doesn't Exist: $config_file"
90439e8a95cSPawel Kaminski		return 1
905c9e5d2a6SSeth Howell	fi
906c9e5d2a6SSeth Howell
907c9e5d2a6SSeth Howell	if [ -z "$filename" ]; then
908c9e5d2a6SSeth Howell		echo "No filename provided"
90939e8a95cSPawel Kaminski		return 1
910c9e5d2a6SSeth Howell	fi
911c9e5d2a6SSeth Howell
912c9e5d2a6SSeth Howell	echo "[job_$filename]" >> $config_file
913c9e5d2a6SSeth Howell	echo "filename=$filename" >> $config_file
914c9e5d2a6SSeth Howell}
915c9e5d2a6SSeth Howell
9163b9db6c4STomasz Zawadzkifunction fio_bdev()
9173b9db6c4STomasz Zawadzki{
9183b9db6c4STomasz Zawadzki	# Setup fio binary cmd line
9193b9db6c4STomasz Zawadzki	local fio_dir="/usr/src/fio"
9203b9db6c4STomasz Zawadzki	local bdev_plugin="$rootdir/examples/bdev/fio_plugin/fio_plugin"
9213b9db6c4STomasz Zawadzki
9221bed9c1fSTomasz Zawadzki	# Preload AddressSanitizer library to fio if fio_plugin was compiled with it
923074df1d8SPawel Kaminski	local asan_lib
924074df1d8SPawel Kaminski	asan_lib=$(ldd $bdev_plugin | grep libasan | awk '{print $3}')
9251bed9c1fSTomasz Zawadzki
9261db9e184SMaciej Wawryk	LD_PRELOAD="$asan_lib $bdev_plugin" "$fio_dir"/fio "$@"
9273b9db6c4STomasz Zawadzki}
9283b9db6c4STomasz Zawadzki
9293b9db6c4STomasz Zawadzkifunction fio_nvme()
9303b9db6c4STomasz Zawadzki{
9313b9db6c4STomasz Zawadzki	# Setup fio binary cmd line
9323b9db6c4STomasz Zawadzki	local fio_dir="/usr/src/fio"
9333b9db6c4STomasz Zawadzki	local nvme_plugin="$rootdir/examples/nvme/fio_plugin/fio_plugin"
9343b9db6c4STomasz Zawadzki
9351bed9c1fSTomasz Zawadzki	# Preload AddressSanitizer library to fio if fio_plugin was compiled with it
9361bed9c1fSTomasz Zawadzki	asan_lib=$(ldd $nvme_plugin | grep libasan | awk '{print $3}')
9371bed9c1fSTomasz Zawadzki
9381db9e184SMaciej Wawryk	LD_PRELOAD="$asan_lib $nvme_plugin" "$fio_dir"/fio "$@"
9393b9db6c4STomasz Zawadzki}
9403b9db6c4STomasz Zawadzki
941c9e5d2a6SSeth Howellfunction get_lvs_free_mb()
942c9e5d2a6SSeth Howell{
943c9e5d2a6SSeth Howell	local lvs_uuid=$1
944074df1d8SPawel Kaminski	local lvs_info
945074df1d8SPawel Kaminski	local fc
946074df1d8SPawel Kaminski	local cs
947074df1d8SPawel Kaminski	lvs_info=$($rpc_py bdev_lvol_get_lvstores)
948074df1d8SPawel Kaminski	fc=$(jq ".[] | select(.uuid==\"$lvs_uuid\") .free_clusters" <<< "$lvs_info")
949074df1d8SPawel Kaminski	cs=$(jq ".[] | select(.uuid==\"$lvs_uuid\") .cluster_size" <<< "$lvs_info")
950c9e5d2a6SSeth Howell
951c9e5d2a6SSeth Howell	# Change to MB's
952c9e5d2a6SSeth Howell	free_mb=$((fc*cs/1024/1024))
953c9e5d2a6SSeth Howell	echo "$free_mb"
954c9e5d2a6SSeth Howell}
955c9e5d2a6SSeth Howell
956c9e5d2a6SSeth Howellfunction get_bdev_size()
957c9e5d2a6SSeth Howell{
958c9e5d2a6SSeth Howell	local bdev_name=$1
959074df1d8SPawel Kaminski	local bdev_info
960074df1d8SPawel Kaminski	local bs
961074df1d8SPawel Kaminski	local nb
962074df1d8SPawel Kaminski	bdev_info=$($rpc_py bdev_get_bdevs -b $bdev_name)
963074df1d8SPawel Kaminski	bs=$(jq ".[] .block_size" <<< "$bdev_info")
964074df1d8SPawel Kaminski	nb=$(jq ".[] .num_blocks" <<< "$bdev_info")
965c9e5d2a6SSeth Howell
966c9e5d2a6SSeth Howell	# Change to MB's
967c9e5d2a6SSeth Howell	bdev_size=$((bs*nb/1024/1024))
968c9e5d2a6SSeth Howell	echo "$bdev_size"
969c9e5d2a6SSeth Howell}
970c9e5d2a6SSeth Howell
971d1f9da82SSeth Howellfunction autotest_cleanup()
972d1f9da82SSeth Howell{
973d1f9da82SSeth Howell	$rootdir/scripts/setup.sh reset
974af32aa1bSKarol Latecki	$rootdir/scripts/setup.sh cleanup
975d63d4d5aSSeth Howell	if [ $(uname -s) = "Linux" ]; then
976d63d4d5aSSeth Howell		if grep -q '#define SPDK_CONFIG_IGB_UIO_DRIVER 1' $rootdir/include/spdk/config.h; then
977d63d4d5aSSeth Howell			rmmod igb_uio
978d63d4d5aSSeth Howell		else
979d63d4d5aSSeth Howell			modprobe -r uio_pci_generic
980d63d4d5aSSeth Howell		fi
981d63d4d5aSSeth Howell	fi
9829fda9814STomasz Zawadzki	rm -rf "$asan_suppression_file"
983d1f9da82SSeth Howell}
984d1f9da82SSeth Howell
98586ee572bSSeth Howellfunction freebsd_update_contigmem_mod()
98686ee572bSSeth Howell{
987fb9c4ee6SKarol Latecki	if [ $(uname) = FreeBSD ]; then
98886ee572bSSeth Howell		kldunload contigmem.ko || true
9891ccc878eSKarol Latecki		if [ -n "$WITH_DPDK_DIR" ]; then
990d68ee5b4SDarek Stojaczyk			echo "Warning: SPDK only works on FreeBSD with patches that only exist in SPDK's dpdk submodule"
991d68ee5b4SDarek Stojaczyk			cp -f "$WITH_DPDK_DIR/kmod/contigmem.ko" /boot/modules/
992d68ee5b4SDarek Stojaczyk			cp -f "$WITH_DPDK_DIR/kmod/contigmem.ko" /boot/kernel/
993d68ee5b4SDarek Stojaczyk		else
994d68ee5b4SDarek Stojaczyk			cp -f "$rootdir/dpdk/build/kmod/contigmem.ko" /boot/modules/
995d68ee5b4SDarek Stojaczyk			cp -f "$rootdir/dpdk/build/kmod/contigmem.ko" /boot/kernel/
996d68ee5b4SDarek Stojaczyk		fi
99786ee572bSSeth Howell	fi
99886ee572bSSeth Howell}
99986ee572bSSeth Howell
100028f4299fSMarcin Dziegielewskifunction get_nvme_name_from_bdf {
100128f4299fSMarcin Dziegielewski	blkname=()
100228f4299fSMarcin Dziegielewski
100328f4299fSMarcin Dziegielewski	nvme_devs=$(lsblk -d --output NAME | grep "^nvme") || true
100428f4299fSMarcin Dziegielewski	if [ -z "$nvme_devs" ]; then
100528f4299fSMarcin Dziegielewski		return
100628f4299fSMarcin Dziegielewski	fi
100728f4299fSMarcin Dziegielewski	for dev in $nvme_devs; do
100828f4299fSMarcin Dziegielewski		link_name=$(readlink /sys/block/$dev/device/device) || true
100928f4299fSMarcin Dziegielewski		if [ -z "$link_name" ]; then
101028f4299fSMarcin Dziegielewski			link_name=$(readlink /sys/block/$dev/device)
101128f4299fSMarcin Dziegielewski		fi
101228f4299fSMarcin Dziegielewski		bdf=$(basename "$link_name")
101328f4299fSMarcin Dziegielewski		if [ "$bdf" = "$1" ]; then
101428f4299fSMarcin Dziegielewski			blkname+=($dev)
101528f4299fSMarcin Dziegielewski		fi
101628f4299fSMarcin Dziegielewski	done
101728f4299fSMarcin Dziegielewski
101828f4299fSMarcin Dziegielewski	printf '%s\n' "${blkname[@]}"
101928f4299fSMarcin Dziegielewski}
102028f4299fSMarcin Dziegielewski
10212176f081SChunyang Huifunction opal_revert_cleanup {
10222176f081SChunyang Hui	$rootdir/app/spdk_tgt/spdk_tgt &
10232176f081SChunyang Hui	spdk_tgt_pid=$!
10242176f081SChunyang Hui	waitforlisten $spdk_tgt_pid
10252176f081SChunyang Hui
10262176f081SChunyang Hui	# OPAL test only runs on the first NVMe device
10272176f081SChunyang Hui	# So we just revert the first one here
10282176f081SChunyang Hui	bdf=$($rootdir/scripts/gen_nvme.sh --json | jq -r '.config[].params | select(.name=="Nvme0").traddr')
10292176f081SChunyang Hui	$rootdir/scripts/rpc.py bdev_nvme_attach_controller -b "nvme0" -t "pcie" -a $bdf
10301a903f9cSBen Walker	# Ignore if this fails.
10311a903f9cSBen Walker	$rootdir/scripts/rpc.py bdev_nvme_opal_revert -b nvme0 -p test || true
10322176f081SChunyang Hui
10332176f081SChunyang Hui	killprocess $spdk_tgt_pid
10342176f081SChunyang Hui}
10352176f081SChunyang Hui
1036c9e5d2a6SSeth Howellset -o errtrace
1037c9e5d2a6SSeth Howelltrap "trap - ERR; print_backtrace >&2" ERR
10387612ac47SDarek Stojaczyk
10397612ac47SDarek StojaczykPS4=' \t	\$ '
10407612ac47SDarek Stojaczykif $SPDK_AUTOTEST_X; then
104139fe5c84SSeth Howell	# explicitly enable xtraces, overriding any tracking information.
104239fe5c84SSeth Howell	unset XTRACE_DISABLED
104339fe5c84SSeth Howell	unset XTRACE_NESTING_LEVEL
10447612ac47SDarek Stojaczyk	set -x
10457612ac47SDarek Stojaczyk	xtrace_enable
10467612ac47SDarek Stojaczykelse
10477612ac47SDarek Stojaczyk	xtrace_restore
10487612ac47SDarek Stojaczykfi
1049