IDENTITY_UPCALL=false
;;
esac
+ export LOAD_MODULES_REMOTE=${LOAD_MODULES_REMOTE:-false}
# Paths on remote nodes, if different
export RLUSTRE=${RLUSTRE:-$LUSTRE}
export RPWD=${RPWD:-$PWD}
export I_MOUNTED=${I_MOUNTED:-"no"}
+ if [ ! -f /lib/modules/$(uname -r)/kernel/fs/lustre/mds.ko -a \
+ ! -f `dirname $0`/../mds/mds.ko ]; then
+ export CLIENTMODSONLY=yes
+ fi
# command line
fi
}
-load_modules() {
+load_modules_local() {
if [ -n "$MODPROBE" ]; then
# use modprobe
return 0
load_module osc/osc
load_module lov/lov
load_module mgc/mgc
- if [ -z "$CLIENTONLY" ] && [ -z "$CLIENTMODSONLY" ]; then
+ if ! client_only; then
grep -q crc16 /proc/kallsyms || { modprobe crc16 2>/dev/null || true; }
grep -q jbd /proc/kallsyms || { modprobe jbd 2>/dev/null || true; }
[ "$FSTYPE" = "ldiskfs" ] && load_module ../ldiskfs/ldiskfs/ldiskfs
[ -f $LUSTRE/utils/mount.lustre ] && cp $LUSTRE/utils/mount.lustre /sbin/. || true
}
+load_modules () {
+ load_modules_local
+ # bug 19124
+ # load modules on remote nodes optionally
+ # lustre-tests have to be installed on these nodes
+ if $LOAD_MODULES_REMOTE ; then
+ local list=$(comma_list $(remote_nodes_list))
+ echo loading modules on $list
+ do_rpc_nodes $list load_modules
+ fi
+}
+
check_mem_leak () {
LEAK_LUSTRE=$(dmesg | tail -n 30 | grep "obd_memory.*leaked" || true)
LEAK_PORTALS=$(dmesg | tail -n 20 | grep "Portals memory leaked" || true)
$LUSTRE_RMMOD $FSTYPE || return 2
+ 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
+ fi
+
HAVE_MODULES=false
check_mem_leak || return 254
echo $(comma_list $expanded)
}
+testslist_filter () {
+ local script=$LUSTRE/tests/${TESTSUITE}.sh
+
+ [ -f $script ] || return 0
+
+ local start_at=$START_AT
+ local stop_at=$STOP_AT
+
+ local var=${TESTSUITE}_START_AT
+ [ x"${!var}" != x ] && start_at=${!var}
+ var=${TESTSUITE}_STOP_AT
+ [ x"${!var}" != x ] && stop_at=${!var}
+
+ sed -n 's/^test_\([^ (]*\).*/\1/p' $script | \
+ awk ' BEGIN { if ("'${start_at:-0}'" != 0) flag = 1 }
+ /^'${start_at}'$/ {flag = 0}
+ {if (flag == 1) print $0}
+ /^'${stop_at}'$/ { flag = 1 }'
+}
+
absolute_path() {
(cd `dirname $1`; echo $PWD/`basename $1`)
}
}
build_test_filter() {
+ EXCEPT="$EXCEPT $(testslist_filter)"
+
[ "$ONLY" ] && log "only running test `echo $ONLY`"
for O in $ONLY; do
eval ONLY_${O}=true
echo ${nodes[i]}
}
+client_only () {
+ [ "$CLIENTONLY" ] || [ "$CLIENTMODSONLY" = yes ]
+}
+
is_patchless ()
{
lctl get_param version | grep -q patchless
}
########################
-convert_facet2name() {
- case "$1" in
- "ost" ) echo "OST0000" ;;
- "ost1") echo "OST0000" ;;
- "ost2") echo "OST0001" ;;
- "ost3") echo "OST0002" ;;
- "ost4") echo "OST0003" ;;
- "ost5") echo "OST0004" ;;
- *) error "unknown facet!" ;;
- esac
+
+convert_facet2label() {
+ local facet=$1
+
+ if [ x$facet = xost ]; then
+ facet=ost1
+ fi
+
+ local varsvc=${facet}_svc
+
+ if [ -n ${!varsvc} ]; then
+ echo ${!varsvc}
+ else
+ error "No lablel for $facet!"
+ fi
}
get_clientosc_proc_path() {
}
get_osc_import_name() {
- local node=$1
+ local facet=$1
local ost=$2
- local name=$(convert_facet2name $ost)
+ local label=$(convert_facet2label $ost)
- if [ "$node" == "mds" ]; then
- get_mdtosc_proc_path $name
+ if [ "$facet" == "mds" ]; then
+ get_mdtosc_proc_path $label
return 0
fi
- get_clientosc_proc_path $name
+ get_clientosc_proc_path $label
+ return 0
+}
+
+wait_import_state () {
+ local expected=$1
+ local CONN_PROC=$2
+ local CONN_STATE
+ local i=0
+
+ CONN_STATE=$($LCTL get_param -n $CONN_PROC 2>/dev/null | cut -f2)
+ while [ "${CONN_STATE}" != "${expected}" ]; do
+ if [ "${expected}" == "DISCONN" ]; then
+ # for disconn we can check after proc entry is removed
+ [ "x${CONN_STATE}" == "x" ] && return 0
+ # with AT we can have connect request timeout ~ reconnect timeout
+ # and test can't see real disconnect
+ [ "${CONN_STATE}" == "CONNECTING" ] && return 0
+ fi
+ # disconnect rpc should be wait not more obd_timeout
+ [ $i -ge $(($TIMEOUT * 3 / 2)) ] && \
+ error "can't put import for $CONN_PROC into ${expected} state" && return 1
+ sleep 1
+ CONN_STATE=$($LCTL get_param -n $CONN_PROC 2>/dev/null | cut -f2)
+ i=$(($i + 1))
+ done
+
+ log "$CONN_PROC now in ${CONN_STATE} state"
return 0
}
wait_osc_import_state() {
- local node=$1
+ local facet=$1
local ost_facet=$2
local expected=$3
- local ost=$(get_osc_import_name $node $ost_facet)
+ local ost=$(get_osc_import_name $facet $ost_facet)
local CONN_PROC
local CONN_STATE
local i=0
- CONN_PROC="osc.${FSNAME}-${ost}.ost_server_uuid"
- CONN_STATE=$(do_facet $node lctl get_param -n $CONN_PROC 2>/dev/null | cut -f2)
+ CONN_PROC="osc.${ost}.ost_server_uuid"
+ CONN_STATE=$(do_facet $facet lctl get_param -n $CONN_PROC 2>/dev/null | cut -f2)
while [ "${CONN_STATE}" != "${expected}" ]; do
if [ "${expected}" == "DISCONN" ]; then
# for disconn we can check after proc entry is removed
[ $i -ge $(($TIMEOUT * 3 / 2)) ] && \
error "can't put import for ${ost}(${ost_facet}) into ${expected} state" && return 1
sleep 1
- CONN_STATE=$(do_facet $node lctl get_param -n $CONN_PROC 2>/dev/null | cut -f2)
+ CONN_STATE=$(do_facet $facet lctl get_param -n $CONN_PROC 2>/dev/null | cut -f2)
i=$(($i + 1))
done
log "${ost_facet} now in ${CONN_STATE} state"
return 0
}
+
+get_clientmdc_proc_path() {
+ echo "${1}-mdc-*"
+}
+
+do_rpc_nodes () {
+ local list=$1
+ shift
+
+ do_nodes --verbose $list "PATH=$LUSTRE/tests/:$PATH sh rpc.sh $@ "
+}
+
+wait_clients_import_state () {
+ local list=$1
+ local facet=$2
+ local expected=$3
+ shift
+
+ local label=$(convert_facet2label $facet)
+ local proc_path
+ case $facet in
+ ost* ) proc_path="osc.$(get_clientosc_proc_path $label).ost_server_uuid" ;;
+ mds* ) proc_path="mdc.$(get_clientmdc_proc_path $label).mds_server_uuid" ;;
+ *) error "unknown facet!" ;;
+ esac
+
+
+ if ! do_rpc_nodes $list wait_import_state $expected $proc_path; then
+ error "import is not in ${expected} state"
+ return 1
+ fi
+}
+
+oos_full() {
+ local -a AVAILA
+ local -a GRANTA
+ local OSCFULL=1
+ AVAILA=($(do_nodes $(comma_list $(osts_nodes)) \
+ $LCTL get_param obdfilter.*.kbytesavail))
+ GRANTA=($(do_nodes $(comma_list $(osts_nodes)) \
+ $LCTL get_param -n obdfilter.*.tot_granted))
+ for ((i=0; i<${#AVAILA[@]}; i++)); do
+ local -a AVAIL1=(${AVAILA[$i]//=/ })
+ GRANT=$((${GRANTA[$i]}/1024))
+ echo -n $(echo ${AVAIL1[0]} | cut -d"." -f2) avl=${AVAIL1[1]} grnt=$GRANT diff=$((AVAIL1[1] - GRANT))
+ [ $((AVAIL1[1] - GRANT)) -lt 400 ] && OSCFULL=0 && echo " FULL" || echo
+ done
+ return $OSCFULL
+}
+
+gather_logs () {
+ local list=$1
+
+ local ts=$(date +%s)
+
+ # bug 20237, comment 11
+ # It would also be useful to provide the option
+ # of writing the file to an NFS directory so it doesn't need to be copied.
+ local tmp=$TMP
+ local docp=true
+ [ -d "$SHARED_DIR_LOGS" ] && tmp=$SHARED_DIR_LOGS && docp=false
+
+ # dump lustre logs, dmesg
+ do_nodes $list "log=$tmp/\\\$(hostname)-debug-$ts.log ;
+lctl dk \\\$log >/dev/null;
+log=$tmp/\\\$(hostname)-dmesg-$ts.log;
+dmesg > \\\$log; "
+
+ # FIXME: does it make sense to collect the logs for $ts only, but all
+ # TESTSUITE logs?
+ # rsync $TMP/*${TESTSUITE}* to gather the logs dumped by error fn
+ local logs=$TMP/'*'${TESTSUITE}'*'
+ if $docp; then
+ logs=$logs' '$tmp/'*'$ts'*'
+ fi
+ for node in ${list//,/ }; do
+ rsync -az $node:"$logs" $TMP
+ done
+
+ local archive=$TMP/${TESTSUITE}-$ts.tar.bz2
+ tar -jcf $archive $tmp/*$ts* $TMP/*${TESTSUITE}*
+
+ echo $archive
+}
+
+cleanup_logs () {
+ local list=${1:-$(comma_list $(nodes_list))}
+
+ [ -n ${TESTSUITE} ] && do_nodes $list "rm -f $TMP/*${TESTSUITE}*" || true
+}
+