#!/bin/bash
-set -e
######################################################################
# customize per survey
# ... use 'host:name' for obd instances on other nodes.
# allow these to be passed in via string...
# OR
-# one can specify only case=disk or case=network or case=netdisk through
+# one can specify only case=disk or case=network through
# command line.
-# Perquisite: For "disk" case and "netdisk" case you need to have lustre setup
+# Prerequisite: For "disk" case you need to have lustre setup
# with one or more ost's. For "network" case you need to have all
# modules (those llmount.sh loades) loaded in kernel. And the
# 'lctl dl' output must be blank.
# $ nobjhi=2 thrhi=2 size=1024 targets="<name/ip_of_server>" case=network sh obdfilter-survey
# where, targets is name or ip address of system, which you want to
# set as server.
-# case 3 (network and disk):
-# $ nobjhi=2 thrhi=2 size=1024 case=netdisk sh obdfilter-survey
-# one can also run test with user defined targets as follows,
-# $ nobjhi=2 thrhi=2 size=1024 targets="<osc_name> ..." sh obdfilter-survey
#[ NOTE: It is advised to have automated login (passwordless entry) between server and
# client systems on which this test runs.]
echo $minusn "$*"
}
+# Return a numeric version code based on a version string. The version
+# code is useful for comparison two version strings to see which is newer.
version_code() {
# split arguments like "2.3.61" into "2", "3", "61"
eval set -- $(tr "[:punct:]" " " <<< $*)
echo -n "$((($1 << 16) | ($2 << 8) | $3))"
}
+# inspired from the lustre_build_version routine in test-framework.sh
get_lustre_version() {
local host=${1:-${unique_hosts[0]}}
- remote_shell $host $lctl get_param -n version |
- awk '/^lustre:/ {print $2}'
+ local ver
+
+ ver=$(remote_shell $host "$lctl get_param -n version 2>/dev/null ||
+ $lctl lustre_build_version 2>/dev/null ||
+ $lctl --version 2>/dev/null | cut -d' ' -f2")
+ local lver=$(egrep -i "lustre: |version: " <<<$ver | head -n 1)
+ [ -n "$lver" ] && ver="$lver"
+
+ sed -e 's/.*: //' -e 's/^v//' -e 's/-.*//' -e 's/_/./g' <<<$ver |
+ cut -d. -f1-4
}
# Check whether the record size (KBytes) exceeds the maximum bulk I/O RPC size
restart_nobj=1
# machine's page size (KB)
-PAGE_SIZE=${PAGE_SIZE:-$(($(getconf PAGE_SIZE) / 1024))}
-PAGE_SIZE=${PAGE_SIZE:-4}
+PAGE_SIZE_KB=${PAGE_SIZE_KB:-$(( ${PAGE_SIZE:-$(getconf PAGE_SIZE)} / 1024))}
+PAGE_SIZE_KB=${PAGE_SIZE_KB:-4}
snap=1
clean_srv_OSS=0
fi
if [ -z "$lustre_root" ]; then
- lctl=lctl
+ lctl=$LCTL
else
lctl=${lustre_root}/utils/lctl
fi
ost_names[$i]=${client_names[$i]}
done
fi
-if [ $case == "netdisk" ]; then
- if [ "$targets" ]; then
- for ((i = 0; i < $ndevs; i++)); do
- setup_osc_for_remote_ost ${host_names[$i]} \
- ${client_names[$i]} $i
- osc_name=${client_names[$i]}_osc
- ec_using_osc $osc_name
- cleanup_oscs="$cleanup_oscs $osc_name"
- done
- else
- client_names_str=$($lctl dl | grep -v mdt |
- awk '{if ($2 == "UP" && $3 == "osc") {print $4} }')
- count=0;
- for name in $client_names_str; do
- client_names[$count]=$(echo $name | sed 's/-osc-.*$//')
- count=$((count + 1))
- done
-
- host_names_str=$($lctl dl -t | grep -v mdt |
- awk '{if ($2 == "UP" && $3 == "osc") {print $7} }')
- count=0;
- for name in $host_names_str; do
- host_names[$count]=$(echo $name | sed 's/@.*$//')
- count=$((count + 1))
- done
-
- for (( i = 0; i < $count; i++ )) do
- setup_osc_for_remote_ost ${host_names[$i]} \
- ${client_names[$i]} $i
- osc_name=${client_names[$i]}_osc
- ec_using_osc $osc_name
- cleanup_oscs="$cleanup_oscs $osc_name"
- done
- fi
-
- echo_clients=$($lctl dl | grep echo_client |
- awk "{if (\$2 == \"UP\" && \$3 == \"echo_client\") { \
- print \$4} }")
- cnt=0;
- for name in $echo_clients; do
- client_names[$cnt]=$name
- host_names[$cnt]=localhost
- cnt=$((cnt + 1))
- done
- ndevs=${#client_names[@]}
-fi
if [ $case == "network" ]; then
server_nid=$targets
if [ -z "$server_nid" ]; then
exit 1
fi
# Now start client setup
- osc_names_str=$($lctl dl| grep osc | grep -v mdt | grep UP)
+ osc_names_str=$($lctl dl| grep osc | grep -v mdt | grep UP || true)
if [ -n "$osc_names_str" ]; then
echo "The existing setup must be cleaned";
exit 0;
host=${host_names[$i]}
devno=($(get_ec_devno $host "${client_names[$i]}" "${ost_names[$i]}"))
if ((${#devno[@]} != 3)); then
- exit 1
+ cleanup 2
fi
devnos[$i]=${devno[0]}
client_names[$i]=${devno[1]}
done
if (($ndevs <= 0 || ${#host_names[@]} <= 0)); then
echo "no devices or hosts specified"
- cleanup 0 $clean_srv_OSS $cleanup_oscs
+ cleanup 0 $clean_srv_OSS
fi
print_summary "$(date) Obdfilter-survey for case=$case from $(hostname)"
# compute parameters
total_thr=$((ndevs * thr))
total_nobj=$((ndevs * nobj))
- pages=$((rsz / PAGE_SIZE))
- actual_rsz=$((pages * PAGE_SIZE))
+ pages=$(( (rsz + PAGE_SIZE_KB - 1) / PAGE_SIZE_KB))
+ actual_rsz=$((pages * PAGE_SIZE_KB))
count=$((size * 1024 / (actual_rsz * thr)))
actual_size=$((actual_rsz * count * thr))
total_size=$((actual_size * ndevs))
rm $tmpf
if [ $first_obj = "ERROR" ]; then
print_summary "created object #s on $client_name not contiguous"
- exit 1
+ cleanup 3
fi
first_objs[$idx]=$first_obj
done # $ndevs
declare -a pidarray
for host in ${unique_hosts[@]}; do
remote_shell $host \
- "lctl set_param -n osd*.*OST*.force_sync 1"
+ "lctl set_param -n osd*.*.force_sync 1 &>/dev/null || true"
echo "starting run for test: $test rsz: $rsz " \
"threads: $thr objects: $nobj" >> ${vmstatf}_${host}
done
done # $thr
done # $nobj
done # $rsz
-cleanup 0 $clean_srv_OSS $cleanup_oscs
+cleanup 0 $clean_srv_OSS
exit 0