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