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
59 command="export PATH=/sbin:/usr/sbin:\$PATH; $command"
63 if [ -n "$user" ]; then
66 $DSH $user$node "$command"
69 if [ -n "$user" ]; then
72 $DSH $user $node "$command"
77 # how to run commands on other nodes
78 # You need to make this work on your cluster if you have specified
79 # non-local obd instances above
84 if [ "$host" = "localhost" -o "$host" = `uname -n` ]; then
87 # split $host into $host and $user
89 if [[ $host == *@* ]]; then
93 dsh $host "$user" "$cmds"
97 # checks whether obdecho module is loded on given host.
98 # parameter: 1. hostname
101 remote_shell $host $lsmod | grep obdecho > /dev/null 2>&1
104 # load obdecho.ko or obdecho.o module on host kernel.
107 local host=${unique_hosts[$index]}
108 do_unload_echo[$index]=0
109 if obdecho_loaded $host; then
112 if [ -z "$lustre_root" ]; then
113 remote_shell $host $modprobe obdecho
114 elif [ -f ${lustre_root}/obdecho/obdecho.ko ]; then
115 remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.ko
117 remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.o
119 if obdecho_loaded $host; then
120 do_unload_echo[$index]=1
122 echo Could not install obdecho on $host
129 for ((i = 0; i < ${#unique_hosts[@]}; i++)); do
130 load_obdecho $i || cleanup 1
134 # unload obdecho module from host kernel.
137 local host=${unique_hosts[$index]}
138 if ((${do_unload_echo[$index]})); then
139 remote_shell $host $rmmod obdecho
140 do_unload_echo[$index]=0
144 # returns the device number which is displayed in "lctl device_list"
146 # parameter: 1. hostname
147 # 2. type of device ex: echo_client
148 # 3. name of device ex: ECHO_matrix.linsyssoft.com
153 remote_shell $host $lctl device_list | \
154 awk "{if (\$2 == \"UP\" && \$3 == \"$type\" && \$4 == \"$name\") {\
161 for ((i = 0; i < $count; i++)); do
163 host=${host_list[$i]}
164 dev=$(get_devno $host obdfilter $ost)
166 if [ -z "$dev" ]; then
167 echo Cant find device for $ost on $host
174 # do cleanup for netdisk case.
185 # do cleanup for network case.
187 local clean_srv_OSS=$1
193 remote_shell "root@$server_nid" "$lctl << EOF
198 if [ $clean_srv_OSS ]; then
199 remote_shell "root@$server_nid" "$lctl << EOF
207 # do cleanup and exit.
211 for ((i = 0; i < $ndevs; i++)); do
212 host=${host_names[$i]}
213 if [ -n ${do_teardown_ec[$i]} ]; then
214 teardown_ec_devno $host ${client_names[$i]}
218 for host in ${unique_hosts[@]}; do
219 remote_shell $host "killall -q vmstat >/dev/null 2>&1" &
221 kill -term ${vmstatpids[$pidcount]} 2>/dev/null
222 kill -kill ${vmstatpids[$pidcount]} 2>/dev/null
224 pidcount=$((pidcount+1))
225 if ((${do_unload_obdecho[$host]})); then
229 if [ $case == "network" ]; then
232 if [ $case == "netdisk" ]; then
236 if [ $exit_status ]; then
237 if [ $exit_status -ne 0 ]; then
238 echo "program exited with error "
247 trap cleanup SIGHUP SIGINT SIGTERM
249 # gets echoclient device number and attach it to the client UUID
251 # parameter: 1. hostname
252 # 2. client name, ex:- ns8:ECHO_ns8
253 # 3. name of ost instances, ex:- lustre-OST0001
256 local client_name="$2"
258 if [ -z "$client_name" ]; then
259 if [ -z "$ost_name" ]; then
260 echo "client and ost name both null" 1>&2
263 client_name=${ost_name}_ecc
265 ec=`get_devno $host echo_client $client_name`
266 if [ -n "$ec" ]; then
267 echo $ec $client_name $client_name
270 if [ -z "$ost_name" ]; then
271 echo "no echo client and ost_name not set, client: $client_name, host: $host" 1>&2
274 ost=`get_devno $host obdfilter $ost_name`
275 if [ -z "$ost" ]; then
276 echo "OST $ost_name not setup" 1>&2
279 client_name=${ost_name}_ecc
280 remote_shell $host "$lctl <<EOF
281 attach echo_client $client_name ${client_name}_UUID
284 ec=`get_devno $host echo_client $client_name`
285 if [ -z "$ec" ]; then
286 echo "Can't setup echo-client" 1>&2
289 echo $ec $client_name 1
292 # Create echo-clients using osc_names and osc_uuid
293 # It creates echoclients for all osc listed using #lctl device_list command
297 attach echo_client ${osc_name}_ecc ${osc_name}_ecc_UUID
298 cfg_device ${osc_name}_ecc
304 # create echo client using server nid.
305 ec_using_srv_nid () {
309 $lctl add_uuid echo_UUID $server_nid@tcp >/dev/null 2>&1
311 attach osc $ocsname $oscuuid
313 setup echo_srv_UUID echo_UUID
316 attach echo_client ${ocsname}_ecc $oscuuid
321 setup_osc_for_remote_ost () {
323 local obdfilter_name=$2
324 local host_name=host_$3
325 $lctl add_uuid ${host_name}_UUID $ost_nid@tcp >/dev/null 2>&1
327 attach osc ${obdfilter_name}_osc ${obdfilter_name}_osc_UUID
328 cfg_device ${obdfilter_name}_osc
329 setup ${obdfilter_name}_UUID ${host_name}_UUID
333 # setup obdecho on server
336 local test_ostfsnm=$2
337 remote_shell "root@$server_nid" "$lctl << EOF
338 attach obdecho $test_ostfsnm ${test_ostfsnm}_UUID
339 cfg_device $test_ostfsnm
344 # setup OSS on server
347 remote_shell "root@$server_nid" "$lctl << EOF
348 attach ost OSS OSS_UUID
354 # cleanup and detach the echo-clients that we have created during the test.
355 # parameter: 1. hostname
356 # 2. client name, ex:- ns8:ECHO_ns8
357 teardown_ec_devno () {
360 remote_shell $host "$lctl <<EOF
368 echo "$@" | xargs -n1 echo | sort -u
374 *:*) host=`echo $name | sed 's/:.*$//'`
375 name=`echo $name | sed 's/[^:]*://'`
385 osc_names_str=$($lctl dl | grep $type_obj)
387 for name in $osc_names_str; do
391 if [ $count != 0 ]; then
392 echo "$type_obj could not be cleanup";
400 osc_names_str=$($lctl dl | grep $type_obj)
402 for name in $osc_names_str; do
406 if [ $count == 0 ]; then
407 echo "$type_obj could not be setup";
413 # added from bugzill req.
415 if [ -z "$ost_names" ]; then
416 targets=$($lctl device_list | awk "{if (\$2 == \"UP\" && \
417 \$3 == \"obdfilter\") {print \$4} }")
419 if [ -z "$targets" ]; then
420 echo "Can't find any OSTs to test. Please set targets=..."
424 for name in $targets; do
425 ost_names[$count]=$name
426 str=(`split_hostname $name`)
427 host_names[$count]=${str[0]}
433 # split out hostnames from ost names
434 for ((i = 0; i < count; i++)); do
435 str=(`split_hostname ${targets[$i]}`)
436 host_list[$i]=${str[0]}
437 ost_names[$i]=${str[1]}