xref: /spdk/test/common/autotest_common.sh (revision 1ccc878e7f83d6982fc97c054ac60cfa72d1be83)
13b660ea8SDarek Stojaczykfunction xtrace_disable() {
23b660ea8SDarek Stojaczyk	PREV_BASH_OPTS="$-"
33b660ea8SDarek Stojaczyk	set +x
43b660ea8SDarek Stojaczyk}
53b660ea8SDarek Stojaczyk
6fadcb08dSDarek Stojaczykxtrace_disable
7fadcb08dSDarek Stojaczykset -e
8fadcb08dSDarek Stojaczykshopt -s expand_aliases
9fadcb08dSDarek Stojaczyk
108d2247e2SDarek Stojaczyk# Dummy function to be called after restoring xtrace just so that it appears in the
118d2247e2SDarek Stojaczyk# xtrace log. This way we can consistently track when xtrace is enabled/disabled.
128d2247e2SDarek Stojaczykfunction xtrace_enable() {
138d2247e2SDarek Stojaczyk	# We have to do something inside a function in bash, and calling any command
148d2247e2SDarek Stojaczyk	# (even `:`) will produce an xtrace entry, so we just define another function.
158d2247e2SDarek Stojaczyk	function xtrace_dummy() { :; }
168d2247e2SDarek Stojaczyk}
178d2247e2SDarek Stojaczyk
18fadcb08dSDarek Stojaczyk# Keep it as alias to avoid xtrace_enable backtrace always pointing to xtrace_restore.
19fadcb08dSDarek Stojaczyk# xtrace_enable will appear as called directly from the user script, from the same line
20fadcb08dSDarek Stojaczyk# that "called" xtrace_restore.
21fadcb08dSDarek Stojaczykalias xtrace_restore='if [[ "$PREV_BASH_OPTS" == *"x"* ]]; then set -x; xtrace_enable; fi'
22c9e5d2a6SSeth Howell
23c9e5d2a6SSeth Howell: ${RUN_NIGHTLY:=0}
24c9e5d2a6SSeth Howellexport RUN_NIGHTLY
25c9e5d2a6SSeth Howell
26b96cf2efSPawel Niedzwiecki: ${RUN_NIGHTLY_FAILING:=0}
27b96cf2efSPawel Niedzwieckiexport RUN_NIGHTLY_FAILING
28b96cf2efSPawel Niedzwiecki
29c9e5d2a6SSeth Howell# Set defaults for missing test config options
300560976dSPawel Niedzwiecki: ${SPDK_BUILD_DOC=0}; export SPDK_BUILD_DOC
310560976dSPawel Niedzwiecki: ${SPDK_BUILD_SHARED_OBJECT=0}; export SPDK_BUILD_SHARED_OBJECT
320560976dSPawel Niedzwiecki: ${SPDK_RUN_CHECK_FORMAT=0}; export SPDK_RUN_CHECK_FORMAT
330560976dSPawel Niedzwiecki: ${SPDK_RUN_SCANBUILD=0}; export SPDK_RUN_SCANBUILD
340560976dSPawel Niedzwiecki: ${SPDK_RUN_VALGRIND=0}; export SPDK_RUN_VALGRIND
350560976dSPawel Niedzwiecki: ${SPDK_RUN_FUNCTIONAL_TEST=0}; export SPDK_RUN_FUNCTIONAL_TEST
360560976dSPawel Niedzwiecki: ${SPDK_TEST_UNITTEST=0}; export SPDK_TEST_UNITTEST
370560976dSPawel Niedzwiecki: ${SPDK_TEST_ISAL=0}; export SPDK_TEST_ISAL
380560976dSPawel Niedzwiecki: ${SPDK_TEST_ISCSI=0}; export SPDK_TEST_ISCSI
390560976dSPawel Niedzwiecki: ${SPDK_TEST_ISCSI_INITIATOR=0}; export SPDK_TEST_ISCSI_INITIATOR
400560976dSPawel Niedzwiecki: ${SPDK_TEST_NVME=0}; export SPDK_TEST_NVME
410560976dSPawel Niedzwiecki: ${SPDK_TEST_NVME_CLI=0}; export SPDK_TEST_NVME_CLI
420560976dSPawel Niedzwiecki: ${SPDK_TEST_NVMF=0}; export SPDK_TEST_NVMF
43d19b101cSSeth Howell: ${SPDK_TEST_NVMF_TRANSPORT="rdma"}; export SPDK_TEST_NVMF_TRANSPORT
440560976dSPawel Niedzwiecki: ${SPDK_TEST_RBD=0}; export SPDK_TEST_RBD
450560976dSPawel Niedzwiecki: ${SPDK_TEST_VHOST=0}; export SPDK_TEST_VHOST
460560976dSPawel Niedzwiecki: ${SPDK_TEST_BLOCKDEV=0}; export SPDK_TEST_BLOCKDEV
470560976dSPawel Niedzwiecki: ${SPDK_TEST_IOAT=0}; export SPDK_TEST_IOAT
480560976dSPawel Niedzwiecki: ${SPDK_TEST_EVENT=0}; export SPDK_TEST_EVENT
490560976dSPawel Niedzwiecki: ${SPDK_TEST_BLOBFS=0}; export SPDK_TEST_BLOBFS
500560976dSPawel Niedzwiecki: ${SPDK_TEST_VHOST_INIT=0}; export SPDK_TEST_VHOST_INIT
510560976dSPawel Niedzwiecki: ${SPDK_TEST_PMDK=0}; export SPDK_TEST_PMDK
520560976dSPawel Niedzwiecki: ${SPDK_TEST_LVOL=0}; export SPDK_TEST_LVOL
530560976dSPawel Niedzwiecki: ${SPDK_TEST_JSON=0}; export SPDK_TEST_JSON
540560976dSPawel Niedzwiecki: ${SPDK_TEST_REDUCE=0}; export SPDK_TEST_REDUCE
5514a62d67STomasz Kulasek: ${SPDK_TEST_VPP=0}; export SPDK_TEST_VPP
560560976dSPawel Niedzwiecki: ${SPDK_RUN_ASAN=0}; export SPDK_RUN_ASAN
570560976dSPawel Niedzwiecki: ${SPDK_RUN_UBSAN=0}; export SPDK_RUN_UBSAN
580560976dSPawel Niedzwiecki: ${SPDK_RUN_INSTALLED_DPDK=0}; export SPDK_RUN_INSTALLED_DPDK
590560976dSPawel Niedzwiecki: ${SPDK_TEST_CRYPTO=0}; export SPDK_TEST_CRYPTO
60ef2e614cSWojciech Malikowski: ${SPDK_TEST_FTL=0}; export SPDK_TEST_FTL
61ca558b61SWojciech Malikowski: ${SPDK_TEST_BDEV_FTL=0}; export SPDK_TEST_BDEV_FTL
620560976dSPawel Niedzwiecki: ${SPDK_TEST_OCF=0}; export SPDK_TEST_OCF
630699216fSWojciech Malikowski: ${SPDK_TEST_FTL_EXTENDED=0}; export SPDK_TEST_FTL_EXTENDED
641d717c7cSWojciech Malikowski: ${SPDK_TEST_VMD=0}; export SPDK_TEST_VMD
657612ac47SDarek Stojaczyk: ${SPDK_AUTOTEST_X=true}; export SPDK_AUTOTEST_X
66c9e5d2a6SSeth Howell
6705dde5c2STomasz Zawadzki# Export PYTHONPATH with addition of RPC framework. New scripts can be created
6805dde5c2STomasz Zawadzki# specific use cases for tests.
6905dde5c2STomasz Zawadzkiexport PYTHONPATH=$PYTHONPATH:$rootdir/scripts
7005dde5c2STomasz Zawadzki
71f40d2451SSeth Howell# Export flag to skip the known bug that exists in librados
72f40d2451SSeth Howell# Bug is reported on ceph bug tracker with number 24078
73f40d2451SSeth Howellexport ASAN_OPTIONS=new_delete_type_mismatch=0
74f40d2451SSeth Howellexport UBSAN_OPTIONS='halt_on_error=1:print_stacktrace=1:abort_on_error=1'
75f40d2451SSeth Howell
769fda9814STomasz Zawadzki# Export LeakSanitizer option to use suppression file in order to prevent false positives
779fda9814STomasz Zawadzki# and known leaks in external executables or libraries from showing up.
789fda9814STomasz Zawadzkiasan_suppression_file="/var/tmp/asan_suppression_file"
799fda9814STomasz Zawadzkisudo rm -rf "$asan_suppression_file"
809fda9814STomasz Zawadzki
819fda9814STomasz Zawadzki# ASAN has some bugs around thread_local variables.  We have a destructor in place
829fda9814STomasz Zawadzki# to free the thread contexts, but ASAN complains about the leak before those
839fda9814STomasz Zawadzki# destructors have a chance to run.  So suppress this one specific leak using
849fda9814STomasz Zawadzki# LSAN_OPTIONS.
859fda9814STomasz Zawadzkiecho "leak:spdk_fs_alloc_thread_ctx" >> "$asan_suppression_file"
869fda9814STomasz Zawadzki
871bed9c1fSTomasz Zawadzki# Suppress known leaks in fio project
881bed9c1fSTomasz Zawadzkiecho "leak:/usr/src/fio/parse.c" >> "$asan_suppression_file"
891bed9c1fSTomasz Zawadzkiecho "leak:/usr/src/fio/iolog.c" >> "$asan_suppression_file"
901bed9c1fSTomasz Zawadzkiecho "leak:/usr/src/fio/init.c" >> "$asan_suppression_file"
911bed9c1fSTomasz Zawadzki
921891f2e5STomasz Zawadzki# Suppress leaks in libiscsi
931891f2e5STomasz Zawadzkiecho "leak:libiscsi.so" >> "$asan_suppression_file"
941891f2e5STomasz Zawadzki
959fda9814STomasz Zawadzkiexport LSAN_OPTIONS=suppressions="$asan_suppression_file"
969fda9814STomasz Zawadzki
97f40d2451SSeth Howellexport DEFAULT_RPC_ADDR="/var/tmp/spdk.sock"
98f40d2451SSeth Howell
99f04277f0SJohn Meneghiniif [ -z "$DEPENDENCY_DIR" ]; then
100f04277f0SJohn Meneghini	export DEPENDENCY_DIR=/home/sys_sgsw
101f04277f0SJohn Meneghinielse
102f04277f0SJohn Meneghini	export DEPENDENCY_DIR
103f04277f0SJohn Meneghinifi
104f04277f0SJohn Meneghini
105c9e5d2a6SSeth Howell# pass our valgrind desire on to unittest.sh
106c9e5d2a6SSeth Howellif [ $SPDK_RUN_VALGRIND -eq 0 ]; then
107c9e5d2a6SSeth Howell	export valgrind=''
108c9e5d2a6SSeth Howellfi
109c9e5d2a6SSeth Howell
110f40d2451SSeth Howellif [ "$(uname -s)" = "Linux" ]; then
111f40d2451SSeth Howell	MAKE=make
112f40d2451SSeth Howell	MAKEFLAGS=${MAKEFLAGS:--j$(nproc)}
113f40d2451SSeth Howell	DPDK_LINUX_DIR=/usr/share/dpdk/x86_64-default-linuxapp-gcc
114f40d2451SSeth Howell	if [ -d $DPDK_LINUX_DIR ] && [ $SPDK_RUN_INSTALLED_DPDK -eq 1 ]; then
115f40d2451SSeth Howell		WITH_DPDK_DIR=$DPDK_LINUX_DIR
116f40d2451SSeth Howell	fi
117f40d2451SSeth Howell	# Override the default HUGEMEM in scripts/setup.sh to allocate 8GB in hugepages.
118f40d2451SSeth Howell	export HUGEMEM=8192
119f40d2451SSeth Howellelif [ "$(uname -s)" = "FreeBSD" ]; then
120f40d2451SSeth Howell	MAKE=gmake
121772eb8ebSKarol Latecki	MAKEFLAGS=${MAKEFLAGS:--j$(sysctl -a | grep -E -i 'hw.ncpu' | awk '{print $2}')}
122f40d2451SSeth Howell	DPDK_FREEBSD_DIR=/usr/local/share/dpdk/x86_64-native-bsdapp-clang
123f40d2451SSeth Howell	if [ -d $DPDK_FREEBSD_DIR ] && [ $SPDK_RUN_INSTALLED_DPDK -eq 1 ]; then
124f40d2451SSeth Howell		WITH_DPDK_DIR=$DPDK_FREEBSD_DIR
125f40d2451SSeth Howell	fi
126f40d2451SSeth Howell	# FreeBSD runs a much more limited set of tests, so keep the default 2GB.
127f40d2451SSeth Howell	export HUGEMEM=2048
128f40d2451SSeth Howellelse
129f40d2451SSeth Howell	echo "Unknown OS \"$(uname -s)\""
130f40d2451SSeth Howell	exit 1
131f40d2451SSeth Howellfi
132f40d2451SSeth Howell
133c9e5d2a6SSeth Howellconfig_params='--enable-debug --enable-werror'
134c9e5d2a6SSeth Howell
135848daf27SPawel Wodkowskiif echo -e "#include <libunwind.h>\nint main(int argc, char *argv[]) {return 0;}\n" | \
136848daf27SPawel Wodkowski	gcc -o /dev/null -lunwind -x c - 2>/dev/null; then
137ae2b2f64SPawel Wodkowski	config_params+=' --enable-log-bt'
138848daf27SPawel Wodkowskifi
139848daf27SPawel Wodkowski
1408a43cd27Spaul luse# for options with dependencies but no test flag, set them here
1418a43cd27Spaul luseif [ -f /usr/include/infiniband/verbs.h ]; then
1428a43cd27Spaul luse	config_params+=' --with-rdma'
1438a43cd27Spaul lusefi
1448a43cd27Spaul luse
1458a43cd27Spaul luseif [ -d /usr/src/fio ]; then
1468a43cd27Spaul luse	config_params+=' --with-fio=/usr/src/fio'
1478a43cd27Spaul lusefi
1488a43cd27Spaul luse
1498a43cd27Spaul luseif [ -d ${DEPENDENCY_DIR}/vtune_codes ]; then
1508a43cd27Spaul luse	config_params+=' --with-vtune='${DEPENDENCY_DIR}'/vtune_codes'
1518a43cd27Spaul lusefi
1528a43cd27Spaul luse
1538a43cd27Spaul luseif [ -d /usr/include/iscsi ]; then
154fb9c4ee6SKarol 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}')
1558a43cd27Spaul luse	if [ $libiscsi_version -ge 20150621 ]; then
1568a43cd27Spaul luse		config_params+=' --with-iscsi-initiator'
1578a43cd27Spaul luse	fi
1588a43cd27Spaul lusefi
1598a43cd27Spaul luse
1608a43cd27Spaul luse# for options with both dependencies and a test flag, set them here
1618a43cd27Spaul luseif [ -f /usr/include/libpmemblk.h ] && [ $SPDK_TEST_PMDK -eq 1 ]; then
1628a43cd27Spaul luse	config_params+=' --with-pmdk'
1638a43cd27Spaul lusefi
1648a43cd27Spaul luse
1658a43cd27Spaul luseif [ -f /usr/include/libpmem.h ] && [ $SPDK_TEST_REDUCE -eq 1 ]; then
1668a43cd27Spaul luse	if [ $SPDK_TEST_ISAL -eq 1 ]; then
1678a43cd27Spaul luse		config_params+=' --with-reduce'
1688a43cd27Spaul luse	else
1698a43cd27Spaul luse		echo "reduce not enabled because isal is not enabled."
1708a43cd27Spaul luse	fi
1718a43cd27Spaul lusefi
1728a43cd27Spaul luse
1738a43cd27Spaul luseif [ -d /usr/include/rbd ] &&  [ -d /usr/include/rados ] && [ $SPDK_TEST_RBD -eq 1 ]; then
1748a43cd27Spaul luse	if [ $SPDK_TEST_ISAL -eq 0 ]; then
1758a43cd27Spaul luse		config_params+=' --with-rbd'
1768a43cd27Spaul luse	else
1778a43cd27Spaul luse		echo "rbd not enabled because isal is enabled."
1788a43cd27Spaul luse	fi
1798a43cd27Spaul lusefi
1808a43cd27Spaul luse
18114a62d67STomasz Kulasekif [ $SPDK_TEST_VPP -eq 1 ]; then
1829307ff5aSTomasz Kulasek	VPP_PATH="/usr/local/src/vpp-19.04/build-root/install-vpp_debug-native/vpp/"
18314a62d67STomasz Kulasek	export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${VPP_PATH}/lib/
18414a62d67STomasz Kulasek	export PATH=${PATH}:${VPP_PATH}/bin/
18514a62d67STomasz Kulasek	config_params+=" --with-vpp=${VPP_PATH}"
18614a62d67STomasz Kulasekfi
18714a62d67STomasz Kulasek
1888a43cd27Spaul luse# for options with no required dependencies, just test flags, set them here
18951606ed4SPaul Luseif [ $SPDK_TEST_CRYPTO -eq 1 ]; then
19051606ed4SPaul Luse	config_params+=' --with-crypto'
19151606ed4SPaul Lusefi
19251606ed4SPaul Luse
1932fde729fSVitaliy Mysakif [ $SPDK_TEST_OCF -eq 1 ]; then
19434bdceabSVitaliy Mysak	config_params+=" --with-ocf"
1952fde729fSVitaliy Mysakfi
1962fde729fSVitaliy Mysak
197e20401c8SDarek Stojaczykif [ $SPDK_RUN_UBSAN -eq 1 ]; then
198e20401c8SDarek Stojaczyk	config_params+=' --enable-ubsan'
199e20401c8SDarek Stojaczykfi
200e20401c8SDarek Stojaczyk
201e20401c8SDarek Stojaczykif [ $SPDK_RUN_ASAN -eq 1 ]; then
202e20401c8SDarek Stojaczyk	config_params+=' --enable-asan'
203e20401c8SDarek Stojaczykfi
204e20401c8SDarek Stojaczyk
20585e70f4eSDarek Stojaczykif [ "$(uname -s)" = "Linux" ]; then
206c9e5d2a6SSeth Howell	config_params+=' --enable-coverage'
20785e70f4eSDarek Stojaczykfi
208c9e5d2a6SSeth Howell
2098a43cd27Spaul luseif [ $SPDK_TEST_ISAL -eq 0 ]; then
2108a43cd27Spaul luse	config_params+=' --without-isal'
2118a43cd27Spaul lusefi
2128a43cd27Spaul luse
213c9e5d2a6SSeth Howell# By default, --with-dpdk is not set meaning the SPDK build will use the DPDK submodule.
214c9e5d2a6SSeth Howell# If a DPDK installation is found in a well-known location though, WITH_DPDK_DIR will be
215c9e5d2a6SSeth Howell# set which will override the default and use that DPDK installation instead.
216*1ccc878eSKarol Lateckiif [ -n "$WITH_DPDK_DIR" ]; then
217c9e5d2a6SSeth Howell	config_params+=" --with-dpdk=$WITH_DPDK_DIR"
218c9e5d2a6SSeth Howellfi
219c9e5d2a6SSeth Howell
220c9e5d2a6SSeth Howellexport config_params
221c9e5d2a6SSeth Howell
222c9e5d2a6SSeth Howellif [ -z "$output_dir" ]; then
223c9e5d2a6SSeth Howell	if [ -z "$rootdir" ] || [ ! -d "$rootdir/../output" ]; then
224c9e5d2a6SSeth Howell		output_dir=.
225c9e5d2a6SSeth Howell	else
226c9e5d2a6SSeth Howell		output_dir=$rootdir/../output
227c9e5d2a6SSeth Howell	fi
228c9e5d2a6SSeth Howell	export output_dir
229c9e5d2a6SSeth Howellfi
230c9e5d2a6SSeth Howell
2316a8a1b6bSJim HarrisTEST_MODE=
2326a8a1b6bSJim Harrisfor i in "$@"; do
2336a8a1b6bSJim Harris	case "$i" in
2346a8a1b6bSJim Harris		--iso)
2356a8a1b6bSJim Harris			TEST_MODE=iso
2366a8a1b6bSJim Harris			;;
2376a8a1b6bSJim Harris		--transport=*)
2386a8a1b6bSJim Harris			TEST_TRANSPORT="${i#*=}"
2396a8a1b6bSJim Harris			;;
2406a8a1b6bSJim Harris		--sock=*)
2416a8a1b6bSJim Harris			TEST_SOCK="${i#*=}"
2426a8a1b6bSJim Harris			;;
2436a8a1b6bSJim Harris	esac
2446a8a1b6bSJim Harrisdone
2456a8a1b6bSJim Harris
246c9e5d2a6SSeth Howellfunction timing() {
247c9e5d2a6SSeth Howell	direction="$1"
248c9e5d2a6SSeth Howell	testname="$2"
249c9e5d2a6SSeth Howell
250c9e5d2a6SSeth Howell	now=$(date +%s)
251c9e5d2a6SSeth Howell
252c9e5d2a6SSeth Howell	if [ "$direction" = "enter" ]; then
253c9e5d2a6SSeth Howell		export timing_stack="${timing_stack};${now}"
254c9e5d2a6SSeth Howell		export test_stack="${test_stack};${testname}"
255c9e5d2a6SSeth Howell	else
2567c00bdabSDarek Stojaczyk		touch "$output_dir/timing.txt"
257c9e5d2a6SSeth Howell		child_time=$(grep "^${test_stack:1};" $output_dir/timing.txt | awk '{s+=$2} END {print s}')
258c9e5d2a6SSeth Howell
259c9e5d2a6SSeth Howell		start_time=$(echo "$timing_stack" | sed -e 's@^.*;@@')
260c9e5d2a6SSeth Howell		timing_stack=$(echo "$timing_stack" | sed -e 's@;[^;]*$@@')
261c9e5d2a6SSeth Howell
262c9e5d2a6SSeth Howell		elapsed=$((now - start_time - child_time))
263c9e5d2a6SSeth Howell		echo "${test_stack:1} $elapsed" >> $output_dir/timing.txt
264c9e5d2a6SSeth Howell
265c9e5d2a6SSeth Howell		test_stack=$(echo "$test_stack" | sed -e 's@;[^;]*$@@')
266c9e5d2a6SSeth Howell	fi
267c9e5d2a6SSeth Howell}
268c9e5d2a6SSeth Howell
269c9e5d2a6SSeth Howellfunction timing_enter() {
2703b660ea8SDarek Stojaczyk	xtrace_disable
271c9e5d2a6SSeth Howell	timing "enter" "$1"
2723b660ea8SDarek Stojaczyk	xtrace_restore
273c9e5d2a6SSeth Howell}
274c9e5d2a6SSeth Howell
275c9e5d2a6SSeth Howellfunction timing_exit() {
2763b660ea8SDarek Stojaczyk	xtrace_disable
277c9e5d2a6SSeth Howell	timing "exit" "$1"
2783b660ea8SDarek Stojaczyk	xtrace_restore
279c9e5d2a6SSeth Howell}
280c9e5d2a6SSeth Howell
281c9e5d2a6SSeth Howellfunction timing_finish() {
282c9e5d2a6SSeth Howell	flamegraph='/usr/local/FlameGraph/flamegraph.pl'
283c9e5d2a6SSeth Howell	if [ -x "$flamegraph" ]; then
284c9e5d2a6SSeth Howell		"$flamegraph" \
285c9e5d2a6SSeth Howell			--title 'Build Timing' \
286c9e5d2a6SSeth Howell			--nametype 'Step:' \
287c9e5d2a6SSeth Howell			--countname seconds \
288c9e5d2a6SSeth Howell			$output_dir/timing.txt \
289c9e5d2a6SSeth Howell			>$output_dir/timing.svg
290c9e5d2a6SSeth Howell	fi
291c9e5d2a6SSeth Howell}
292c9e5d2a6SSeth Howell
293a562812dSSeth Howellfunction create_test_list() {
294ca558b61SWojciech Malikowski	grep -rshI --exclude="autotest_common.sh" --exclude="$rootdir/test/common/autotest_common.sh" -e "report_test_completion" $rootdir | sed 's/report_test_completion//g; s/[[:blank:]]//g; s/"//g;' > $output_dir/all_tests.txt || true
295a562812dSSeth Howell}
296a562812dSSeth Howell
297a562812dSSeth Howellfunction report_test_completion() {
298a562812dSSeth Howell	echo "$1" >> $output_dir/test_completions.txt
299a562812dSSeth Howell}
300a562812dSSeth Howell
301c9e5d2a6SSeth Howellfunction process_core() {
302c9e5d2a6SSeth Howell	ret=0
303ae11723aSPiotr Pelplinski	for core in $(find . -type f \( -name 'core\.?[0-9]*' -o -name '*.core' \)); do
304c9e5d2a6SSeth Howell		exe=$(eu-readelf -n "$core" | grep psargs | sed "s/.*psargs: \([^ \'\" ]*\).*/\1/")
305b606baabSKarol Latecki		if [[ ! -f "$exe" ]]; then
306b606baabSKarol Latecki			exe=$(eu-readelf -n "$core" | grep -oP -m1 "$exe.+")
307b606baabSKarol Latecki		fi
308c9e5d2a6SSeth Howell		echo "exe for $core is $exe"
309*1ccc878eSKarol Latecki		if [[ -n "$exe" ]]; then
310005e18a8SDarek Stojaczyk			if hash gdb &>/dev/null; then
311c9e5d2a6SSeth Howell				gdb -batch -ex "thread apply all bt full" $exe $core
312c9e5d2a6SSeth Howell			fi
313c9e5d2a6SSeth Howell			cp $exe $output_dir
314c9e5d2a6SSeth Howell		fi
315c9e5d2a6SSeth Howell		mv $core $output_dir
316c9e5d2a6SSeth Howell		chmod a+r $output_dir/$core
317c9e5d2a6SSeth Howell		ret=1
318c9e5d2a6SSeth Howell	done
319c9e5d2a6SSeth Howell	return $ret
320c9e5d2a6SSeth Howell}
321c9e5d2a6SSeth Howell
322af32aa1bSKarol Lateckifunction process_shm() {
323af32aa1bSKarol Latecki	type=$1
324af32aa1bSKarol Latecki	id=$2
325af32aa1bSKarol Latecki	if [ "$type" = "--pid" ]; then
326af32aa1bSKarol Latecki		id="pid${id}"
327af32aa1bSKarol Latecki	elif [ "$type" = "--id" ]; then
328af32aa1bSKarol Latecki		id="${id}"
329af32aa1bSKarol Latecki	else
330af32aa1bSKarol Latecki		echo "Please specify to search for pid or shared memory id."
331af32aa1bSKarol Latecki		return 1
332af32aa1bSKarol Latecki	fi
333af32aa1bSKarol Latecki
334af32aa1bSKarol Latecki	shm_files=$(find /dev/shm -name "*.${id}" -printf "%f\n")
335af32aa1bSKarol Latecki
336af32aa1bSKarol Latecki	if [[ -z $shm_files ]]; then
337af32aa1bSKarol Latecki		echo "SHM File for specified PID or shared memory id: ${id} not found!"
338af32aa1bSKarol Latecki		return 1
339af32aa1bSKarol Latecki	fi
340af32aa1bSKarol Latecki	for n in $shm_files; do
341af32aa1bSKarol Latecki		tar -C /dev/shm/ -cvzf $output_dir/${n}_shm.tar.gz ${n}
342af32aa1bSKarol Latecki	done
343af32aa1bSKarol Latecki	return 0
344af32aa1bSKarol Latecki}
345af32aa1bSKarol Latecki
346c9e5d2a6SSeth Howellfunction waitforlisten() {
347c9e5d2a6SSeth Howell	# $1 = process pid
348c9e5d2a6SSeth Howell	if [ -z "$1" ]; then
349c9e5d2a6SSeth Howell		exit 1
350c9e5d2a6SSeth Howell	fi
351c9e5d2a6SSeth Howell
352f751ea17SPawel Wodkowski	local rpc_addr="${2:-$DEFAULT_RPC_ADDR}"
353c9e5d2a6SSeth Howell
354c9e5d2a6SSeth Howell	echo "Waiting for process to start up and listen on UNIX domain socket $rpc_addr..."
355c9e5d2a6SSeth Howell	# turn off trace for this loop
3563b660ea8SDarek Stojaczyk	xtrace_disable
357f751ea17SPawel Wodkowski	local ret=0
358db1236efSPawel Wodkowski	local i
359db1236efSPawel Wodkowski	for (( i = 40; i != 0; i-- )); do
360c9e5d2a6SSeth Howell		# if the process is no longer running, then exit the script
361c9e5d2a6SSeth Howell		#  since it means the application crashed
362c9e5d2a6SSeth Howell		if ! kill -s 0 $1; then
363db1236efSPawel Wodkowski			echo "ERROR: process (pid: $1) is no longer running"
364f751ea17SPawel Wodkowski			ret=1
365f751ea17SPawel Wodkowski			break
366c9e5d2a6SSeth Howell		fi
3675bafc240STomasz Zawadzki
3686ee44c69SJim Harris		if $rootdir/scripts/rpc.py -t 1 -s "$rpc_addr" rpc_get_methods &>/dev/null; then
369db1236efSPawel Wodkowski			break
370c9e5d2a6SSeth Howell		fi
37182583134SDarek Stojaczyk
372db1236efSPawel Wodkowski		sleep 0.5
373c9e5d2a6SSeth Howell	done
374f751ea17SPawel Wodkowski
3753b660ea8SDarek Stojaczyk	xtrace_restore
376db1236efSPawel Wodkowski	if (( i == 0 )); then
377db1236efSPawel Wodkowski		echo "ERROR: timeout while waiting for process (pid: $1) to start listening on '$rpc_addr'"
378db1236efSPawel Wodkowski		ret=1
379f751ea17SPawel Wodkowski	fi
380db1236efSPawel Wodkowski	return $ret
381c9e5d2a6SSeth Howell}
382c9e5d2a6SSeth Howell
383c9e5d2a6SSeth Howellfunction waitfornbd() {
384bf9dbae5SPawel Wodkowski	local nbd_name=$1
385bf9dbae5SPawel Wodkowski	local i
386c9e5d2a6SSeth Howell
387c9e5d2a6SSeth Howell	for ((i=1; i<=20; i++)); do
388c9e5d2a6SSeth Howell		if grep -q -w $nbd_name /proc/partitions; then
389c9e5d2a6SSeth Howell			break
390c9e5d2a6SSeth Howell		else
391c9e5d2a6SSeth Howell			sleep 0.1
392c9e5d2a6SSeth Howell		fi
393c9e5d2a6SSeth Howell	done
394c9e5d2a6SSeth Howell
395c9e5d2a6SSeth Howell	# The nbd device is now recognized as a block device, but there can be
396c9e5d2a6SSeth Howell	#  a small delay before we can start I/O to that block device.  So loop
397c9e5d2a6SSeth Howell	#  here trying to read the first block of the nbd block device to a temp
398c9e5d2a6SSeth Howell	#  file.  Note that dd returns success when reading an empty file, so we
399c9e5d2a6SSeth Howell	#  need to check the size of the output file instead.
400c9e5d2a6SSeth Howell	for ((i=1; i<=20; i++)); do
401c9e5d2a6SSeth Howell		dd if=/dev/$nbd_name of=/tmp/nbdtest bs=4096 count=1 iflag=direct
402fb9c4ee6SKarol Latecki		size=$(stat -c %s /tmp/nbdtest)
403c9e5d2a6SSeth Howell		rm -f /tmp/nbdtest
404c9e5d2a6SSeth Howell		if [ "$size" != "0" ]; then
405c9e5d2a6SSeth Howell			return 0
406c9e5d2a6SSeth Howell		else
407c9e5d2a6SSeth Howell			sleep 0.1
408c9e5d2a6SSeth Howell		fi
409c9e5d2a6SSeth Howell	done
410c9e5d2a6SSeth Howell
411c9e5d2a6SSeth Howell	return 1
412c9e5d2a6SSeth Howell}
413c9e5d2a6SSeth Howell
414975e4614Spaul lusefunction waitforbdev() {
415975e4614Spaul luse	local bdev_name=$1
416975e4614Spaul luse	local i
417975e4614Spaul luse
418975e4614Spaul luse	for ((i=1; i<=20; i++)); do
419975e4614Spaul luse		if ! $rpc_py get_bdevs | jq -r '.[] .name' | grep -qw $bdev_name; then
420975e4614Spaul luse			sleep 0.1
421975e4614Spaul luse		else
422975e4614Spaul luse			return 0
423975e4614Spaul luse		fi
424975e4614Spaul luse	done
425975e4614Spaul luse
426975e4614Spaul luse	return 1
427975e4614Spaul luse}
428975e4614Spaul luse
429c9e5d2a6SSeth Howellfunction killprocess() {
430c9e5d2a6SSeth Howell	# $1 = process pid
431c9e5d2a6SSeth Howell	if [ -z "$1" ]; then
432c9e5d2a6SSeth Howell		exit 1
433c9e5d2a6SSeth Howell	fi
434c9e5d2a6SSeth Howell
435f0a2cc82SKarol Latecki	if kill -0 $1; then
436c9e5d2a6SSeth Howell		echo "killing process with pid $1"
437c9e5d2a6SSeth Howell		kill $1
438c9e5d2a6SSeth Howell		wait $1
439f0a2cc82SKarol Latecki	fi
440c9e5d2a6SSeth Howell}
441c9e5d2a6SSeth Howell
442c9e5d2a6SSeth Howellfunction iscsicleanup() {
443c9e5d2a6SSeth Howell	echo "Cleaning up iSCSI connection"
444c9e5d2a6SSeth Howell	iscsiadm -m node --logout || true
445c9e5d2a6SSeth Howell	iscsiadm -m node -o delete || true
446c9e5d2a6SSeth Howell}
447c9e5d2a6SSeth Howell
448c9e5d2a6SSeth Howellfunction stop_iscsi_service() {
449c9e5d2a6SSeth Howell	if cat /etc/*-release | grep Ubuntu; then
450c9e5d2a6SSeth Howell		service open-iscsi stop
451c9e5d2a6SSeth Howell	else
452c9e5d2a6SSeth Howell		service iscsid stop
453c9e5d2a6SSeth Howell	fi
454c9e5d2a6SSeth Howell}
455c9e5d2a6SSeth Howell
456c9e5d2a6SSeth Howellfunction start_iscsi_service() {
457c9e5d2a6SSeth Howell	if cat /etc/*-release | grep Ubuntu; then
458c9e5d2a6SSeth Howell		service open-iscsi start
459c9e5d2a6SSeth Howell	else
460c9e5d2a6SSeth Howell		service iscsid start
461c9e5d2a6SSeth Howell	fi
462c9e5d2a6SSeth Howell}
463c9e5d2a6SSeth Howell
464c9e5d2a6SSeth Howellfunction rbd_setup() {
4650629b01dSTomasz Zawadzki	# $1 = monitor ip address
4665bafc240STomasz Zawadzki	# $2 = name of the namespace
4670629b01dSTomasz Zawadzki	if [ -z "$1" ]; then
4680629b01dSTomasz Zawadzki		echo "No monitor IP address provided for ceph"
4690629b01dSTomasz Zawadzki		exit 1
4700629b01dSTomasz Zawadzki	fi
4715bafc240STomasz Zawadzki	if [ -n "$2" ]; then
4725bafc240STomasz Zawadzki		if ip netns list | grep "$2"; then
4735bafc240STomasz Zawadzki			NS_CMD="ip netns exec $2"
4745bafc240STomasz Zawadzki		else
4755bafc240STomasz Zawadzki			echo "No namespace $2 exists"
4765bafc240STomasz Zawadzki			exit 1
4775bafc240STomasz Zawadzki		fi
4785bafc240STomasz Zawadzki	fi
4790629b01dSTomasz Zawadzki
480c9e5d2a6SSeth Howell	if hash ceph; then
481397521bdSSeth Howell		export PG_NUM=128
482c9e5d2a6SSeth Howell		export RBD_POOL=rbd
483c9e5d2a6SSeth Howell		export RBD_NAME=foo
4846907c36fSyidong0635		$NS_CMD $rootdir/scripts/ceph/stop.sh || true
4855bafc240STomasz Zawadzki		$NS_CMD $rootdir/scripts/ceph/start.sh $1
486397521bdSSeth Howell
4875bafc240STomasz Zawadzki		$NS_CMD ceph osd pool create $RBD_POOL $PG_NUM || true
4885bafc240STomasz Zawadzki		$NS_CMD rbd create $RBD_NAME --size 1000
489c9e5d2a6SSeth Howell	fi
490c9e5d2a6SSeth Howell}
491c9e5d2a6SSeth Howell
492c9e5d2a6SSeth Howellfunction rbd_cleanup() {
493c9e5d2a6SSeth Howell	if hash ceph; then
494d51ea8deSDaniel Verkamp		$rootdir/scripts/ceph/stop.sh || true
495ab1622aaSKarol Latecki		rm -f /var/tmp/ceph_raw.img
496c9e5d2a6SSeth Howell	fi
497c9e5d2a6SSeth Howell}
498c9e5d2a6SSeth Howell
499c9e5d2a6SSeth Howellfunction start_stub() {
50018f3a22bSJim Harris	# Disable ASLR for multi-process testing.  SPDK does support using DPDK multi-process,
5019d04d0efSJim Harris	# but ASLR can still be unreliable in some cases.
5029d04d0efSJim Harris	# We will reenable it again after multi-process testing is complete in kill_stub()
50318f3a22bSJim Harris	echo 0 > /proc/sys/kernel/randomize_va_space
504c9e5d2a6SSeth Howell	$rootdir/test/app/stub/stub $1 &
505c9e5d2a6SSeth Howell	stubpid=$!
506c9e5d2a6SSeth Howell	echo Waiting for stub to ready for secondary processes...
507c9e5d2a6SSeth Howell	while ! [ -e /var/run/spdk_stub0 ]; do
508c9e5d2a6SSeth Howell		sleep 1s
509c9e5d2a6SSeth Howell	done
510c9e5d2a6SSeth Howell	echo done.
511c9e5d2a6SSeth Howell}
512c9e5d2a6SSeth Howell
513c9e5d2a6SSeth Howellfunction kill_stub() {
514ef6832efSJim Harris	kill $1 $stubpid
515c9e5d2a6SSeth Howell	wait $stubpid
516c9e5d2a6SSeth Howell	rm -f /var/run/spdk_stub0
51718f3a22bSJim Harris	# Re-enable ASLR now that we are done with multi-process testing
51818f3a22bSJim Harris	# Note: "1" enables ASLR w/o randomizing data segments, "2" adds data segment
51918f3a22bSJim Harris	#  randomizing and is the default on all recent Linux kernels
52018f3a22bSJim Harris	echo 2 > /proc/sys/kernel/randomize_va_space
521c9e5d2a6SSeth Howell}
522c9e5d2a6SSeth Howell
523c9e5d2a6SSeth Howellfunction run_test() {
5243b660ea8SDarek Stojaczyk	xtrace_disable
5251f0bff73SChen Wang	local test_type="$(echo $1 | tr 'a-z' 'A-Z')"
5261f0bff73SChen Wang	shift
527c9e5d2a6SSeth Howell	echo "************************************"
5281f0bff73SChen Wang	echo "START TEST $test_type $@"
529c9e5d2a6SSeth Howell	echo "************************************"
5303b660ea8SDarek Stojaczyk	xtrace_restore
531c9e5d2a6SSeth Howell	time "$@"
5323b660ea8SDarek Stojaczyk	xtrace_disable
533c9e5d2a6SSeth Howell	echo "************************************"
5341f0bff73SChen Wang	echo "END TEST $test_type $@"
535c9e5d2a6SSeth Howell	echo "************************************"
5363b660ea8SDarek Stojaczyk	xtrace_restore
537c9e5d2a6SSeth Howell}
538c9e5d2a6SSeth Howell
539c9e5d2a6SSeth Howellfunction print_backtrace() {
540b5d1b4f4SJim Harris	# if errexit is not enabled, don't print a backtrace
541b5d1b4f4SJim Harris	[[ "$-" =~ e ]] || return 0
542b5d1b4f4SJim Harris
5433b660ea8SDarek Stojaczyk	xtrace_disable
544c9e5d2a6SSeth Howell	echo "========== Backtrace start: =========="
545c9e5d2a6SSeth Howell	echo ""
546c9e5d2a6SSeth Howell	for i in $(seq 1 $((${#FUNCNAME[@]} - 1))); do
547c9e5d2a6SSeth Howell		local func="${FUNCNAME[$i]}"
548c9e5d2a6SSeth Howell		local line_nr="${BASH_LINENO[$((i - 1))]}"
549c9e5d2a6SSeth Howell		local src="${BASH_SOURCE[$i]}"
550c9e5d2a6SSeth Howell		echo "in $src:$line_nr -> $func()"
551c9e5d2a6SSeth Howell		echo "     ..."
552c9e5d2a6SSeth Howell		nl -w 4 -ba -nln $src | grep -B 5 -A 5 "^$line_nr[^0-9]" | \
553c9e5d2a6SSeth Howell			sed "s/^/   /g" | sed "s/^   $line_nr /=> $line_nr /g"
554c9e5d2a6SSeth Howell		echo "     ..."
555c9e5d2a6SSeth Howell	done
556c9e5d2a6SSeth Howell	echo ""
557c9e5d2a6SSeth Howell	echo "========== Backtrace end =========="
5583b660ea8SDarek Stojaczyk	xtrace_restore
559c9e5d2a6SSeth Howell	return 0
560c9e5d2a6SSeth Howell}
561c9e5d2a6SSeth Howell
562c9e5d2a6SSeth Howellfunction part_dev_by_gpt () {
563c9e5d2a6SSeth Howell	if [ $(uname -s) = Linux ] && hash sgdisk && modprobe nbd; then
564c9e5d2a6SSeth Howell		conf=$1
565c9e5d2a6SSeth Howell		devname=$2
566c9e5d2a6SSeth Howell		rootdir=$3
567c9e5d2a6SSeth Howell		operation=$4
568c9e5d2a6SSeth Howell		local nbd_path=/dev/nbd0
569c9e5d2a6SSeth Howell		local rpc_server=/var/tmp/spdk-gpt-bdevs.sock
570c9e5d2a6SSeth Howell
571c9e5d2a6SSeth Howell		if [ ! -e $conf ]; then
572c9e5d2a6SSeth Howell			return 1
573c9e5d2a6SSeth Howell		fi
574c9e5d2a6SSeth Howell
575c9e5d2a6SSeth Howell		if [ -z "$operation" ]; then
576c9e5d2a6SSeth Howell			operation="create"
577c9e5d2a6SSeth Howell		fi
578c9e5d2a6SSeth Howell
579c9e5d2a6SSeth Howell		cp $conf ${conf}.gpt
580c9e5d2a6SSeth Howell		echo "[Gpt]" >> ${conf}.gpt
581c9e5d2a6SSeth Howell		echo "  Disable Yes" >> ${conf}.gpt
582c9e5d2a6SSeth Howell
583c9e5d2a6SSeth Howell		$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -c ${conf}.gpt &
584c9e5d2a6SSeth Howell		nbd_pid=$!
585c9e5d2a6SSeth Howell		echo "Process nbd pid: $nbd_pid"
586c9e5d2a6SSeth Howell		waitforlisten $nbd_pid $rpc_server
587c9e5d2a6SSeth Howell
588c9e5d2a6SSeth Howell		# Start bdev as a nbd device
589bf9dbae5SPawel Wodkowski		nbd_start_disks "$rpc_server" $devname $nbd_path
590c9e5d2a6SSeth Howell
591c9e5d2a6SSeth Howell		waitfornbd ${nbd_path:5}
592c9e5d2a6SSeth Howell
593c9e5d2a6SSeth Howell		if [ "$operation" = create ]; then
594c9e5d2a6SSeth Howell			parted -s $nbd_path mklabel gpt mkpart first '0%' '50%' mkpart second '50%' '100%'
595c9e5d2a6SSeth Howell
596c9e5d2a6SSeth Howell			# change the GUID to SPDK GUID value
597fb9c4ee6SKarol Latecki			SPDK_GPT_GUID=$(grep SPDK_GPT_PART_TYPE_GUID $rootdir/lib/bdev/gpt/gpt.h \
598c9e5d2a6SSeth Howell				| awk -F "(" '{ print $2}' | sed 's/)//g' \
599fb9c4ee6SKarol Latecki				| awk -F ", " '{ print $1 "-" $2 "-" $3 "-" $4 "-" $5}' | sed 's/0x//g')
600c9e5d2a6SSeth Howell			sgdisk -t 1:$SPDK_GPT_GUID $nbd_path
601c9e5d2a6SSeth Howell			sgdisk -t 2:$SPDK_GPT_GUID $nbd_path
602c9e5d2a6SSeth Howell		elif [ "$operation" = reset ]; then
603c9e5d2a6SSeth Howell			# clear the partition table
604c9e5d2a6SSeth Howell			dd if=/dev/zero of=$nbd_path bs=4096 count=8 oflag=direct
605c9e5d2a6SSeth Howell		fi
606c9e5d2a6SSeth Howell
607bf9dbae5SPawel Wodkowski		nbd_stop_disks "$rpc_server" $nbd_path
608d891b398SShuhei Matsumoto
609c9e5d2a6SSeth Howell		killprocess $nbd_pid
610c9e5d2a6SSeth Howell		rm -f ${conf}.gpt
611c9e5d2a6SSeth Howell	fi
612c9e5d2a6SSeth Howell
613c9e5d2a6SSeth Howell	return 0
614c9e5d2a6SSeth Howell}
615c9e5d2a6SSeth Howell
616c9e5d2a6SSeth Howellfunction discover_bdevs()
617c9e5d2a6SSeth Howell{
618c9e5d2a6SSeth Howell	local rootdir=$1
619c9e5d2a6SSeth Howell	local config_file=$2
620c9e5d2a6SSeth Howell	local rpc_server=/var/tmp/spdk-discover-bdevs.sock
621c9e5d2a6SSeth Howell
622c9e5d2a6SSeth Howell	if [ ! -e $config_file ]; then
623c9e5d2a6SSeth Howell		echo "Invalid Configuration File: $config_file"
624c9e5d2a6SSeth Howell		return -1
625c9e5d2a6SSeth Howell	fi
626c9e5d2a6SSeth Howell
627c9e5d2a6SSeth Howell	# Start the bdev service to query for the list of available
628c9e5d2a6SSeth Howell	# bdevs.
62933df76dcSSeth Howell	$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 \
6308e6b1fbdSDariusz Stojaczyk		-c $config_file &>/dev/null &
631c9e5d2a6SSeth Howell	stubpid=$!
632c9e5d2a6SSeth Howell	while ! [ -e /var/run/spdk_bdev0 ]; do
633c9e5d2a6SSeth Howell		sleep 1
634c9e5d2a6SSeth Howell	done
635c9e5d2a6SSeth Howell
636c9e5d2a6SSeth Howell	# Get all of the bdevs
637c9e5d2a6SSeth Howell	if [ -z "$rpc_server" ]; then
638c9e5d2a6SSeth Howell		$rootdir/scripts/rpc.py get_bdevs
639c9e5d2a6SSeth Howell	else
640c9e5d2a6SSeth Howell		$rootdir/scripts/rpc.py -s "$rpc_server" get_bdevs
641c9e5d2a6SSeth Howell	fi
642c9e5d2a6SSeth Howell
643c9e5d2a6SSeth Howell	# Shut down the bdev service
644c9e5d2a6SSeth Howell	kill $stubpid
645c9e5d2a6SSeth Howell	wait $stubpid
646c9e5d2a6SSeth Howell	rm -f /var/run/spdk_bdev0
647c9e5d2a6SSeth Howell}
648c9e5d2a6SSeth Howell
649e3263286SSeth Howellfunction waitforblk()
650e3263286SSeth Howell{
651e3263286SSeth Howell	local i=0
652e3263286SSeth Howell	while ! lsblk -l -o NAME | grep -q -w $1; do
653e3263286SSeth Howell		[ $i -lt 15 ] || break
654e3263286SSeth Howell		i=$[$i+1]
655e3263286SSeth Howell		sleep 1
656e3263286SSeth Howell	done
657e3263286SSeth Howell
658e3263286SSeth Howell	if ! lsblk -l -o NAME | grep -q -w $1; then
659e3263286SSeth Howell		return 1
660e3263286SSeth Howell	fi
661e3263286SSeth Howell
662e3263286SSeth Howell	return 0
663e3263286SSeth Howell}
664e3263286SSeth Howell
6655232a73fSSeth Howellfunction waitforblk_disconnect()
6665232a73fSSeth Howell{
6675232a73fSSeth Howell	local i=0
6685232a73fSSeth Howell	while lsblk -l -o NAME | grep -q -w $1; do
6695232a73fSSeth Howell		[ $i -lt 15 ] || break
6705232a73fSSeth Howell		i=$[$i+1]
6715232a73fSSeth Howell		sleep 1
6725232a73fSSeth Howell	done
6735232a73fSSeth Howell
6745232a73fSSeth Howell	if lsblk -l -o NAME | grep -q -w $1; then
6755232a73fSSeth Howell		return 1
6765232a73fSSeth Howell	fi
6775232a73fSSeth Howell
6785232a73fSSeth Howell	return 0
6795232a73fSSeth Howell}
6805232a73fSSeth Howell
681b118729fSJim Harrisfunction waitforfile()
682b118729fSJim Harris{
683b118729fSJim Harris	local i=0
684a44c7434STomasz Kulasek	while [ ! -e $1 ]; do
685b118729fSJim Harris		[ $i -lt 200 ] || break
686b118729fSJim Harris		i=$[$i+1]
687b118729fSJim Harris		sleep 0.1
688b118729fSJim Harris	done
689b118729fSJim Harris
690a44c7434STomasz Kulasek	if [ ! -e $1 ]; then
691b118729fSJim Harris		return 1
692b118729fSJim Harris	fi
693b118729fSJim Harris
694b118729fSJim Harris	return 0
695b118729fSJim Harris}
696b118729fSJim Harris
697c9e5d2a6SSeth Howellfunction fio_config_gen()
698c9e5d2a6SSeth Howell{
699c9e5d2a6SSeth Howell	local config_file=$1
700c9e5d2a6SSeth Howell	local workload=$2
701c9e5d2a6SSeth Howell
702c9e5d2a6SSeth Howell	if [ -e "$config_file" ]; then
703c9e5d2a6SSeth Howell		echo "Configuration File Already Exists!: $config_file"
704c9e5d2a6SSeth Howell		return -1
705c9e5d2a6SSeth Howell	fi
706c9e5d2a6SSeth Howell
707c9e5d2a6SSeth Howell	if [ -z "$workload" ]; then
708c9e5d2a6SSeth Howell		workload=randrw
709c9e5d2a6SSeth Howell	fi
710c9e5d2a6SSeth Howell
711c9e5d2a6SSeth Howell	touch $1
712c9e5d2a6SSeth Howell
713c9e5d2a6SSeth Howell	cat > $1 << EOL
714c9e5d2a6SSeth Howell[global]
715c9e5d2a6SSeth Howellthread=1
716c9e5d2a6SSeth Howellgroup_reporting=1
717c9e5d2a6SSeth Howelldirect=1
718c9e5d2a6SSeth Howellnorandommap=1
719c9e5d2a6SSeth Howellpercentile_list=50:99:99.9:99.99:99.999
720c9e5d2a6SSeth Howelltime_based=1
721c9e5d2a6SSeth Howellramp_time=0
722c9e5d2a6SSeth HowellEOL
723c9e5d2a6SSeth Howell
724c9e5d2a6SSeth Howell	if [ "$workload" == "verify" ]; then
725c9e5d2a6SSeth Howell		echo "verify=sha1" >> $config_file
726c9e5d2a6SSeth Howell		echo "rw=randwrite" >> $config_file
727c9e5d2a6SSeth Howell	elif [ "$workload" == "trim" ]; then
728c9e5d2a6SSeth Howell		echo "rw=trimwrite" >> $config_file
729c9e5d2a6SSeth Howell	else
730c9e5d2a6SSeth Howell		echo "rw=$workload" >> $config_file
731c9e5d2a6SSeth Howell	fi
732c9e5d2a6SSeth Howell}
733c9e5d2a6SSeth Howell
734c9e5d2a6SSeth Howellfunction fio_config_add_job()
735c9e5d2a6SSeth Howell{
736c9e5d2a6SSeth Howell	config_file=$1
737c9e5d2a6SSeth Howell	filename=$2
738c9e5d2a6SSeth Howell
739c9e5d2a6SSeth Howell	if [ ! -e "$config_file" ]; then
740c9e5d2a6SSeth Howell		echo "Configuration File Doesn't Exist: $config_file"
741c9e5d2a6SSeth Howell		return -1
742c9e5d2a6SSeth Howell	fi
743c9e5d2a6SSeth Howell
744c9e5d2a6SSeth Howell	if [ -z "$filename" ]; then
745c9e5d2a6SSeth Howell		echo "No filename provided"
746c9e5d2a6SSeth Howell		return -1
747c9e5d2a6SSeth Howell	fi
748c9e5d2a6SSeth Howell
749c9e5d2a6SSeth Howell	echo "[job_$filename]" >> $config_file
750c9e5d2a6SSeth Howell	echo "filename=$filename" >> $config_file
751c9e5d2a6SSeth Howell}
752c9e5d2a6SSeth Howell
7533b9db6c4STomasz Zawadzkifunction fio_bdev()
7543b9db6c4STomasz Zawadzki{
7553b9db6c4STomasz Zawadzki	# Setup fio binary cmd line
7563b9db6c4STomasz Zawadzki	local fio_dir="/usr/src/fio"
7573b9db6c4STomasz Zawadzki	local bdev_plugin="$rootdir/examples/bdev/fio_plugin/fio_plugin"
7583b9db6c4STomasz Zawadzki
7591bed9c1fSTomasz Zawadzki	# Preload AddressSanitizer library to fio if fio_plugin was compiled with it
7601bed9c1fSTomasz Zawadzki	local asan_lib=$(ldd $bdev_plugin | grep libasan | awk '{print $3}')
7611bed9c1fSTomasz Zawadzki
7621bed9c1fSTomasz Zawadzki	LD_PRELOAD=""$asan_lib" "$bdev_plugin"" "$fio_dir"/fio "$@"
7633b9db6c4STomasz Zawadzki}
7643b9db6c4STomasz Zawadzki
7653b9db6c4STomasz Zawadzkifunction fio_nvme()
7663b9db6c4STomasz Zawadzki{
7673b9db6c4STomasz Zawadzki	# Setup fio binary cmd line
7683b9db6c4STomasz Zawadzki	local fio_dir="/usr/src/fio"
7693b9db6c4STomasz Zawadzki	local nvme_plugin="$rootdir/examples/nvme/fio_plugin/fio_plugin"
7703b9db6c4STomasz Zawadzki
7711bed9c1fSTomasz Zawadzki	# Preload AddressSanitizer library to fio if fio_plugin was compiled with it
7721bed9c1fSTomasz Zawadzki	asan_lib=$(ldd $nvme_plugin | grep libasan | awk '{print $3}')
7731bed9c1fSTomasz Zawadzki
7741bed9c1fSTomasz Zawadzki	LD_PRELOAD=""$asan_lib" "$nvme_plugin"" "$fio_dir"/fio "$@"
7753b9db6c4STomasz Zawadzki}
7763b9db6c4STomasz Zawadzki
777c9e5d2a6SSeth Howellfunction get_lvs_free_mb()
778c9e5d2a6SSeth Howell{
779c9e5d2a6SSeth Howell	local lvs_uuid=$1
780c9e5d2a6SSeth Howell	local lvs_info=$($rpc_py get_lvol_stores)
781c9e5d2a6SSeth Howell	local fc=$(jq ".[] | select(.uuid==\"$lvs_uuid\") .free_clusters" <<< "$lvs_info")
782c9e5d2a6SSeth Howell	local cs=$(jq ".[] | select(.uuid==\"$lvs_uuid\") .cluster_size" <<< "$lvs_info")
783c9e5d2a6SSeth Howell
784c9e5d2a6SSeth Howell	# Change to MB's
785c9e5d2a6SSeth Howell	free_mb=$((fc*cs/1024/1024))
786c9e5d2a6SSeth Howell	echo "$free_mb"
787c9e5d2a6SSeth Howell}
788c9e5d2a6SSeth Howell
789c9e5d2a6SSeth Howellfunction get_bdev_size()
790c9e5d2a6SSeth Howell{
791c9e5d2a6SSeth Howell	local bdev_name=$1
792c9e5d2a6SSeth Howell	local bdev_info=$($rpc_py get_bdevs -b $bdev_name)
793c9e5d2a6SSeth Howell	local bs=$(jq ".[] .block_size" <<< "$bdev_info")
794c9e5d2a6SSeth Howell	local nb=$(jq ".[] .num_blocks" <<< "$bdev_info")
795c9e5d2a6SSeth Howell
796c9e5d2a6SSeth Howell	# Change to MB's
797c9e5d2a6SSeth Howell	bdev_size=$((bs*nb/1024/1024))
798c9e5d2a6SSeth Howell	echo "$bdev_size"
799c9e5d2a6SSeth Howell}
800c9e5d2a6SSeth Howell
801d1f9da82SSeth Howellfunction autotest_cleanup()
802d1f9da82SSeth Howell{
803d1f9da82SSeth Howell	$rootdir/scripts/setup.sh reset
804af32aa1bSKarol Latecki	$rootdir/scripts/setup.sh cleanup
805d63d4d5aSSeth Howell	if [ $(uname -s) = "Linux" ]; then
806d63d4d5aSSeth Howell		if grep -q '#define SPDK_CONFIG_IGB_UIO_DRIVER 1' $rootdir/include/spdk/config.h; then
807d63d4d5aSSeth Howell			rmmod igb_uio
808d63d4d5aSSeth Howell		else
809d63d4d5aSSeth Howell			modprobe -r uio_pci_generic
810d63d4d5aSSeth Howell		fi
811d63d4d5aSSeth Howell	fi
8129fda9814STomasz Zawadzki	rm -rf "$asan_suppression_file"
813d1f9da82SSeth Howell}
814d1f9da82SSeth Howell
81586ee572bSSeth Howellfunction freebsd_update_contigmem_mod()
81686ee572bSSeth Howell{
817fb9c4ee6SKarol Latecki	if [ $(uname) = FreeBSD ]; then
81886ee572bSSeth Howell		kldunload contigmem.ko || true
819*1ccc878eSKarol Latecki		if [ -n "$WITH_DPDK_DIR" ]; then
820d68ee5b4SDarek Stojaczyk			echo "Warning: SPDK only works on FreeBSD with patches that only exist in SPDK's dpdk submodule"
821d68ee5b4SDarek Stojaczyk			cp -f "$WITH_DPDK_DIR/kmod/contigmem.ko" /boot/modules/
822d68ee5b4SDarek Stojaczyk			cp -f "$WITH_DPDK_DIR/kmod/contigmem.ko" /boot/kernel/
823d68ee5b4SDarek Stojaczyk		else
824d68ee5b4SDarek Stojaczyk			cp -f "$rootdir/dpdk/build/kmod/contigmem.ko" /boot/modules/
825d68ee5b4SDarek Stojaczyk			cp -f "$rootdir/dpdk/build/kmod/contigmem.ko" /boot/kernel/
826d68ee5b4SDarek Stojaczyk		fi
82786ee572bSSeth Howell	fi
82886ee572bSSeth Howell}
82986ee572bSSeth Howell
830c9e5d2a6SSeth Howellset -o errtrace
831c9e5d2a6SSeth Howelltrap "trap - ERR; print_backtrace >&2" ERR
8327612ac47SDarek Stojaczyk
8337612ac47SDarek StojaczykPS4=' \t	\$ '
8347612ac47SDarek Stojaczykif $SPDK_AUTOTEST_X; then
8357612ac47SDarek Stojaczyk	# explicitly enable xtraces
8367612ac47SDarek Stojaczyk	set -x
8377612ac47SDarek Stojaczyk	xtrace_enable
8387612ac47SDarek Stojaczykelse
8397612ac47SDarek Stojaczyk	xtrace_restore
8407612ac47SDarek Stojaczykfi
841