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 818b9303dSMichal Berger shopt -u extdebug 939fe5c84SSeth Howell elif [ -z $XTRACE_NESTING_LEVEL ]; then 1039fe5c84SSeth Howell XTRACE_NESTING_LEVEL=1 1139fe5c84SSeth Howell else 1239fe5c84SSeth Howell XTRACE_NESTING_LEVEL=$((++XTRACE_NESTING_LEVEL)) 13190b2245SSeth Howell fi 143b660ea8SDarek Stojaczyk} 153b660ea8SDarek Stojaczyk 16fadcb08dSDarek Stojaczykxtrace_disable 17fadcb08dSDarek Stojaczykset -e 18fadcb08dSDarek Stojaczykshopt -s expand_aliases 19fadcb08dSDarek Stojaczyk 208d2247e2SDarek Stojaczyk# Dummy function to be called after restoring xtrace just so that it appears in the 218d2247e2SDarek Stojaczyk# xtrace log. This way we can consistently track when xtrace is enabled/disabled. 228d2247e2SDarek Stojaczykfunction xtrace_enable() { 238d2247e2SDarek Stojaczyk # We have to do something inside a function in bash, and calling any command 248d2247e2SDarek Stojaczyk # (even `:`) will produce an xtrace entry, so we just define another function. 258d2247e2SDarek Stojaczyk function xtrace_dummy() { :; } 268d2247e2SDarek Stojaczyk} 278d2247e2SDarek Stojaczyk 28fadcb08dSDarek Stojaczyk# Keep it as alias to avoid xtrace_enable backtrace always pointing to xtrace_restore. 29fadcb08dSDarek Stojaczyk# xtrace_enable will appear as called directly from the user script, from the same line 30fadcb08dSDarek Stojaczyk# that "called" xtrace_restore. 3139fe5c84SSeth Howellalias xtrace_restore=\ 3239fe5c84SSeth Howell'if [ -z $XTRACE_NESTING_LEVEL ]; then 3339fe5c84SSeth Howell if [[ "$PREV_BASH_OPTS" == *"x"* ]]; then 3418b9303dSMichal Berger XTRACE_DISABLED="no"; PREV_BASH_OPTS=""; shopt -s extdebug; set -x; xtrace_enable; 3539fe5c84SSeth Howell fi 3639fe5c84SSeth Howellelse 3739fe5c84SSeth Howell XTRACE_NESTING_LEVEL=$((--XTRACE_NESTING_LEVEL)); 3839fe5c84SSeth Howell if [ $XTRACE_NESTING_LEVEL -eq "0" ]; then 3939fe5c84SSeth Howell unset XTRACE_NESTING_LEVEL 4039fe5c84SSeth Howell fi 4139fe5c84SSeth Howellfi' 42c9e5d2a6SSeth Howell 43c9e5d2a6SSeth Howell: ${RUN_NIGHTLY:=0} 44c9e5d2a6SSeth Howellexport RUN_NIGHTLY 45c9e5d2a6SSeth Howell 46b96cf2efSPawel Niedzwiecki: ${RUN_NIGHTLY_FAILING:=0} 47b96cf2efSPawel Niedzwieckiexport RUN_NIGHTLY_FAILING 48b96cf2efSPawel Niedzwiecki 49c9e5d2a6SSeth Howell# Set defaults for missing test config options 500560976dSPawel Niedzwiecki: ${SPDK_BUILD_DOC=0}; export SPDK_BUILD_DOC 519a25fc12STomasz Zawadzki: ${SPDK_BUILD_PACKAGE=0}; export SPDK_BUILD_PACKAGE 520560976dSPawel Niedzwiecki: ${SPDK_BUILD_SHARED_OBJECT=0}; export SPDK_BUILD_SHARED_OBJECT 530560976dSPawel Niedzwiecki: ${SPDK_RUN_VALGRIND=0}; export SPDK_RUN_VALGRIND 540560976dSPawel Niedzwiecki: ${SPDK_RUN_FUNCTIONAL_TEST=0}; export SPDK_RUN_FUNCTIONAL_TEST 550560976dSPawel Niedzwiecki: ${SPDK_TEST_UNITTEST=0}; export SPDK_TEST_UNITTEST 562f476a63SSeth Howell: ${SPDK_TEST_AUTOBUILD=0}; export SPDK_TEST_AUTOBUILD 570560976dSPawel Niedzwiecki: ${SPDK_TEST_ISAL=0}; export SPDK_TEST_ISAL 580560976dSPawel Niedzwiecki: ${SPDK_TEST_ISCSI=0}; export SPDK_TEST_ISCSI 590560976dSPawel Niedzwiecki: ${SPDK_TEST_ISCSI_INITIATOR=0}; export SPDK_TEST_ISCSI_INITIATOR 600560976dSPawel Niedzwiecki: ${SPDK_TEST_NVME=0}; export SPDK_TEST_NVME 610560976dSPawel Niedzwiecki: ${SPDK_TEST_NVME_CLI=0}; export SPDK_TEST_NVME_CLI 62efbcd259STomasz Kulasek: ${SPDK_TEST_NVME_CUSE=0}; export SPDK_TEST_NVME_CUSE 630560976dSPawel Niedzwiecki: ${SPDK_TEST_NVMF=0}; export SPDK_TEST_NVMF 64d19b101cSSeth Howell: ${SPDK_TEST_NVMF_TRANSPORT="rdma"}; export SPDK_TEST_NVMF_TRANSPORT 650560976dSPawel Niedzwiecki: ${SPDK_TEST_RBD=0}; export SPDK_TEST_RBD 660560976dSPawel Niedzwiecki: ${SPDK_TEST_VHOST=0}; export SPDK_TEST_VHOST 670560976dSPawel Niedzwiecki: ${SPDK_TEST_BLOCKDEV=0}; export SPDK_TEST_BLOCKDEV 680560976dSPawel Niedzwiecki: ${SPDK_TEST_IOAT=0}; export SPDK_TEST_IOAT 690560976dSPawel Niedzwiecki: ${SPDK_TEST_EVENT=0}; export SPDK_TEST_EVENT 700560976dSPawel Niedzwiecki: ${SPDK_TEST_BLOBFS=0}; export SPDK_TEST_BLOBFS 710560976dSPawel Niedzwiecki: ${SPDK_TEST_VHOST_INIT=0}; export SPDK_TEST_VHOST_INIT 720560976dSPawel Niedzwiecki: ${SPDK_TEST_PMDK=0}; export SPDK_TEST_PMDK 730560976dSPawel Niedzwiecki: ${SPDK_TEST_LVOL=0}; export SPDK_TEST_LVOL 740560976dSPawel Niedzwiecki: ${SPDK_TEST_JSON=0}; export SPDK_TEST_JSON 750560976dSPawel Niedzwiecki: ${SPDK_TEST_REDUCE=0}; export SPDK_TEST_REDUCE 7614a62d67STomasz Kulasek: ${SPDK_TEST_VPP=0}; export SPDK_TEST_VPP 770560976dSPawel Niedzwiecki: ${SPDK_RUN_ASAN=0}; export SPDK_RUN_ASAN 780560976dSPawel Niedzwiecki: ${SPDK_RUN_UBSAN=0}; export SPDK_RUN_UBSAN 790560976dSPawel Niedzwiecki: ${SPDK_RUN_INSTALLED_DPDK=0}; export SPDK_RUN_INSTALLED_DPDK 80714a5646SBen Walker: ${SPDK_RUN_NON_ROOT=0}; export SPDK_RUN_NON_ROOT 810560976dSPawel Niedzwiecki: ${SPDK_TEST_CRYPTO=0}; export SPDK_TEST_CRYPTO 82ef2e614cSWojciech Malikowski: ${SPDK_TEST_FTL=0}; export SPDK_TEST_FTL 830560976dSPawel Niedzwiecki: ${SPDK_TEST_OCF=0}; export SPDK_TEST_OCF 840699216fSWojciech Malikowski: ${SPDK_TEST_FTL_EXTENDED=0}; export SPDK_TEST_FTL_EXTENDED 851d717c7cSWojciech Malikowski: ${SPDK_TEST_VMD=0}; export SPDK_TEST_VMD 862176f081SChunyang Hui: ${SPDK_TEST_OPAL=0}; export SPDK_TEST_OPAL 877612ac47SDarek Stojaczyk: ${SPDK_AUTOTEST_X=true}; export SPDK_AUTOTEST_X 88c9e5d2a6SSeth Howell 8905dde5c2STomasz Zawadzki# Export PYTHONPATH with addition of RPC framework. New scripts can be created 9005dde5c2STomasz Zawadzki# specific use cases for tests. 9105dde5c2STomasz Zawadzkiexport PYTHONPATH=$PYTHONPATH:$rootdir/scripts 9205dde5c2STomasz Zawadzki 93f657669eSKarol Latecki# Don't create Python .pyc files. When running with sudo these will be 94f657669eSKarol Latecki# created with root ownership and can cause problems when cleaning the repository. 95f657669eSKarol Lateckiexport PYTHONDONTWRITEBYTECODE=1 96f657669eSKarol Latecki 97f40d2451SSeth Howell# Export flag to skip the known bug that exists in librados 98f40d2451SSeth Howell# Bug is reported on ceph bug tracker with number 24078 99f40d2451SSeth Howellexport ASAN_OPTIONS=new_delete_type_mismatch=0 100f40d2451SSeth Howellexport UBSAN_OPTIONS='halt_on_error=1:print_stacktrace=1:abort_on_error=1' 101f40d2451SSeth Howell 1029fda9814STomasz Zawadzki# Export LeakSanitizer option to use suppression file in order to prevent false positives 1039fda9814STomasz Zawadzki# and known leaks in external executables or libraries from showing up. 1049fda9814STomasz Zawadzkiasan_suppression_file="/var/tmp/asan_suppression_file" 1059fda9814STomasz Zawadzkisudo rm -rf "$asan_suppression_file" 10602925187SMaciej Wawrykcat << EOL >> "$asan_suppression_file" 1079fda9814STomasz Zawadzki# ASAN has some bugs around thread_local variables. We have a destructor in place 1089fda9814STomasz Zawadzki# to free the thread contexts, but ASAN complains about the leak before those 1099fda9814STomasz Zawadzki# destructors have a chance to run. So suppress this one specific leak using 1109fda9814STomasz Zawadzki# LSAN_OPTIONS. 11102925187SMaciej Wawrykleak:spdk_fs_alloc_thread_ctx 1129fda9814STomasz Zawadzki 1131bed9c1fSTomasz Zawadzki# Suppress known leaks in fio project 11402925187SMaciej Wawrykleak:/usr/src/fio/parse.c 11502925187SMaciej Wawrykleak:/usr/src/fio/iolog.c 11602925187SMaciej Wawrykleak:/usr/src/fio/init.c 11702925187SMaciej Wawrykleak:fio_memalign 11802925187SMaciej Wawrykleak:spdk_fio_io_u_init 1191bed9c1fSTomasz Zawadzki 1201891f2e5STomasz Zawadzki# Suppress leaks in libiscsi 12102925187SMaciej Wawrykleak:libiscsi.so 12202925187SMaciej WawrykEOL 1231891f2e5STomasz Zawadzki 1248e70c6e3STomasz Kulasek# Suppress leaks in libfuse3 1258e70c6e3STomasz Kulasekecho "leak:libfuse3.so" >> "$asan_suppression_file" 1268e70c6e3STomasz Kulasek 1279fda9814STomasz Zawadzkiexport LSAN_OPTIONS=suppressions="$asan_suppression_file" 1289fda9814STomasz Zawadzki 129f40d2451SSeth Howellexport DEFAULT_RPC_ADDR="/var/tmp/spdk.sock" 130f40d2451SSeth Howell 131f04277f0SJohn Meneghiniif [ -z "$DEPENDENCY_DIR" ]; then 132f04277f0SJohn Meneghini export DEPENDENCY_DIR=/home/sys_sgsw 133f04277f0SJohn Meneghinielse 134f04277f0SJohn Meneghini export DEPENDENCY_DIR 135f04277f0SJohn Meneghinifi 136f04277f0SJohn Meneghini 137c9e5d2a6SSeth Howell# pass our valgrind desire on to unittest.sh 138c9e5d2a6SSeth Howellif [ $SPDK_RUN_VALGRIND -eq 0 ]; then 139c9e5d2a6SSeth Howell export valgrind='' 140c9e5d2a6SSeth Howellfi 141c9e5d2a6SSeth Howell 142f40d2451SSeth Howellif [ "$(uname -s)" = "Linux" ]; then 14338d4a2a2SPawel Kaminski MAKE="make" 144f40d2451SSeth Howell MAKEFLAGS=${MAKEFLAGS:--j$(nproc)} 145f40d2451SSeth Howell DPDK_LINUX_DIR=/usr/share/dpdk/x86_64-default-linuxapp-gcc 146f40d2451SSeth Howell if [ -d $DPDK_LINUX_DIR ] && [ $SPDK_RUN_INSTALLED_DPDK -eq 1 ]; then 147f40d2451SSeth Howell WITH_DPDK_DIR=$DPDK_LINUX_DIR 148f40d2451SSeth Howell fi 149f40d2451SSeth Howell # Override the default HUGEMEM in scripts/setup.sh to allocate 8GB in hugepages. 150f40d2451SSeth Howell export HUGEMEM=8192 151f40d2451SSeth Howellelif [ "$(uname -s)" = "FreeBSD" ]; then 15238d4a2a2SPawel Kaminski MAKE="gmake" 153772eb8ebSKarol Latecki MAKEFLAGS=${MAKEFLAGS:--j$(sysctl -a | grep -E -i 'hw.ncpu' | awk '{print $2}')} 154f40d2451SSeth Howell DPDK_FREEBSD_DIR=/usr/local/share/dpdk/x86_64-native-bsdapp-clang 155f40d2451SSeth Howell if [ -d $DPDK_FREEBSD_DIR ] && [ $SPDK_RUN_INSTALLED_DPDK -eq 1 ]; then 156f40d2451SSeth Howell WITH_DPDK_DIR=$DPDK_FREEBSD_DIR 157f40d2451SSeth Howell fi 158f40d2451SSeth Howell # FreeBSD runs a much more limited set of tests, so keep the default 2GB. 159f40d2451SSeth Howell export HUGEMEM=2048 160f40d2451SSeth Howellelse 161f40d2451SSeth Howell echo "Unknown OS \"$(uname -s)\"" 162f40d2451SSeth Howell exit 1 163f40d2451SSeth Howellfi 164f40d2451SSeth Howell 165c9e5d2a6SSeth Howellconfig_params='--enable-debug --enable-werror' 166c9e5d2a6SSeth Howell 167848daf27SPawel Wodkowskiif echo -e "#include <libunwind.h>\nint main(int argc, char *argv[]) {return 0;}\n" | \ 168848daf27SPawel Wodkowski gcc -o /dev/null -lunwind -x c - 2>/dev/null; then 169ae2b2f64SPawel Wodkowski config_params+=' --enable-log-bt' 170848daf27SPawel Wodkowskifi 171848daf27SPawel Wodkowski 1728a43cd27Spaul luse# for options with dependencies but no test flag, set them here 1738a43cd27Spaul luseif [ -f /usr/include/infiniband/verbs.h ]; then 1748a43cd27Spaul luse config_params+=' --with-rdma' 1758a43cd27Spaul lusefi 1768a43cd27Spaul luse 1778a43cd27Spaul luseif [ -d /usr/src/fio ]; then 1788a43cd27Spaul luse config_params+=' --with-fio=/usr/src/fio' 1798a43cd27Spaul lusefi 1808a43cd27Spaul luse 1818a43cd27Spaul luseif [ -d ${DEPENDENCY_DIR}/vtune_codes ]; then 1828a43cd27Spaul luse config_params+=' --with-vtune='${DEPENDENCY_DIR}'/vtune_codes' 1838a43cd27Spaul lusefi 1848a43cd27Spaul luse 1858a43cd27Spaul luseif [ -d /usr/include/iscsi ]; then 186fb9c4ee6SKarol 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}') 1878a43cd27Spaul luse if [ $libiscsi_version -ge 20150621 ]; then 1888a43cd27Spaul luse config_params+=' --with-iscsi-initiator' 1898a43cd27Spaul luse fi 1908a43cd27Spaul lusefi 1918a43cd27Spaul luse 192efbcd259STomasz Kulasekif [ $SPDK_TEST_NVME_CUSE -eq 1 ]; then 193efbcd259STomasz Kulasek config_params+=' --with-nvme-cuse' 194efbcd259STomasz Kulasekfi 195efbcd259STomasz Kulasek 1968a43cd27Spaul luse# for options with both dependencies and a test flag, set them here 1978a43cd27Spaul luseif [ -f /usr/include/libpmemblk.h ] && [ $SPDK_TEST_PMDK -eq 1 ]; then 1988a43cd27Spaul luse config_params+=' --with-pmdk' 1998a43cd27Spaul lusefi 2008a43cd27Spaul luse 2018a43cd27Spaul luseif [ -f /usr/include/libpmem.h ] && [ $SPDK_TEST_REDUCE -eq 1 ]; then 2028a43cd27Spaul luse if [ $SPDK_TEST_ISAL -eq 1 ]; then 2038a43cd27Spaul luse config_params+=' --with-reduce' 2048a43cd27Spaul luse else 2058a43cd27Spaul luse echo "reduce not enabled because isal is not enabled." 2068a43cd27Spaul luse fi 2078a43cd27Spaul lusefi 2088a43cd27Spaul luse 2098a43cd27Spaul luseif [ -d /usr/include/rbd ] && [ -d /usr/include/rados ] && [ $SPDK_TEST_RBD -eq 1 ]; then 2108a43cd27Spaul luse config_params+=' --with-rbd' 2118a43cd27Spaul lusefi 2128a43cd27Spaul luse 21314a62d67STomasz Kulasekif [ $SPDK_TEST_VPP -eq 1 ]; then 2149307ff5aSTomasz Kulasek VPP_PATH="/usr/local/src/vpp-19.04/build-root/install-vpp_debug-native/vpp/" 21514a62d67STomasz Kulasek export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${VPP_PATH}/lib/ 21614a62d67STomasz Kulasek export PATH=${PATH}:${VPP_PATH}/bin/ 21714a62d67STomasz Kulasek config_params+=" --with-vpp=${VPP_PATH}" 21814a62d67STomasz Kulasekfi 21914a62d67STomasz Kulasek 2208a43cd27Spaul luse# for options with no required dependencies, just test flags, set them here 22151606ed4SPaul Luseif [ $SPDK_TEST_CRYPTO -eq 1 ]; then 22251606ed4SPaul Luse config_params+=' --with-crypto' 22351606ed4SPaul Lusefi 22451606ed4SPaul Luse 2252fde729fSVitaliy Mysakif [ $SPDK_TEST_OCF -eq 1 ]; then 22634bdceabSVitaliy Mysak config_params+=" --with-ocf" 2272fde729fSVitaliy Mysakfi 2282fde729fSVitaliy Mysak 229e20401c8SDarek Stojaczykif [ $SPDK_RUN_UBSAN -eq 1 ]; then 230e20401c8SDarek Stojaczyk config_params+=' --enable-ubsan' 231e20401c8SDarek Stojaczykfi 232e20401c8SDarek Stojaczyk 233e20401c8SDarek Stojaczykif [ $SPDK_RUN_ASAN -eq 1 ]; then 234e20401c8SDarek Stojaczyk config_params+=' --enable-asan' 235e20401c8SDarek Stojaczykfi 236e20401c8SDarek Stojaczyk 23785e70f4eSDarek Stojaczykif [ "$(uname -s)" = "Linux" ]; then 238c9e5d2a6SSeth Howell config_params+=' --enable-coverage' 23985e70f4eSDarek Stojaczykfi 240c9e5d2a6SSeth Howell 2418a43cd27Spaul luseif [ $SPDK_TEST_ISAL -eq 0 ]; then 2428a43cd27Spaul luse config_params+=' --without-isal' 2438a43cd27Spaul lusefi 2448a43cd27Spaul luse 2457fa15e28SXiaodong Liuif [ $SPDK_TEST_BLOBFS -eq 1 ]; then 2467fa15e28SXiaodong Liu if [[ -d /usr/include/fuse3 ]] && [[ -d /usr/local/include/fuse3 ]]; then 2477fa15e28SXiaodong Liu config_params+=' --with-fuse' 2487fa15e28SXiaodong Liu else 2497fa15e28SXiaodong Liu echo "FUSE not enabled because libfuse3 is not installed." 2507fa15e28SXiaodong Liu fi 2517fa15e28SXiaodong Liufi 2527fa15e28SXiaodong Liu 253c9e5d2a6SSeth Howell# By default, --with-dpdk is not set meaning the SPDK build will use the DPDK submodule. 254c9e5d2a6SSeth Howell# If a DPDK installation is found in a well-known location though, WITH_DPDK_DIR will be 255c9e5d2a6SSeth Howell# set which will override the default and use that DPDK installation instead. 2561ccc878eSKarol Lateckiif [ -n "$WITH_DPDK_DIR" ]; then 257c9e5d2a6SSeth Howell config_params+=" --with-dpdk=$WITH_DPDK_DIR" 258c9e5d2a6SSeth Howellfi 259c9e5d2a6SSeth Howell 260c9e5d2a6SSeth Howellexport config_params 261c9e5d2a6SSeth Howell 262c9e5d2a6SSeth Howellif [ -z "$output_dir" ]; then 263c9e5d2a6SSeth Howell if [ -z "$rootdir" ] || [ ! -d "$rootdir/../output" ]; then 264c9e5d2a6SSeth Howell output_dir=. 265c9e5d2a6SSeth Howell else 266c9e5d2a6SSeth Howell output_dir=$rootdir/../output 267c9e5d2a6SSeth Howell fi 268c9e5d2a6SSeth Howell export output_dir 269c9e5d2a6SSeth Howellfi 270c9e5d2a6SSeth Howell 2716a8a1b6bSJim HarrisTEST_MODE= 2726a8a1b6bSJim Harrisfor i in "$@"; do 2736a8a1b6bSJim Harris case "$i" in 2746a8a1b6bSJim Harris --iso) 2756a8a1b6bSJim Harris TEST_MODE=iso 2766a8a1b6bSJim Harris ;; 2776a8a1b6bSJim Harris --transport=*) 2786a8a1b6bSJim Harris TEST_TRANSPORT="${i#*=}" 2796a8a1b6bSJim Harris ;; 2806a8a1b6bSJim Harris --sock=*) 2816a8a1b6bSJim Harris TEST_SOCK="${i#*=}" 2826a8a1b6bSJim Harris ;; 2836a8a1b6bSJim Harris esac 2846a8a1b6bSJim Harrisdone 2856a8a1b6bSJim Harris 286c9e5d2a6SSeth Howellfunction timing() { 287c9e5d2a6SSeth Howell direction="$1" 288c9e5d2a6SSeth Howell testname="$2" 289c9e5d2a6SSeth Howell 290c9e5d2a6SSeth Howell now=$(date +%s) 291c9e5d2a6SSeth Howell 292c9e5d2a6SSeth Howell if [ "$direction" = "enter" ]; then 293c9e5d2a6SSeth Howell export timing_stack="${timing_stack};${now}" 294c9e5d2a6SSeth Howell export test_stack="${test_stack};${testname}" 295c9e5d2a6SSeth Howell else 2967c00bdabSDarek Stojaczyk touch "$output_dir/timing.txt" 297c9e5d2a6SSeth Howell child_time=$(grep "^${test_stack:1};" $output_dir/timing.txt | awk '{s+=$2} END {print s}') 298c9e5d2a6SSeth Howell 299c9e5d2a6SSeth Howell start_time=$(echo "$timing_stack" | sed -e 's@^.*;@@') 300c9e5d2a6SSeth Howell timing_stack=$(echo "$timing_stack" | sed -e 's@;[^;]*$@@') 301c9e5d2a6SSeth Howell 302c9e5d2a6SSeth Howell elapsed=$((now - start_time - child_time)) 303c9e5d2a6SSeth Howell echo "${test_stack:1} $elapsed" >> $output_dir/timing.txt 304c9e5d2a6SSeth Howell 305c9e5d2a6SSeth Howell test_stack=$(echo "$test_stack" | sed -e 's@;[^;]*$@@') 306c9e5d2a6SSeth Howell fi 307c9e5d2a6SSeth Howell} 308c9e5d2a6SSeth Howell 309c9e5d2a6SSeth Howellfunction timing_enter() { 3103b660ea8SDarek Stojaczyk xtrace_disable 311c9e5d2a6SSeth Howell timing "enter" "$1" 3123b660ea8SDarek Stojaczyk xtrace_restore 313c9e5d2a6SSeth Howell} 314c9e5d2a6SSeth Howell 315c9e5d2a6SSeth Howellfunction timing_exit() { 3163b660ea8SDarek Stojaczyk xtrace_disable 317c9e5d2a6SSeth Howell timing "exit" "$1" 3183b660ea8SDarek Stojaczyk xtrace_restore 319c9e5d2a6SSeth Howell} 320c9e5d2a6SSeth Howell 321c9e5d2a6SSeth Howellfunction timing_finish() { 322c9e5d2a6SSeth Howell flamegraph='/usr/local/FlameGraph/flamegraph.pl' 323c9e5d2a6SSeth Howell if [ -x "$flamegraph" ]; then 324c9e5d2a6SSeth Howell "$flamegraph" \ 325c9e5d2a6SSeth Howell --title 'Build Timing' \ 326c9e5d2a6SSeth Howell --nametype 'Step:' \ 327c9e5d2a6SSeth Howell --countname seconds \ 328c9e5d2a6SSeth Howell $output_dir/timing.txt \ 329c9e5d2a6SSeth Howell >$output_dir/timing.svg 330c9e5d2a6SSeth Howell fi 331c9e5d2a6SSeth Howell} 332c9e5d2a6SSeth Howell 333a562812dSSeth Howellfunction create_test_list() { 334a571eb03SSeth Howell grep -rshI --exclude="autotest_common.sh" \ 335a571eb03SSeth Howell --exclude="$rootdir/test/common/autotest_common.sh" \ 336a571eb03SSeth Howell -e "run_test " $rootdir | grep -v "#" \ 337a571eb03SSeth Howell | sed 's/^.*run_test/run_test/' | awk '{print $2}' | \ 338a571eb03SSeth Howell sed 's/\"//g' | sort > $output_dir/all_tests.txt || true 339a562812dSSeth Howell} 340a562812dSSeth Howell 341327668c8STomasz Kulasekfunction gdb_attach() { 342327668c8STomasz Kulasek gdb -q --batch \ 343327668c8STomasz Kulasek -ex 'handle SIGHUP nostop pass' \ 344327668c8STomasz Kulasek -ex 'handle SIGQUIT nostop pass' \ 345327668c8STomasz Kulasek -ex 'handle SIGPIPE nostop pass' \ 346327668c8STomasz Kulasek -ex 'handle SIGALRM nostop pass' \ 347327668c8STomasz Kulasek -ex 'handle SIGTERM nostop pass' \ 348327668c8STomasz Kulasek -ex 'handle SIGUSR1 nostop pass' \ 349327668c8STomasz Kulasek -ex 'handle SIGUSR2 nostop pass' \ 350327668c8STomasz Kulasek -ex 'handle SIGCHLD nostop pass' \ 351327668c8STomasz Kulasek -ex 'set print thread-events off' \ 352327668c8STomasz Kulasek -ex 'cont' \ 353327668c8STomasz Kulasek -ex 'thread apply all bt' \ 354327668c8STomasz Kulasek -ex 'quit' \ 355327668c8STomasz Kulasek --tty=/dev/stdout \ 356327668c8STomasz Kulasek -p $1 357327668c8STomasz Kulasek} 358327668c8STomasz Kulasek 359c9e5d2a6SSeth Howellfunction process_core() { 360c9e5d2a6SSeth Howell ret=0 361f1131f1dSMaciej Wawryk while IFS= read -r -d '' core; 362f1131f1dSMaciej Wawryk do 363c9e5d2a6SSeth Howell exe=$(eu-readelf -n "$core" | grep psargs | sed "s/.*psargs: \([^ \'\" ]*\).*/\1/") 364b606baabSKarol Latecki if [[ ! -f "$exe" ]]; then 365b606baabSKarol Latecki exe=$(eu-readelf -n "$core" | grep -oP -m1 "$exe.+") 366b606baabSKarol Latecki fi 367c9e5d2a6SSeth Howell echo "exe for $core is $exe" 3681ccc878eSKarol Latecki if [[ -n "$exe" ]]; then 369005e18a8SDarek Stojaczyk if hash gdb &>/dev/null; then 370c9e5d2a6SSeth Howell gdb -batch -ex "thread apply all bt full" $exe $core 371c9e5d2a6SSeth Howell fi 372c9e5d2a6SSeth Howell cp $exe $output_dir 373c9e5d2a6SSeth Howell fi 374c9e5d2a6SSeth Howell mv $core $output_dir 375c9e5d2a6SSeth Howell chmod a+r $output_dir/$core 376c9e5d2a6SSeth Howell ret=1 377f1131f1dSMaciej Wawryk done < <(find . -type f \( -name 'core\.?[0-9]*' -o -name '*.core' \) -print0) 378c9e5d2a6SSeth Howell return $ret 379c9e5d2a6SSeth Howell} 380c9e5d2a6SSeth Howell 381af32aa1bSKarol Lateckifunction process_shm() { 382af32aa1bSKarol Latecki type=$1 383af32aa1bSKarol Latecki id=$2 384af32aa1bSKarol Latecki if [ "$type" = "--pid" ]; then 385af32aa1bSKarol Latecki id="pid${id}" 386af32aa1bSKarol Latecki elif [ "$type" = "--id" ]; then 387af32aa1bSKarol Latecki id="${id}" 388af32aa1bSKarol Latecki else 389af32aa1bSKarol Latecki echo "Please specify to search for pid or shared memory id." 390af32aa1bSKarol Latecki return 1 391af32aa1bSKarol Latecki fi 392af32aa1bSKarol Latecki 393af32aa1bSKarol Latecki shm_files=$(find /dev/shm -name "*.${id}" -printf "%f\n") 394af32aa1bSKarol Latecki 395af32aa1bSKarol Latecki if [[ -z $shm_files ]]; then 396af32aa1bSKarol Latecki echo "SHM File for specified PID or shared memory id: ${id} not found!" 397af32aa1bSKarol Latecki return 1 398af32aa1bSKarol Latecki fi 399af32aa1bSKarol Latecki for n in $shm_files; do 400af32aa1bSKarol Latecki tar -C /dev/shm/ -cvzf $output_dir/${n}_shm.tar.gz ${n} 401af32aa1bSKarol Latecki done 402af32aa1bSKarol Latecki return 0 403af32aa1bSKarol Latecki} 404af32aa1bSKarol Latecki 405c9e5d2a6SSeth Howellfunction waitforlisten() { 406c9e5d2a6SSeth Howell # $1 = process pid 407c9e5d2a6SSeth Howell if [ -z "$1" ]; then 408c9e5d2a6SSeth Howell exit 1 409c9e5d2a6SSeth Howell fi 410c9e5d2a6SSeth Howell 411f751ea17SPawel Wodkowski local rpc_addr="${2:-$DEFAULT_RPC_ADDR}" 412c9e5d2a6SSeth Howell 413c9e5d2a6SSeth Howell echo "Waiting for process to start up and listen on UNIX domain socket $rpc_addr..." 414c9e5d2a6SSeth Howell # turn off trace for this loop 4153b660ea8SDarek Stojaczyk xtrace_disable 416f751ea17SPawel Wodkowski local ret=0 417db1236efSPawel Wodkowski local i 418db1236efSPawel Wodkowski for (( i = 40; i != 0; i-- )); do 419c9e5d2a6SSeth Howell # if the process is no longer running, then exit the script 420c9e5d2a6SSeth Howell # since it means the application crashed 421c9e5d2a6SSeth Howell if ! kill -s 0 $1; then 422db1236efSPawel Wodkowski echo "ERROR: process (pid: $1) is no longer running" 423f751ea17SPawel Wodkowski ret=1 424f751ea17SPawel Wodkowski break 425c9e5d2a6SSeth Howell fi 4265bafc240STomasz Zawadzki 4276ee44c69SJim Harris if $rootdir/scripts/rpc.py -t 1 -s "$rpc_addr" rpc_get_methods &>/dev/null; then 428db1236efSPawel Wodkowski break 429c9e5d2a6SSeth Howell fi 43082583134SDarek Stojaczyk 431db1236efSPawel Wodkowski sleep 0.5 432c9e5d2a6SSeth Howell done 433f751ea17SPawel Wodkowski 4343b660ea8SDarek Stojaczyk xtrace_restore 435db1236efSPawel Wodkowski if (( i == 0 )); then 436db1236efSPawel Wodkowski echo "ERROR: timeout while waiting for process (pid: $1) to start listening on '$rpc_addr'" 437db1236efSPawel Wodkowski ret=1 438f751ea17SPawel Wodkowski fi 439db1236efSPawel Wodkowski return $ret 440c9e5d2a6SSeth Howell} 441c9e5d2a6SSeth Howell 442c9e5d2a6SSeth Howellfunction waitfornbd() { 443bf9dbae5SPawel Wodkowski local nbd_name=$1 444bf9dbae5SPawel Wodkowski local i 445c9e5d2a6SSeth Howell 446c9e5d2a6SSeth Howell for ((i=1; i<=20; i++)); do 447c9e5d2a6SSeth Howell if grep -q -w $nbd_name /proc/partitions; then 448c9e5d2a6SSeth Howell break 449c9e5d2a6SSeth Howell else 450c9e5d2a6SSeth Howell sleep 0.1 451c9e5d2a6SSeth Howell fi 452c9e5d2a6SSeth Howell done 453c9e5d2a6SSeth Howell 454c9e5d2a6SSeth Howell # The nbd device is now recognized as a block device, but there can be 455c9e5d2a6SSeth Howell # a small delay before we can start I/O to that block device. So loop 456c9e5d2a6SSeth Howell # here trying to read the first block of the nbd block device to a temp 457c9e5d2a6SSeth Howell # file. Note that dd returns success when reading an empty file, so we 458c9e5d2a6SSeth Howell # need to check the size of the output file instead. 459c9e5d2a6SSeth Howell for ((i=1; i<=20; i++)); do 460c9e5d2a6SSeth Howell dd if=/dev/$nbd_name of=/tmp/nbdtest bs=4096 count=1 iflag=direct 461fb9c4ee6SKarol Latecki size=$(stat -c %s /tmp/nbdtest) 462c9e5d2a6SSeth Howell rm -f /tmp/nbdtest 463c9e5d2a6SSeth Howell if [ "$size" != "0" ]; then 464c9e5d2a6SSeth Howell return 0 465c9e5d2a6SSeth Howell else 466c9e5d2a6SSeth Howell sleep 0.1 467c9e5d2a6SSeth Howell fi 468c9e5d2a6SSeth Howell done 469c9e5d2a6SSeth Howell 470c9e5d2a6SSeth Howell return 1 471c9e5d2a6SSeth Howell} 472c9e5d2a6SSeth Howell 473975e4614Spaul lusefunction waitforbdev() { 474975e4614Spaul luse local bdev_name=$1 475975e4614Spaul luse local i 476975e4614Spaul luse 477975e4614Spaul luse for ((i=1; i<=20; i++)); do 478ab854135SBen Walker if $rpc_py bdev_get_bdevs | jq -r '.[] .name' | grep -qw $bdev_name; then 479975e4614Spaul luse return 0 480975e4614Spaul luse fi 481ab854135SBen Walker 482ab854135SBen Walker if $rpc_py bdev_get_bdevs | jq -r '.[] .aliases' | grep -qw $bdev_name; then 483ab854135SBen Walker return 0 484ab854135SBen Walker fi 485ab854135SBen Walker 486ab854135SBen Walker sleep 0.1 487975e4614Spaul luse done 488975e4614Spaul luse 489975e4614Spaul luse return 1 490975e4614Spaul luse} 491975e4614Spaul luse 492c9e5d2a6SSeth Howellfunction killprocess() { 493c9e5d2a6SSeth Howell # $1 = process pid 494c9e5d2a6SSeth Howell if [ -z "$1" ]; then 495c9e5d2a6SSeth Howell exit 1 496c9e5d2a6SSeth Howell fi 497c9e5d2a6SSeth Howell 498f0a2cc82SKarol Latecki if kill -0 $1; then 499714a5646SBen Walker if [ "$(ps --no-headers -o comm= $1)" = "sudo" ]; then 500714a5646SBen Walker # kill the child process, which is the actual app 501714a5646SBen Walker # (assume $1 has just one child) 502074df1d8SPawel Kaminski local child 503074df1d8SPawel Kaminski child="$(pgrep -P $1)" 504714a5646SBen Walker echo "killing process with pid $child" 505714a5646SBen Walker kill $child 506714a5646SBen Walker else 507c9e5d2a6SSeth Howell echo "killing process with pid $1" 508c9e5d2a6SSeth Howell kill $1 509714a5646SBen Walker fi 510714a5646SBen Walker 511714a5646SBen Walker # wait for the process regardless if its the dummy sudo one 512714a5646SBen Walker # or the actual app - it should terminate anyway 513c9e5d2a6SSeth Howell wait $1 51482f60376SGangCao else 51582f60376SGangCao # the process is not there anymore 51682f60376SGangCao echo "Process with pid $1 is not found" 51782f60376SGangCao exit 1 518f0a2cc82SKarol Latecki fi 519c9e5d2a6SSeth Howell} 520c9e5d2a6SSeth Howell 521c9e5d2a6SSeth Howellfunction iscsicleanup() { 522c9e5d2a6SSeth Howell echo "Cleaning up iSCSI connection" 523c9e5d2a6SSeth Howell iscsiadm -m node --logout || true 524c9e5d2a6SSeth Howell iscsiadm -m node -o delete || true 525c9e5d2a6SSeth Howell} 526c9e5d2a6SSeth Howell 527c9e5d2a6SSeth Howellfunction stop_iscsi_service() { 528c9e5d2a6SSeth Howell if cat /etc/*-release | grep Ubuntu; then 529c9e5d2a6SSeth Howell service open-iscsi stop 530c9e5d2a6SSeth Howell else 531c9e5d2a6SSeth Howell service iscsid stop 532c9e5d2a6SSeth Howell fi 533c9e5d2a6SSeth Howell} 534c9e5d2a6SSeth Howell 535c9e5d2a6SSeth Howellfunction start_iscsi_service() { 536c9e5d2a6SSeth Howell if cat /etc/*-release | grep Ubuntu; then 537c9e5d2a6SSeth Howell service open-iscsi start 538c9e5d2a6SSeth Howell else 539c9e5d2a6SSeth Howell service iscsid start 540c9e5d2a6SSeth Howell fi 541c9e5d2a6SSeth Howell} 542c9e5d2a6SSeth Howell 543c9e5d2a6SSeth Howellfunction rbd_setup() { 5440629b01dSTomasz Zawadzki # $1 = monitor ip address 5455bafc240STomasz Zawadzki # $2 = name of the namespace 5460629b01dSTomasz Zawadzki if [ -z "$1" ]; then 5470629b01dSTomasz Zawadzki echo "No monitor IP address provided for ceph" 5480629b01dSTomasz Zawadzki exit 1 5490629b01dSTomasz Zawadzki fi 5505bafc240STomasz Zawadzki if [ -n "$2" ]; then 5515bafc240STomasz Zawadzki if ip netns list | grep "$2"; then 5525bafc240STomasz Zawadzki NS_CMD="ip netns exec $2" 5535bafc240STomasz Zawadzki else 5545bafc240STomasz Zawadzki echo "No namespace $2 exists" 5555bafc240STomasz Zawadzki exit 1 5565bafc240STomasz Zawadzki fi 5575bafc240STomasz Zawadzki fi 5580629b01dSTomasz Zawadzki 559c9e5d2a6SSeth Howell if hash ceph; then 560397521bdSSeth Howell export PG_NUM=128 561c9e5d2a6SSeth Howell export RBD_POOL=rbd 562c9e5d2a6SSeth Howell export RBD_NAME=foo 5636907c36fSyidong0635 $NS_CMD $rootdir/scripts/ceph/stop.sh || true 5645bafc240STomasz Zawadzki $NS_CMD $rootdir/scripts/ceph/start.sh $1 565397521bdSSeth Howell 5665bafc240STomasz Zawadzki $NS_CMD ceph osd pool create $RBD_POOL $PG_NUM || true 5675bafc240STomasz Zawadzki $NS_CMD rbd create $RBD_NAME --size 1000 568c9e5d2a6SSeth Howell fi 569c9e5d2a6SSeth Howell} 570c9e5d2a6SSeth Howell 571c9e5d2a6SSeth Howellfunction rbd_cleanup() { 572c9e5d2a6SSeth Howell if hash ceph; then 573d51ea8deSDaniel Verkamp $rootdir/scripts/ceph/stop.sh || true 574ab1622aaSKarol Latecki rm -f /var/tmp/ceph_raw.img 575c9e5d2a6SSeth Howell fi 576c9e5d2a6SSeth Howell} 577c9e5d2a6SSeth Howell 578*9ba80de0SMichal Bergerfunction _start_stub() { 57918f3a22bSJim Harris # Disable ASLR for multi-process testing. SPDK does support using DPDK multi-process, 5809d04d0efSJim Harris # but ASLR can still be unreliable in some cases. 5814b1dbc94SMichal Berger # We will reenable it again after multi-process testing is complete in kill_stub(). 5824b1dbc94SMichal Berger # Save current setting so it can be restored upon calling kill_stub(). 5834b1dbc94SMichal Berger _randomize_va_space=$(</proc/sys/kernel/randomize_va_space) 58418f3a22bSJim Harris echo 0 > /proc/sys/kernel/randomize_va_space 585c9e5d2a6SSeth Howell $rootdir/test/app/stub/stub $1 & 586c9e5d2a6SSeth Howell stubpid=$! 587c9e5d2a6SSeth Howell echo Waiting for stub to ready for secondary processes... 588c9e5d2a6SSeth Howell while ! [ -e /var/run/spdk_stub0 ]; do 589*9ba80de0SMichal Berger # If stub dies while we wait, bail 590*9ba80de0SMichal Berger [[ -e /proc/$stubpid ]] || return 1 591c9e5d2a6SSeth Howell sleep 1s 592c9e5d2a6SSeth Howell done 593c9e5d2a6SSeth Howell echo done. 594c9e5d2a6SSeth Howell} 595c9e5d2a6SSeth Howell 596*9ba80de0SMichal Bergerfunction start_stub() { 597*9ba80de0SMichal Berger if ! _start_stub "$@"; then 598*9ba80de0SMichal Berger echo "stub failed" >&2 599*9ba80de0SMichal Berger return 1 600*9ba80de0SMichal Berger fi 601*9ba80de0SMichal Berger} 602*9ba80de0SMichal Berger 603c9e5d2a6SSeth Howellfunction kill_stub() { 604*9ba80de0SMichal Berger if [[ -e /proc/$stubpid ]]; then 605ef6832efSJim Harris kill $1 $stubpid 606c9e5d2a6SSeth Howell wait $stubpid 607*9ba80de0SMichal Berger fi 2>/dev/null || : 608c9e5d2a6SSeth Howell rm -f /var/run/spdk_stub0 60918f3a22bSJim Harris # Re-enable ASLR now that we are done with multi-process testing 61018f3a22bSJim Harris # Note: "1" enables ASLR w/o randomizing data segments, "2" adds data segment 61118f3a22bSJim Harris # randomizing and is the default on all recent Linux kernels 6124b1dbc94SMichal Berger echo "${_randomize_va_space:-2}" > /proc/sys/kernel/randomize_va_space 613c9e5d2a6SSeth Howell} 614c9e5d2a6SSeth Howell 615c9e5d2a6SSeth Howellfunction run_test() { 616cb90136cSSeth Howell if [ $# -le 1 ]; then 617fd17f1aaSSeth Howell echo "Not enough parameters" 618cb90136cSSeth Howell echo "usage: run_test test_name test_script [script_params]" 619fd17f1aaSSeth Howell exit 1 620fd17f1aaSSeth Howell fi 621fd17f1aaSSeth Howell 6223b660ea8SDarek Stojaczyk xtrace_disable 62337100484SSeth Howell local test_name="$1" 62437100484SSeth Howell shift 6251fafd71bSSeth Howell 626ea781d6dSSeth Howell if [ -n "$test_domain" ]; then 627ea781d6dSSeth Howell export test_domain="${test_domain}.${test_name}" 628ea781d6dSSeth Howell else 629ea781d6dSSeth Howell export test_domain="$test_name" 630ea781d6dSSeth Howell fi 631ea781d6dSSeth Howell 6321fafd71bSSeth Howell timing_enter $test_name 633c9e5d2a6SSeth Howell echo "************************************" 634cb90136cSSeth Howell echo "START TEST $test_name" 635c9e5d2a6SSeth Howell echo "************************************" 6363b660ea8SDarek Stojaczyk xtrace_restore 637c9e5d2a6SSeth Howell time "$@" 6383b660ea8SDarek Stojaczyk xtrace_disable 639c9e5d2a6SSeth Howell echo "************************************" 640cb90136cSSeth Howell echo "END TEST $test_name" 641c9e5d2a6SSeth Howell echo "************************************" 6421fafd71bSSeth Howell timing_exit $test_name 643ea781d6dSSeth Howell 644ea781d6dSSeth Howell export test_domain=${test_domain%"$test_name"} 645ea781d6dSSeth Howell if [ -n "$test_domain" ]; then 646ea781d6dSSeth Howell export test_domain=${test_domain%?} 647ea781d6dSSeth Howell fi 648ea781d6dSSeth Howell 649ea781d6dSSeth Howell if [ -z "$test_domain" ]; then 650ea781d6dSSeth Howell echo "top_level $test_name" >> $output_dir/test_completions.txt 651ea781d6dSSeth Howell else 652ea781d6dSSeth Howell echo "$test_domain $test_name" >> $output_dir/test_completions.txt 653ea781d6dSSeth Howell fi 6543b660ea8SDarek Stojaczyk xtrace_restore 655c9e5d2a6SSeth Howell} 656c9e5d2a6SSeth Howell 657c9e5d2a6SSeth Howellfunction print_backtrace() { 658b5d1b4f4SJim Harris # if errexit is not enabled, don't print a backtrace 659b5d1b4f4SJim Harris [[ "$-" =~ e ]] || return 0 660b5d1b4f4SJim Harris 66118b9303dSMichal Berger local args=("${BASH_ARGV[@]}") 66218b9303dSMichal Berger 6633b660ea8SDarek Stojaczyk xtrace_disable 664c9e5d2a6SSeth Howell echo "========== Backtrace start: ==========" 665c9e5d2a6SSeth Howell echo "" 666c9e5d2a6SSeth Howell for i in $(seq 1 $((${#FUNCNAME[@]} - 1))); do 667c9e5d2a6SSeth Howell local func="${FUNCNAME[$i]}" 668c9e5d2a6SSeth Howell local line_nr="${BASH_LINENO[$((i - 1))]}" 669c9e5d2a6SSeth Howell local src="${BASH_SOURCE[$i]}" 67018b9303dSMichal Berger local bt="" cmdline=() 6711baf379eSMichal Berger 6721baf379eSMichal Berger if [[ -f $src ]]; then 6731baf379eSMichal Berger bt=$(nl -w 4 -ba -nln $src | grep -B 5 -A 5 "^${line_nr}[^0-9]" | \ 6741baf379eSMichal Berger sed "s/^/ /g" | sed "s/^ $line_nr /=> $line_nr /g") 6751baf379eSMichal Berger fi 6761baf379eSMichal Berger 67718b9303dSMichal Berger # If extdebug set the BASH_ARGC[i], try to fetch all the args 67818b9303dSMichal Berger if (( BASH_ARGC[i] > 0 )); then 67918b9303dSMichal Berger # Use argc as index to reverse the stack 68018b9303dSMichal Berger local argc=${BASH_ARGC[i]} arg 68118b9303dSMichal Berger for arg in "${args[@]::BASH_ARGC[i]}"; do 68218b9303dSMichal Berger cmdline[argc--]="[\"$arg\"]" 68318b9303dSMichal Berger done 68418b9303dSMichal Berger args=("${args[@]:BASH_ARGC[i]}") 68518b9303dSMichal Berger fi 68618b9303dSMichal Berger 68718b9303dSMichal Berger echo "in $src:$line_nr -> $func($(IFS=","; printf '%s\n' "${cmdline[*]:-[]}"))" 688c9e5d2a6SSeth Howell echo " ..." 6891baf379eSMichal Berger echo "${bt:-backtrace unavailable}" 690c9e5d2a6SSeth Howell echo " ..." 691c9e5d2a6SSeth Howell done 692c9e5d2a6SSeth Howell echo "" 693c9e5d2a6SSeth Howell echo "========== Backtrace end ==========" 6943b660ea8SDarek Stojaczyk xtrace_restore 695c9e5d2a6SSeth Howell return 0 696c9e5d2a6SSeth Howell} 697c9e5d2a6SSeth Howell 698c9e5d2a6SSeth Howellfunction part_dev_by_gpt () { 699c9e5d2a6SSeth Howell if [ $(uname -s) = Linux ] && hash sgdisk && modprobe nbd; then 700c9e5d2a6SSeth Howell conf=$1 701c9e5d2a6SSeth Howell devname=$2 702c9e5d2a6SSeth Howell rootdir=$3 703c9e5d2a6SSeth Howell operation=$4 704c9e5d2a6SSeth Howell local nbd_path=/dev/nbd0 705c9e5d2a6SSeth Howell local rpc_server=/var/tmp/spdk-gpt-bdevs.sock 706c9e5d2a6SSeth Howell 707c9e5d2a6SSeth Howell if [ ! -e $conf ]; then 708c9e5d2a6SSeth Howell return 1 709c9e5d2a6SSeth Howell fi 710c9e5d2a6SSeth Howell 711c9e5d2a6SSeth Howell if [ -z "$operation" ]; then 712c9e5d2a6SSeth Howell operation="create" 713c9e5d2a6SSeth Howell fi 714c9e5d2a6SSeth Howell 715c9e5d2a6SSeth Howell cp $conf ${conf}.gpt 716c9e5d2a6SSeth Howell echo "[Gpt]" >> ${conf}.gpt 717c9e5d2a6SSeth Howell echo " Disable Yes" >> ${conf}.gpt 718c9e5d2a6SSeth Howell 719c9e5d2a6SSeth Howell $rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -c ${conf}.gpt & 720c9e5d2a6SSeth Howell nbd_pid=$! 721c9e5d2a6SSeth Howell echo "Process nbd pid: $nbd_pid" 722c9e5d2a6SSeth Howell waitforlisten $nbd_pid $rpc_server 723c9e5d2a6SSeth Howell 724793d34e5Spaul luse # Start bdev as an nbd device 725bf9dbae5SPawel Wodkowski nbd_start_disks "$rpc_server" $devname $nbd_path 726c9e5d2a6SSeth Howell 727c9e5d2a6SSeth Howell waitfornbd ${nbd_path:5} 728c9e5d2a6SSeth Howell 729c9e5d2a6SSeth Howell if [ "$operation" = create ]; then 730c9e5d2a6SSeth Howell parted -s $nbd_path mklabel gpt mkpart first '0%' '50%' mkpart second '50%' '100%' 731c9e5d2a6SSeth Howell 732c9e5d2a6SSeth Howell # change the GUID to SPDK GUID value 73307fe6a43SSeth Howell SPDK_GPT_GUID=$(grep SPDK_GPT_PART_TYPE_GUID $rootdir/module/bdev/gpt/gpt.h \ 734c9e5d2a6SSeth Howell | awk -F "(" '{ print $2}' | sed 's/)//g' \ 735fb9c4ee6SKarol Latecki | awk -F ", " '{ print $1 "-" $2 "-" $3 "-" $4 "-" $5}' | sed 's/0x//g') 736c9e5d2a6SSeth Howell sgdisk -t 1:$SPDK_GPT_GUID $nbd_path 737c9e5d2a6SSeth Howell sgdisk -t 2:$SPDK_GPT_GUID $nbd_path 738c9e5d2a6SSeth Howell elif [ "$operation" = reset ]; then 739c9e5d2a6SSeth Howell # clear the partition table 740c9e5d2a6SSeth Howell dd if=/dev/zero of=$nbd_path bs=4096 count=8 oflag=direct 741c9e5d2a6SSeth Howell fi 742c9e5d2a6SSeth Howell 743bf9dbae5SPawel Wodkowski nbd_stop_disks "$rpc_server" $nbd_path 744d891b398SShuhei Matsumoto 745c9e5d2a6SSeth Howell killprocess $nbd_pid 746c9e5d2a6SSeth Howell rm -f ${conf}.gpt 747c9e5d2a6SSeth Howell fi 748c9e5d2a6SSeth Howell 749c9e5d2a6SSeth Howell return 0 750c9e5d2a6SSeth Howell} 751c9e5d2a6SSeth Howell 752c9e5d2a6SSeth Howellfunction discover_bdevs() 753c9e5d2a6SSeth Howell{ 754c9e5d2a6SSeth Howell local rootdir=$1 755c9e5d2a6SSeth Howell local config_file=$2 756c9e5d2a6SSeth Howell local rpc_server=/var/tmp/spdk-discover-bdevs.sock 757c9e5d2a6SSeth Howell 758c9e5d2a6SSeth Howell if [ ! -e $config_file ]; then 759c9e5d2a6SSeth Howell echo "Invalid Configuration File: $config_file" 76039e8a95cSPawel Kaminski return 1 761c9e5d2a6SSeth Howell fi 762c9e5d2a6SSeth Howell 763c9e5d2a6SSeth Howell # Start the bdev service to query for the list of available 764c9e5d2a6SSeth Howell # bdevs. 76533df76dcSSeth Howell $rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 \ 7668e6b1fbdSDariusz Stojaczyk -c $config_file &>/dev/null & 767c9e5d2a6SSeth Howell stubpid=$! 768c9e5d2a6SSeth Howell while ! [ -e /var/run/spdk_bdev0 ]; do 769c9e5d2a6SSeth Howell sleep 1 770c9e5d2a6SSeth Howell done 771c9e5d2a6SSeth Howell 772c9e5d2a6SSeth Howell # Get all of the bdevs 773c9e5d2a6SSeth Howell if [ -z "$rpc_server" ]; then 7742c49e910SMaciej Wawryk $rootdir/scripts/rpc.py bdev_get_bdevs 775c9e5d2a6SSeth Howell else 7762c49e910SMaciej Wawryk $rootdir/scripts/rpc.py -s "$rpc_server" bdev_get_bdevs 777c9e5d2a6SSeth Howell fi 778c9e5d2a6SSeth Howell 779c9e5d2a6SSeth Howell # Shut down the bdev service 780c9e5d2a6SSeth Howell kill $stubpid 781c9e5d2a6SSeth Howell wait $stubpid 782c9e5d2a6SSeth Howell rm -f /var/run/spdk_bdev0 783c9e5d2a6SSeth Howell} 784c9e5d2a6SSeth Howell 78553147e0dSMaciej Wawrykfunction waitforserial() 78653147e0dSMaciej Wawryk{ 78753147e0dSMaciej Wawryk local i=0 78853147e0dSMaciej Wawryk local nvme_device_counter=1 78953147e0dSMaciej Wawryk if [[ -n "$2" ]]; then 79053147e0dSMaciej Wawryk nvme_device_counter=$2 79153147e0dSMaciej Wawryk fi 79253147e0dSMaciej Wawryk 79353147e0dSMaciej Wawryk while [ $(lsblk -l -o NAME,SERIAL | grep -c $1) -lt $nvme_device_counter ]; do 79453147e0dSMaciej Wawryk [ $i -lt 15 ] || break 79553147e0dSMaciej Wawryk i=$((i+1)) 79653147e0dSMaciej Wawryk echo "Waiting for devices" 79753147e0dSMaciej Wawryk sleep 1 79853147e0dSMaciej Wawryk done 79953147e0dSMaciej Wawryk 80053147e0dSMaciej Wawryk if [[ $(lsblk -l -o NAME,SERIAL | grep -c $1) -lt $nvme_device_counter ]]; then 80153147e0dSMaciej Wawryk return 1 80253147e0dSMaciej Wawryk fi 80353147e0dSMaciej Wawryk 80453147e0dSMaciej Wawryk return 0 80553147e0dSMaciej Wawryk} 80653147e0dSMaciej Wawryk 80753147e0dSMaciej Wawrykfunction waitforserial_disconnect() 80853147e0dSMaciej Wawryk{ 80953147e0dSMaciej Wawryk local i=0 81053147e0dSMaciej Wawryk while lsblk -o NAME,SERIAL | grep -q -w $1; do 81153147e0dSMaciej Wawryk [ $i -lt 15 ] || break 81253147e0dSMaciej Wawryk i=$((i+1)) 81353147e0dSMaciej Wawryk echo "Waiting for disconnect devices" 81453147e0dSMaciej Wawryk sleep 1 81553147e0dSMaciej Wawryk done 81653147e0dSMaciej Wawryk 81753147e0dSMaciej Wawryk if lsblk -l -o NAME | grep -q -w $1; then 81853147e0dSMaciej Wawryk return 1 81953147e0dSMaciej Wawryk fi 82053147e0dSMaciej Wawryk 82153147e0dSMaciej Wawryk return 0 82253147e0dSMaciej Wawryk} 82353147e0dSMaciej Wawryk 824e3263286SSeth Howellfunction waitforblk() 825e3263286SSeth Howell{ 826e3263286SSeth Howell local i=0 827e3263286SSeth Howell while ! lsblk -l -o NAME | grep -q -w $1; do 828e3263286SSeth Howell [ $i -lt 15 ] || break 8290f0cd0a8SKarol Latecki i=$((i+1)) 830e3263286SSeth Howell sleep 1 831e3263286SSeth Howell done 832e3263286SSeth Howell 833e3263286SSeth Howell if ! lsblk -l -o NAME | grep -q -w $1; then 834e3263286SSeth Howell return 1 835e3263286SSeth Howell fi 836e3263286SSeth Howell 837e3263286SSeth Howell return 0 838e3263286SSeth Howell} 839e3263286SSeth Howell 8405232a73fSSeth Howellfunction waitforblk_disconnect() 8415232a73fSSeth Howell{ 8425232a73fSSeth Howell local i=0 8435232a73fSSeth Howell while lsblk -l -o NAME | grep -q -w $1; do 8445232a73fSSeth Howell [ $i -lt 15 ] || break 8450f0cd0a8SKarol Latecki i=$((i+1)) 8465232a73fSSeth Howell sleep 1 8475232a73fSSeth Howell done 8485232a73fSSeth Howell 8495232a73fSSeth Howell if lsblk -l -o NAME | grep -q -w $1; then 8505232a73fSSeth Howell return 1 8515232a73fSSeth Howell fi 8525232a73fSSeth Howell 8535232a73fSSeth Howell return 0 8545232a73fSSeth Howell} 8555232a73fSSeth Howell 856b118729fSJim Harrisfunction waitforfile() 857b118729fSJim Harris{ 858b118729fSJim Harris local i=0 859a44c7434STomasz Kulasek while [ ! -e $1 ]; do 860b118729fSJim Harris [ $i -lt 200 ] || break 8610f0cd0a8SKarol Latecki i=$((i+1)) 862b118729fSJim Harris sleep 0.1 863b118729fSJim Harris done 864b118729fSJim Harris 865a44c7434STomasz Kulasek if [ ! -e $1 ]; then 866b118729fSJim Harris return 1 867b118729fSJim Harris fi 868b118729fSJim Harris 869b118729fSJim Harris return 0 870b118729fSJim Harris} 871b118729fSJim Harris 872c9e5d2a6SSeth Howellfunction fio_config_gen() 873c9e5d2a6SSeth Howell{ 874c9e5d2a6SSeth Howell local config_file=$1 875c9e5d2a6SSeth Howell local workload=$2 8763fbc84d3SGangCao local bdev_type=$3 8773fbc84d3SGangCao local fio_dir="/usr/src/fio" 878c9e5d2a6SSeth Howell 879c9e5d2a6SSeth Howell if [ -e "$config_file" ]; then 880c9e5d2a6SSeth Howell echo "Configuration File Already Exists!: $config_file" 88139e8a95cSPawel Kaminski return 1 882c9e5d2a6SSeth Howell fi 883c9e5d2a6SSeth Howell 884c9e5d2a6SSeth Howell if [ -z "$workload" ]; then 885c9e5d2a6SSeth Howell workload=randrw 886c9e5d2a6SSeth Howell fi 887c9e5d2a6SSeth Howell 888c9e5d2a6SSeth Howell touch $1 889c9e5d2a6SSeth Howell 890c9e5d2a6SSeth Howell cat > $1 << EOL 891c9e5d2a6SSeth Howell[global] 892c9e5d2a6SSeth Howellthread=1 893c9e5d2a6SSeth Howellgroup_reporting=1 894c9e5d2a6SSeth Howelldirect=1 895c9e5d2a6SSeth Howellnorandommap=1 896c9e5d2a6SSeth Howellpercentile_list=50:99:99.9:99.99:99.999 897c9e5d2a6SSeth Howelltime_based=1 898c9e5d2a6SSeth Howellramp_time=0 899c9e5d2a6SSeth HowellEOL 900c9e5d2a6SSeth Howell 901c9e5d2a6SSeth Howell if [ "$workload" == "verify" ]; then 90202925187SMaciej Wawryk cat <<- EOL >> $config_file 90302925187SMaciej Wawryk verify=sha1 90402925187SMaciej Wawryk verify_backlog=1024 90502925187SMaciej Wawryk rw=randwrite 90602925187SMaciej Wawryk EOL 9073fbc84d3SGangCao 9083fbc84d3SGangCao # To avoid potential data race issue due to the AIO device 9093fbc84d3SGangCao # flush mechanism, add the flag to serialize the writes. 9103fbc84d3SGangCao # This is to fix the intermittent IO failure issue of #935 9113fbc84d3SGangCao if [ "$bdev_type" == "AIO" ]; then 9123fbc84d3SGangCao if [[ $($fio_dir/fio --version) == *"fio-3"* ]]; then 9133fbc84d3SGangCao echo "serialize_overlap=1" >> $config_file 9143fbc84d3SGangCao fi 9153fbc84d3SGangCao fi 916c9e5d2a6SSeth Howell elif [ "$workload" == "trim" ]; then 917c9e5d2a6SSeth Howell echo "rw=trimwrite" >> $config_file 918c9e5d2a6SSeth Howell else 919c9e5d2a6SSeth Howell echo "rw=$workload" >> $config_file 920c9e5d2a6SSeth Howell fi 921c9e5d2a6SSeth Howell} 922c9e5d2a6SSeth Howell 923c9e5d2a6SSeth Howellfunction fio_config_add_job() 924c9e5d2a6SSeth Howell{ 925c9e5d2a6SSeth Howell config_file=$1 926c9e5d2a6SSeth Howell filename=$2 927c9e5d2a6SSeth Howell 928c9e5d2a6SSeth Howell if [ ! -e "$config_file" ]; then 929c9e5d2a6SSeth Howell echo "Configuration File Doesn't Exist: $config_file" 93039e8a95cSPawel Kaminski return 1 931c9e5d2a6SSeth Howell fi 932c9e5d2a6SSeth Howell 933c9e5d2a6SSeth Howell if [ -z "$filename" ]; then 934c9e5d2a6SSeth Howell echo "No filename provided" 93539e8a95cSPawel Kaminski return 1 936c9e5d2a6SSeth Howell fi 937c9e5d2a6SSeth Howell 938c9e5d2a6SSeth Howell echo "[job_$filename]" >> $config_file 939c9e5d2a6SSeth Howell echo "filename=$filename" >> $config_file 940c9e5d2a6SSeth Howell} 941c9e5d2a6SSeth Howell 9423b9db6c4STomasz Zawadzkifunction fio_bdev() 9433b9db6c4STomasz Zawadzki{ 9443b9db6c4STomasz Zawadzki # Setup fio binary cmd line 9453b9db6c4STomasz Zawadzki local fio_dir="/usr/src/fio" 9463b9db6c4STomasz Zawadzki local bdev_plugin="$rootdir/examples/bdev/fio_plugin/fio_plugin" 9473b9db6c4STomasz Zawadzki 9481bed9c1fSTomasz Zawadzki # Preload AddressSanitizer library to fio if fio_plugin was compiled with it 949074df1d8SPawel Kaminski local asan_lib 950074df1d8SPawel Kaminski asan_lib=$(ldd $bdev_plugin | grep libasan | awk '{print $3}') 9511bed9c1fSTomasz Zawadzki 9521db9e184SMaciej Wawryk LD_PRELOAD="$asan_lib $bdev_plugin" "$fio_dir"/fio "$@" 9533b9db6c4STomasz Zawadzki} 9543b9db6c4STomasz Zawadzki 9553b9db6c4STomasz Zawadzkifunction fio_nvme() 9563b9db6c4STomasz Zawadzki{ 9573b9db6c4STomasz Zawadzki # Setup fio binary cmd line 9583b9db6c4STomasz Zawadzki local fio_dir="/usr/src/fio" 9593b9db6c4STomasz Zawadzki local nvme_plugin="$rootdir/examples/nvme/fio_plugin/fio_plugin" 9603b9db6c4STomasz Zawadzki 9611bed9c1fSTomasz Zawadzki # Preload AddressSanitizer library to fio if fio_plugin was compiled with it 9621bed9c1fSTomasz Zawadzki asan_lib=$(ldd $nvme_plugin | grep libasan | awk '{print $3}') 9631bed9c1fSTomasz Zawadzki 9641db9e184SMaciej Wawryk LD_PRELOAD="$asan_lib $nvme_plugin" "$fio_dir"/fio "$@" 9653b9db6c4STomasz Zawadzki} 9663b9db6c4STomasz Zawadzki 967c9e5d2a6SSeth Howellfunction get_lvs_free_mb() 968c9e5d2a6SSeth Howell{ 969c9e5d2a6SSeth Howell local lvs_uuid=$1 970074df1d8SPawel Kaminski local lvs_info 971074df1d8SPawel Kaminski local fc 972074df1d8SPawel Kaminski local cs 973074df1d8SPawel Kaminski lvs_info=$($rpc_py bdev_lvol_get_lvstores) 974074df1d8SPawel Kaminski fc=$(jq ".[] | select(.uuid==\"$lvs_uuid\") .free_clusters" <<< "$lvs_info") 975074df1d8SPawel Kaminski cs=$(jq ".[] | select(.uuid==\"$lvs_uuid\") .cluster_size" <<< "$lvs_info") 976c9e5d2a6SSeth Howell 977c9e5d2a6SSeth Howell # Change to MB's 978c9e5d2a6SSeth Howell free_mb=$((fc*cs/1024/1024)) 979c9e5d2a6SSeth Howell echo "$free_mb" 980c9e5d2a6SSeth Howell} 981c9e5d2a6SSeth Howell 982c9e5d2a6SSeth Howellfunction get_bdev_size() 983c9e5d2a6SSeth Howell{ 984c9e5d2a6SSeth Howell local bdev_name=$1 985074df1d8SPawel Kaminski local bdev_info 986074df1d8SPawel Kaminski local bs 987074df1d8SPawel Kaminski local nb 988074df1d8SPawel Kaminski bdev_info=$($rpc_py bdev_get_bdevs -b $bdev_name) 989074df1d8SPawel Kaminski bs=$(jq ".[] .block_size" <<< "$bdev_info") 990074df1d8SPawel Kaminski nb=$(jq ".[] .num_blocks" <<< "$bdev_info") 991c9e5d2a6SSeth Howell 992c9e5d2a6SSeth Howell # Change to MB's 993c9e5d2a6SSeth Howell bdev_size=$((bs*nb/1024/1024)) 994c9e5d2a6SSeth Howell echo "$bdev_size" 995c9e5d2a6SSeth Howell} 996c9e5d2a6SSeth Howell 997d1f9da82SSeth Howellfunction autotest_cleanup() 998d1f9da82SSeth Howell{ 999d1f9da82SSeth Howell $rootdir/scripts/setup.sh reset 1000af32aa1bSKarol Latecki $rootdir/scripts/setup.sh cleanup 1001d63d4d5aSSeth Howell if [ $(uname -s) = "Linux" ]; then 1002d63d4d5aSSeth Howell if grep -q '#define SPDK_CONFIG_IGB_UIO_DRIVER 1' $rootdir/include/spdk/config.h; then 1003d63d4d5aSSeth Howell rmmod igb_uio 1004d63d4d5aSSeth Howell else 1005d63d4d5aSSeth Howell modprobe -r uio_pci_generic 1006d63d4d5aSSeth Howell fi 1007d63d4d5aSSeth Howell fi 10089fda9814STomasz Zawadzki rm -rf "$asan_suppression_file" 1009d1f9da82SSeth Howell} 1010d1f9da82SSeth Howell 101186ee572bSSeth Howellfunction freebsd_update_contigmem_mod() 101286ee572bSSeth Howell{ 1013fb9c4ee6SKarol Latecki if [ $(uname) = FreeBSD ]; then 101486ee572bSSeth Howell kldunload contigmem.ko || true 10151ccc878eSKarol Latecki if [ -n "$WITH_DPDK_DIR" ]; then 1016d68ee5b4SDarek Stojaczyk echo "Warning: SPDK only works on FreeBSD with patches that only exist in SPDK's dpdk submodule" 1017d68ee5b4SDarek Stojaczyk cp -f "$WITH_DPDK_DIR/kmod/contigmem.ko" /boot/modules/ 1018d68ee5b4SDarek Stojaczyk cp -f "$WITH_DPDK_DIR/kmod/contigmem.ko" /boot/kernel/ 1019d68ee5b4SDarek Stojaczyk else 1020d68ee5b4SDarek Stojaczyk cp -f "$rootdir/dpdk/build/kmod/contigmem.ko" /boot/modules/ 1021d68ee5b4SDarek Stojaczyk cp -f "$rootdir/dpdk/build/kmod/contigmem.ko" /boot/kernel/ 1022d68ee5b4SDarek Stojaczyk fi 102386ee572bSSeth Howell fi 102486ee572bSSeth Howell} 102586ee572bSSeth Howell 102628f4299fSMarcin Dziegielewskifunction get_nvme_name_from_bdf { 102728f4299fSMarcin Dziegielewski blkname=() 102828f4299fSMarcin Dziegielewski 102928f4299fSMarcin Dziegielewski nvme_devs=$(lsblk -d --output NAME | grep "^nvme") || true 103028f4299fSMarcin Dziegielewski if [ -z "$nvme_devs" ]; then 103128f4299fSMarcin Dziegielewski return 103228f4299fSMarcin Dziegielewski fi 103328f4299fSMarcin Dziegielewski for dev in $nvme_devs; do 103428f4299fSMarcin Dziegielewski link_name=$(readlink /sys/block/$dev/device/device) || true 103528f4299fSMarcin Dziegielewski if [ -z "$link_name" ]; then 103628f4299fSMarcin Dziegielewski link_name=$(readlink /sys/block/$dev/device) 103728f4299fSMarcin Dziegielewski fi 103828f4299fSMarcin Dziegielewski bdf=$(basename "$link_name") 103928f4299fSMarcin Dziegielewski if [ "$bdf" = "$1" ]; then 104028f4299fSMarcin Dziegielewski blkname+=($dev) 104128f4299fSMarcin Dziegielewski fi 104228f4299fSMarcin Dziegielewski done 104328f4299fSMarcin Dziegielewski 104428f4299fSMarcin Dziegielewski printf '%s\n' "${blkname[@]}" 104528f4299fSMarcin Dziegielewski} 104628f4299fSMarcin Dziegielewski 10472176f081SChunyang Huifunction opal_revert_cleanup { 10482176f081SChunyang Hui $rootdir/app/spdk_tgt/spdk_tgt & 10492176f081SChunyang Hui spdk_tgt_pid=$! 10502176f081SChunyang Hui waitforlisten $spdk_tgt_pid 10512176f081SChunyang Hui 10522176f081SChunyang Hui # OPAL test only runs on the first NVMe device 10532176f081SChunyang Hui # So we just revert the first one here 10542176f081SChunyang Hui bdf=$($rootdir/scripts/gen_nvme.sh --json | jq -r '.config[].params | select(.name=="Nvme0").traddr') 10552176f081SChunyang Hui $rootdir/scripts/rpc.py bdev_nvme_attach_controller -b "nvme0" -t "pcie" -a $bdf 10561a903f9cSBen Walker # Ignore if this fails. 10571a903f9cSBen Walker $rootdir/scripts/rpc.py bdev_nvme_opal_revert -b nvme0 -p test || true 10582176f081SChunyang Hui 10592176f081SChunyang Hui killprocess $spdk_tgt_pid 10602176f081SChunyang Hui} 10612176f081SChunyang Hui 1062c9e5d2a6SSeth Howellset -o errtrace 1063c9e5d2a6SSeth Howelltrap "trap - ERR; print_backtrace >&2" ERR 10647612ac47SDarek Stojaczyk 10657612ac47SDarek StojaczykPS4=' \t \$ ' 10667612ac47SDarek Stojaczykif $SPDK_AUTOTEST_X; then 106739fe5c84SSeth Howell # explicitly enable xtraces, overriding any tracking information. 106839fe5c84SSeth Howell unset XTRACE_DISABLED 106939fe5c84SSeth Howell unset XTRACE_NESTING_LEVEL 10707612ac47SDarek Stojaczyk set -x 10717612ac47SDarek Stojaczyk xtrace_enable 10727612ac47SDarek Stojaczykelse 10737612ac47SDarek Stojaczyk xtrace_restore 10747612ac47SDarek Stojaczykfi 1075