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