Whamcloud - gitweb
b=19387 integrate LST into acc-sm
authorElena Gryaznova <grev@sun.com>
Wed, 13 Jan 2010 22:28:01 +0000 (01:28 +0300)
committerJohann Lombardi <johann@sun.com>
Wed, 13 Jan 2010 22:32:11 +0000 (23:32 +0100)
i=Maxim.Patlasov
i=He.Huang

new acc-sm test suite: LNET_SELFTEST

lustre/tests/Makefile.am
lustre/tests/acceptance-small.sh
lustre/tests/functions.sh
lustre/tests/lnet-selftest.sh [new file with mode: 0755]
lustre/tests/test-framework.sh

index 5155eaa..9198eaf 100644 (file)
@@ -22,7 +22,7 @@ noinst_SCRIPTS += lockorder.sh socketclient socketserver runmultiop_bg_pause
 noinst_SCRIPTS += recovery-mds-scale.sh run_dd.sh run_tar.sh run_iozone.sh
 noinst_SCRIPTS += run_dbench.sh run_IOR.sh recovery-double-scale.sh
 noinst_SCRIPTS += recovery-random-scale.sh parallel-scale.sh metadata-updates.sh
-noinst_SCRIPTS += ost-pools.sh rpc.sh
+noinst_SCRIPTS += ost-pools.sh rpc.sh lnet-selftest.sh
 nobase_noinst_SCRIPTS = cfg/local.sh
 nobase_noinst_SCRIPTS += acl/make-tree acl/run cfg/ncli.sh
 nobase_noinst_SCRIPTS += racer/dir_create.sh racer/file_create.sh racer/file_list.sh
index 3b1e3d7..2e7b4b7 100755 (executable)
@@ -23,7 +23,7 @@ fi
 [ "$DEBUG_OFF" ] || DEBUG_OFF="eval lctl set_param debug=\"$DEBUG_LVL\""
 [ "$DEBUG_ON" ] || DEBUG_ON="eval lctl set_param debug=0x33f0484"
 
-export TESTSUITE_LIST="RUNTESTS SANITY DBENCH BONNIE IOZONE FSX SANITYN LFSCK LIBLUSTRE RACER REPLAY_SINGLE CONF_SANITY RECOVERY_SMALL REPLAY_OST_SINGLE REPLAY_DUAL REPLAY_VBR INSANITY SANITY_QUOTA PERFORMANCE_SANITY LARGE_SCALE RECOVERY_MDS_SCALE RECOVERY_DOUBLE_SCALE RECOVERY_RANDOM_SCALE PARALLEL_SCALE METADATA_UPDATES OST_POOLS SANITY_BENCHMARK"
+export TESTSUITE_LIST="RUNTESTS SANITY DBENCH BONNIE IOZONE FSX SANITYN LFSCK LIBLUSTRE RACER REPLAY_SINGLE CONF_SANITY RECOVERY_SMALL REPLAY_OST_SINGLE REPLAY_DUAL REPLAY_VBR INSANITY SANITY_QUOTA PERFORMANCE_SANITY LARGE_SCALE RECOVERY_MDS_SCALE RECOVERY_DOUBLE_SCALE RECOVERY_RANDOM_SCALE PARALLEL_SCALE METADATA_UPDATES OST_POOLS SANITY_BENCHMARK LNET_SELFTEST"
 
 if [ "$ACC_SM_ONLY" ]; then
     for O in $TESTSUITE_LIST; do
@@ -468,6 +468,12 @@ if [ "$OST_POOLS" != "no" ]; then
         OST_POOLS="done"
 fi
 
+if [ "$LNET_SELFTEST" != "no" ]; then
+        title lnet-selftest
+        bash lnet-selftest.sh
+        LNET_SELFTEST="done"
+fi
+
 RC=$?
 title FINISHED
 echo "Finished at `date` in $((`date +%s` - $STARTTIME))s"
index 83f109d..1dd9ac5 100644 (file)
@@ -48,3 +48,53 @@ mpi_run () {
     return $rc
 }
 
+nids_list () {
+   local list
+   for i in ${1//,/ }; do
+       list="$list $i@$NETTYPE"
+   done
+   echo $list
+}
+
+# FIXME: all setup/cleanup can be done without rpc.sh
+lst_end_session () {
+    local verbose=false
+    [ x$1 = x--verbose ] && verbose=true
+
+    export LST_SESSION=`$LST show_session 2>/dev/null | awk -F " " '{print $5}'`
+    [ "$LST_SESSION" == "" ] && return
+
+    if $verbose; then 
+        $LST show_error c s
+    fi
+    $LST stop b
+    $LST end_session
+}
+
+lst_session_cleanup_all () {
+    local list=$(comma_list $(nodes_list))
+    do_rpc_nodes $list lst_end_session
+}
+
+lst_cleanup () {
+    lsmod | grep -q lnet_selftest && rmmod lnet_selftest > /dev/null 2>&1 || true
+}
+
+lst_cleanup_all () {
+   local list=$(comma_list $(nodes_list))
+
+   # lst end_session needs to be executed only locally
+   # i.e. on node where lst new_session was called
+   lst_end_session --verbose 
+   do_rpc_nodes $list lst_cleanup
+}
+
+lst_setup () {
+    load_module lnet_selftest
+}
+
+lst_setup_all () {
+    local list=$(comma_list $(nodes_list))
+    do_rpc_nodes $list lst_setup 
+}
+
diff --git a/lustre/tests/lnet-selftest.sh b/lustre/tests/lnet-selftest.sh
new file mode 100755 (executable)
index 0000000..9374cf0
--- /dev/null
@@ -0,0 +1,161 @@
+#!/bin/sh
+
+LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
+. $LUSTRE/tests/test-framework.sh
+init_test_env $@
+. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
+
+#
+ALWAYS_EXCEPT="$ALWAYS_EXCEPT $LNET_SELFTEST_EXCEPT"
+
+[ x$LST = x ] &&  { skip_env "$0 : lst not found LST=$LST" && exit 0; }
+
+# FIXME: what is the reasonable value here?
+lst_LOOP=${lst_LOOP:-100000}
+lst_CONCR=${lst_CONCR:-"1 2 4 8"}
+lst_SIZES=${lst_SIZES:-"4k 8k 256k 1M"}
+if [ "$SLOW" = no ]; then
+    lst_CONCR="1 8"
+    lst_SIZES="4k 1M"
+    lst_LOOP=1000
+fi
+
+smoke_DURATION=${smoke_DURATION:-1800}
+if [ "$SLOW" = no ]; then
+    [ $smoke_DURATION -le 300 ] || smoke_DURATION=300
+fi
+
+lst_SERVERS=${lst_SERVERS:-$(comma_list $(osts_nodes) $mds_HOST)}
+lst_CLIENTS=${lst_CLIENTS:-${CLIENTS:-`hostname`}}
+
+is_mounted () {
+    local mntpt=$1
+    local mounted=$(mounted_lustre_filesystems)
+    echo $mounted' ' | grep -w -q $mntpt' '
+}
+
+if local_mode; then
+   lst_SERVERS=`hostname`
+   lst_CLIENTS=`hostname`
+fi
+
+# FIXME: do we really need to unload lustre modules on all nodes?
+# bug 19387, comment 9
+# unloading lustre modules is not strictly necessary but unmounting
+# /mnt/lustre before running lst would be useful:
+# 1) because lustre messages clutter logs - we needn't them for testing LNET
+# 2) it's theoretically possible that lst tests congest comm paths so tightly
+# that mounted lustre wouldn't able to perform some of its background activities
+if is_mounted $MOUNT || is_mounted $MOUNT2; then
+    local_mode && CLIENTONLY=yes
+    stopall
+    RESTORE_MOUNT=yes
+fi
+
+build_test_filter
+
+lst_prepare () {
+    # Workaround for bug 15619
+    lst_cleanup_all
+    lst_setup_all
+}
+
+# make batch
+test_smoke_sub () {
+    local servers=$1
+    local clients=$2
+
+
+    local nc=$(echo ${clients//,/ } | wc -w)
+    local ns=$(echo ${servers//,/ } | wc -w)
+    echo '#!/bin/bash'
+    echo 'set -e'
+
+    echo 'cleanup () { trap 0; echo killing $1 ... ; kill -9 $1 || true; }'
+
+    echo "$LST new_session --timeo 100000 hh"
+    echo "$LST add_group c $(nids_list $clients)"
+    echo "$LST add_group s $(nids_list $servers)"
+    echo "$LST add_batch b"
+
+    pre="$LST add_test --batch b --loop $lst_LOOP "
+    for t in "brw read" "brw write" ; do
+        for s in $lst_SIZES; do
+            for c in $lst_CONCR; do
+                for d in "${nc}:${ns} --from c --to s" "${ns}:${nc} --from s --to c"; do
+                    echo -n "$pre"
+                    echo " --concurrency $c --distribute $d $t check=full size=$s"
+                 done
+            done
+        done
+    done
+
+    for c in $lst_CONCR; do
+        for d in "${nc}:${ns} --from c --to s" "${ns}:${nc} --from s --to c"; do
+            echo -n "$pre"
+            echo " --concurrency $c --distribute $d ping "
+        done
+    done
+
+    echo $LST run b
+    echo sleep 1
+    echo "$LST stat --delay 10 c s &"
+    echo 'pid=$!'
+    echo 'trap "cleanup $pid" INT TERM'
+    echo sleep $smoke_DURATION
+    echo 'cleanup $pid'
+    
+}
+
+run_lst () {
+   local file=$1
+
+   export LST_SESSION=$$
+
+   # start lst
+   sh $file
+}
+
+check_lst_err () {
+   local log=$1
+
+   grep ^Total $log
+
+   if awk '/^Total.*nodes/ {print $2}' $log | grep -vq '^0$'; then
+        error 'lst Error found'
+   fi
+}
+
+test_smoke () {
+    lst_prepare
+
+    local servers=$lst_SERVERS
+    local clients=$lst_CLIENTS
+
+    local runlst=$TMP/smoke.sh
+
+    local log=$TMP/$tfile.log
+    local rc=0
+
+    test_smoke_sub $servers $clients 2>&1 > $runlst 
+
+    cat $runlst
+
+    run_lst $runlst | tee $log
+    rc=${PIPESTATUS[0]}
+    [ $rc = 0 ] || error "$runlst failed: $rc"
+    
+    lst_end_session --verbose | tee -a $log
+
+    # error counters in "lst show_error" should be checked
+    check_lst_err $log
+    
+}
+run_test smoke "lst regression test"
+
+equals_msg `basename $0`: test complete, cleaning up
+if [ "$RESTORE_MOUNT" = yes ]; then
+    setupall
+fi 
+[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true
+
index b326bc5..7d2e70b 100644 (file)
@@ -110,6 +110,8 @@ init_test_env() {
     if ! echo $PATH | grep -q $LUSTRE/test; then
        export PATH=$PATH:$LUSTRE/tests
     fi
+    export LST=${LST:-"$LUSTRE/../lnet/utils/lst"}
+    [ ! -f "$LST" ] && export LST=$(which lst)
     export MDSRATE=${MDSRATE:-"$LUSTRE/tests/mpi/mdsrate"}
     [ ! -f "$MDSRATE" ] && export MDSRATE=$(which mdsrate 2> /dev/null)
     if ! echo $PATH | grep -q $LUSTRE/tests/racer; then
@@ -224,7 +226,11 @@ load_module() {
 
     module_loaded ${BASE} && return
 
-    if [ -f ${LUSTRE}/${module}${EXT} ]; then
+    if [ "$BASE" == "lnet_selftest" ] && \
+            [ -f ${LUSTRE}/../lnet/selftest/${module}${EXT} ]; then
+        insmod ${LUSTRE}/../lnet/selftest/${module}${EXT}
+
+    elif [ -f ${LUSTRE}/${module}${EXT} ]; then
         insmod ${LUSTRE}/${module}${EXT} $@
     else
         # must be testing a "make install" or "rpm" installation
@@ -324,9 +330,11 @@ unload_modules() {
 
     if $LOAD_MODULES_REMOTE ; then
         local list=$(comma_list $(remote_nodes_list))
-        echo unloading modules on $list
-        do_rpc_nodes $list $LUSTRE_RMMOD $FSTYPE
-        do_rpc_nodes $list check_mem_leak
+        if [ ! -z $list ]; then
+            echo unloading modules on $list
+            do_rpc_nodes $list $LUSTRE_RMMOD $FSTYPE
+            do_rpc_nodes $list check_mem_leak
+        fi
     fi
 
     $LUSTRE_RMMOD $FSTYPE || return 2
@@ -2386,6 +2394,12 @@ remote_servers () {
     remote_ost && remote_mds
 }
 
+local_mode ()
+{
+    remote_mds_nodsh || remote_ost_nodsh || \
+        $(single_local_node $(comma_list $(nodes_list)))
+}
+
 osts_nodes () {
     local OSTNODES=$(facet_host ost1)
     local NODES_sort