4 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License version 2 only,
8 # as published by the Free Software Foundation.
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # General Public License version 2 for more details (a copy is included
14 # in the LICENSE file that accompanied this code).
16 # You should have received a copy of the GNU General Public License
17 # version 2 along with this program; If not, see
18 # http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
20 # Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21 # CA 95054 USA or visit www.sun.com if you need additional information or
26 # Copyright 2008 Sun Microsystems, Inc. All rights reserved
27 # Use is subject to license terms.
29 # This file is part of Lustre, http://www.lustre.org/
30 # Lustre is a trademark of Sun Microsystems, Inc.
32 # Author: Jitendra Pawar <jitendra@clusterfs.com>
37 modprobe="/sbin/modprobe"
42 declare -a client_names
45 declare -a unique_hosts
48 declare -a do_unload_echo
61 command="cd $here; export PATH=/sbin:/usr/sbin:\$PATH; $command"
65 if [ -n "$user" ]; then
68 $DSH $user$node "$command"
71 if [ -n "$user" ]; then
74 $DSH $user $node "$command"
79 # how to run commands on other nodes
80 # You need to make this work on your cluster if you have specified
81 # non-local obd instances above
86 if [ "$host" = "localhost" -o "$host" = `uname -n` ]; then
89 # split $host into $host and $user
91 if [[ $host == *@* ]]; then
95 dsh $host "$user" "$cmds"
99 # checks whether obdecho module is loded on given host.
100 # parameter: 1. hostname
103 remote_shell $host $lsmod | grep obdecho > /dev/null 2>&1
106 # load obdecho.ko or obdecho.o module on host kernel.
109 local host=${unique_hosts[$index]}
110 do_unload_echo[$index]=0
111 if obdecho_loaded $host; then
114 if [ -z "$lustre_root" ]; then
115 remote_shell $host $modprobe obdecho
116 elif [ -f ${lustre_root}/obdecho/obdecho.ko ]; then
117 remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.ko
119 remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.o
121 if obdecho_loaded $host; then
122 do_unload_echo[$index]=1
124 echo Could not install obdecho on $host
131 for ((i = 0; i < ${#unique_hosts[@]}; i++)); do
132 load_obdecho $i || cleanup 1
136 # unload obdecho module from host kernel.
139 local host=${unique_hosts[$index]}
140 if ((${do_unload_echo[$index]})); then
141 remote_shell $host $rmmod obdecho
142 do_unload_echo[$index]=0
146 # returns the device number which is displayed in "lctl device_list"
148 # parameter: 1. hostname
149 # 2. type of device ex: echo_client
150 # 3. name of device ex: ECHO_matrix.linsyssoft.com
155 remote_shell $host $lctl device_list | \
156 awk "{if (\$2 == \"UP\" && \$3 == \"$type\" && \$4 == \"$name\") {\
163 for ((i = 0; i < $count; i++)); do
165 host=${host_list[$i]}
166 dev=$(get_devno $host obdfilter $ost)
168 if [ -z "$dev" ]; then
169 echo Cant find device for $ost on $host
176 # do cleanup for netdisk case.
187 # do cleanup for network case.
189 local clean_srv_OSS=$1
195 remote_shell "root@$server_nid" "$lctl << EOF
200 if [ $clean_srv_OSS ]; then
201 remote_shell "root@$server_nid" "$lctl << EOF
209 # do cleanup and exit.
213 for ((i = 0; i < $ndevs; i++)); do
214 host=${host_names[$i]}
215 if [ -n ${do_teardown_ec[$i]} ]; then
216 teardown_ec_devno $host ${client_names[$i]}
220 for host in ${unique_hosts[@]}; do
221 remote_shell $host "killall -q vmstat >/dev/null 2>&1" &
223 kill -term ${vmstatpids[$pidcount]} 2>/dev/null
224 kill -kill ${vmstatpids[$pidcount]} 2>/dev/null
226 pidcount=$((pidcount+1))
227 if ((${do_unload_obdecho[$host]})); then
231 if [ $case == "network" ]; then
234 if [ $case == "netdisk" ]; then
238 if [ $exit_status ]; then
239 if [ $exit_status -ne 0 ]; then
240 echo "program exited with error "
249 trap cleanup SIGHUP SIGINT SIGTERM
251 # gets echoclient device number and attach it to the client UUID
253 # parameter: 1. hostname
254 # 2. client name, ex:- ns8:ECHO_ns8
255 # 3. name of ost instances, ex:- lustre-OST0001
258 local client_name="$2"
260 if [ -z "$client_name" ]; then
261 if [ -z "$ost_name" ]; then
262 echo "client and ost name both null" 1>&2
265 client_name=${ost_name}_ecc
267 ec=`get_devno $host echo_client $client_name`
268 if [ -n "$ec" ]; then
269 echo $ec $client_name $client_name
272 if [ -z "$ost_name" ]; then
273 echo "no echo client and ost_name not set, client: $client_name, host: $host" 1>&2
276 ost=`get_devno $host obdfilter $ost_name`
277 if [ -z "$ost" ]; then
278 echo "OST $ost_name not setup" 1>&2
281 client_name=${ost_name}_ecc
282 remote_shell $host "$lctl <<EOF
283 attach echo_client $client_name ${client_name}_UUID
286 ec=`get_devno $host echo_client $client_name`
287 if [ -z "$ec" ]; then
288 echo "Can't setup echo-client" 1>&2
291 echo $ec $client_name 1
294 # Create echo-clients using osc_names and osc_uuid
295 # It creates echoclients for all osc listed using #lctl device_list command
299 attach echo_client ${osc_name}_ecc ${osc_name}_ecc_UUID
300 cfg_device ${osc_name}_ecc
306 # create echo client using server nid.
307 ec_using_srv_nid () {
311 $lctl add_uuid echo_UUID $server_nid@tcp >/dev/null 2>&1
313 attach osc $ocsname $oscuuid
315 setup echo_srv_UUID echo_UUID
318 attach echo_client ${ocsname}_ecc $oscuuid
323 setup_osc_for_remote_ost () {
325 local obdfilter_name=$2
326 local host_name=host_$3
327 $lctl add_uuid ${host_name}_UUID $ost_nid@tcp >/dev/null 2>&1
329 attach osc ${obdfilter_name}_osc ${obdfilter_name}_osc_UUID
330 cfg_device ${obdfilter_name}_osc
331 setup ${obdfilter_name}_UUID ${host_name}_UUID
335 # setup obdecho on server
338 local test_ostfsnm=$2
339 remote_shell "root@$server_nid" "$lctl << EOF
340 attach obdecho $test_ostfsnm ${test_ostfsnm}_UUID
341 cfg_device $test_ostfsnm
346 # setup OSS on server
349 remote_shell "root@$server_nid" "$lctl << EOF
350 attach ost OSS OSS_UUID
356 # cleanup and detach the echo-clients that we have created during the test.
357 # parameter: 1. hostname
358 # 2. client name, ex:- ns8:ECHO_ns8
359 teardown_ec_devno () {
362 remote_shell $host "$lctl <<EOF
370 echo "$@" | xargs -n1 echo | sort -u
376 *:*) host=`echo $name | sed 's/:.*$//'`
377 name=`echo $name | sed 's/[^:]*://'`
387 osc_names_str=$($lctl dl | grep $type_obj)
389 for name in $osc_names_str; do
393 if [ $count != 0 ]; then
394 echo "$type_obj could not be cleanup";
402 osc_names_str=$($lctl dl | grep $type_obj)
404 for name in $osc_names_str; do
408 if [ $count == 0 ]; then
409 echo "$type_obj could not be setup";
415 # added from bugzill req.
417 if [ -z "$ost_names" ]; then
418 targets=$($lctl device_list | awk "{if (\$2 == \"UP\" && \
419 \$3 == \"obdfilter\") {print \$4} }")
421 if [ -z "$targets" ]; then
422 echo "Can't find any OSTs to test. Please set targets=..."
426 for name in $targets; do
427 ost_names[$count]=$name
428 str=(`split_hostname $name`)
429 host_names[$count]=${str[0]}
435 # split out hostnames from ost names
436 for ((i = 0; i < count; i++)); do
437 str=(`split_hostname ${targets[$i]}`)
438 host_list[$i]=${str[0]}
439 ost_names[$i]=${str[1]}