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 # Copyright (c) 2012, Whamcloud, Inc.
31 # This file is part of Lustre, http://www.lustre.org/
32 # Lustre is a trademark of Sun Microsystems, Inc.
34 # Author: Jitendra Pawar <jitendra@clusterfs.com>
39 modprobe="/sbin/modprobe"
44 declare -a client_names
47 declare -a unique_hosts
50 declare -a do_unload_echo
54 NETTYPE=${NETTYPE:-tcp}
62 command="export PATH=/sbin:/usr/sbin:\$PATH; $command"
66 if [ -n "$user" ]; then
69 $DSH $user$node "$command"
72 if [ -n "$user" ]; then
75 $DSH $user $node "$command"
80 # how to run commands on other nodes
81 # You need to make this work on your cluster if you have specified
82 # non-local obd instances above
87 if [ "$host" = "localhost" -o "$host" = `uname -n` ]; then
90 # split $host into $host and $user
92 if [[ $host == *@* ]]; then
96 dsh $host "$user" "$cmds"
100 # checks whether obdecho module is loded on given host.
101 # parameter: 1. hostname
104 remote_shell $host $lsmod | grep obdecho > /dev/null 2>&1
107 # load obdecho.ko or obdecho.o module on host kernel.
110 local host=${unique_hosts[$index]}
111 do_unload_echo[$index]=0
112 if obdecho_loaded $host; then
115 if [ -z "$lustre_root" ]; then
116 remote_shell $host $modprobe obdecho
117 elif [ -f ${lustre_root}/obdecho/obdecho.ko ]; then
118 remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.ko
120 remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.o
122 if obdecho_loaded $host; then
123 do_unload_echo[$index]=1
125 echo Could not install obdecho on $host
132 for ((i = 0; i < ${#unique_hosts[@]}; i++)); do
133 load_obdecho $i || cleanup 1
137 # unload obdecho module from host kernel.
140 local host=${unique_hosts[$index]}
141 if ((${do_unload_echo[$index]})); then
142 remote_shell $host $rmmod obdecho
143 do_unload_echo[$index]=0
147 # returns the device number which is displayed in "lctl device_list"
149 # parameter: 1. hostname
150 # 2. type of device ex: echo_client
151 # 3. name of device ex: ECHO_matrix.linsyssoft.com
156 remote_shell $host $lctl device_list | \
157 awk "{if (\$2 == \"UP\" && \$3 == \"$type\" && \$4 == \"$name\") {\
164 for ((i = 0; i < $count; i++)); do
166 host=${host_list[$i]}
167 dev=$(get_devno $host obdfilter $ost)
169 if [ -z "$dev" ]; then
170 echo Cant find device for $ost on $host
177 # do cleanup for netdisk case.
188 # do cleanup for network case.
190 local clean_srv_OSS=$1
196 remote_shell "root@$server_nid" \
202 if [ $clean_srv_OSS ]; then
203 remote_shell "root@$server_nid" \
212 # do cleanup and exit.
218 for ((i = 0; i < $ndevs; i++)); do
219 host=${host_names[$i]}
220 if [[ -n "${do_teardown_ec[$i]}" ]]; then
221 teardown_ec_devno $host ${client_names[$i]}
225 for ((i = 0; i < ${#unique_hosts[@]}; i++)); do
226 host=${unique_hosts[$i]}
227 remote_shell $host "killall -q vmstat >/dev/null 2>&1" &
229 kill -term ${vmstatpids[$pidcount]} 2>/dev/null
230 kill -kill ${vmstatpids[$pidcount]} 2>/dev/null
232 pidcount=$((pidcount+1))
233 if ((${do_unload_echo[$i]})); then
237 if [ $case == "network" ]; then
240 if [ $case == "netdisk" ]; then
244 if [ $exit_status ]; then
245 if [ $exit_status -ne 0 ]; then
246 echo "program exited with error "
255 trap 'cleanup 0 $clean_srv_OSS $cleanup_oscs' SIGHUP SIGINT SIGTERM
257 # gets echoclient device number and attach it to the client UUID
258 # Results are returned by an echo followed by an exit
259 # This must run in a subshell.
261 # parameter: 1. hostname
262 # 2. client name, ex:- ns8:ECHO_ns8
263 # 3. name of ost instances, ex:- lustre-OST0001
267 local client_name="$2"
269 local dev_type="${4:-obdfilter}"
270 local stack_type="${5:-}"
272 if [ -z "$client_name" ]; then
273 if [ -z "$ost_name" ]; then
274 echo "client and ost name both null"
277 client_name=${ost_name}_ecc
279 ec=`get_devno $host echo_client $client_name`
280 if [ -n "$ec" ]; then
281 echo $ec $client_name $client_name >&8
284 if [ -z "$ost_name" ]; then
285 echo "no echo client and ost_name not set, client:" \
286 "$client_name, host: $host"
289 ost=`get_devno $host $dev_type $ost_name`
290 if [ -z "$ost" ]; then
291 echo "OST $ost_name not setup"
294 client_name=${ost_name}_ecc
297 attach echo_client $client_name ${client_name}_UUID
298 setup $ost_name $stack_type
300 ec=`get_devno $host echo_client $client_name`
301 if [ -z "$ec" ]; then
302 echo "Can't setup echo-client"
305 echo $ec $client_name 1 >&8
309 # Create echo-clients using osc_names and osc_uuid
310 # It creates echoclients for all osc listed using #lctl device_list command
314 attach echo_client ${osc_name}_ecc ${osc_name}_ecc_UUID
315 cfg_device ${osc_name}_ecc
321 # create echo client using server nid.
322 ec_using_srv_nid () {
326 $lctl add_uuid echo_UUID $server_nid@$NETTYPE >/dev/null 2>&1
328 attach osc $ocsname $oscuuid
330 setup echo_srv_UUID echo_UUID
333 attach echo_client ${ocsname}_ecc $oscuuid
338 setup_osc_for_remote_ost () {
340 local obdfilter_name=$2
341 local host_name=host_$3
342 $lctl add_uuid ${host_name}_UUID $ost_nid@$NETTYPE >/dev/null 2>&1
344 attach osc ${obdfilter_name}_osc ${obdfilter_name}_osc_UUID
345 cfg_device ${obdfilter_name}_osc
346 setup ${obdfilter_name}_UUID ${host_name}_UUID
350 # setup obdecho on server
353 local test_ostfsnm=$2
354 remote_shell "root@$server_nid" \
356 attach obdecho $test_ostfsnm ${test_ostfsnm}_UUID
357 cfg_device $test_ostfsnm
362 # setup OSS on server
365 remote_shell "root@$server_nid" \
367 attach ost OSS OSS_UUID
373 # cleanup and detach the echo-clients that we have created during the test.
374 # parameter: 1. hostname
375 # 2. client name, ex:- ns8:ECHO_ns8
376 teardown_ec_devno () {
388 echo "$@" | xargs -n1 echo | sort -u
394 *:*) host=`echo $name | sed 's/:.*$//'`
395 name=`echo $name | sed 's/[^:]*://'`
405 osc_names_str=$($lctl dl | grep $type_obj)
407 for name in $osc_names_str; do
411 if [ $count != 0 ]; then
412 echo "$type_obj could not be cleanup";
420 osc_names_str=$($lctl dl | grep $type_obj)
422 for name in $osc_names_str; do
426 if [ $count == 0 ]; then
427 echo "$type_obj could not be setup";
433 # added from bugzill req.
435 if [ -z "$ost_names" ]; then
436 targets=$($lctl device_list | awk "{if (\$2 == \"UP\" && \
437 \$3 == \"obdfilter\") {print \$4} }")
439 if [ -z "$targets" ]; then
440 echo "Can't find any OSTs to test. Please set targets=..."
444 for name in $targets; do
445 ost_names[$count]=$name
446 str=(`split_hostname $name`)
447 host_names[$count]=${str[0]}
453 # split out hostnames from ost names
454 for ((i = 0; i < count; i++)); do
455 str=(`split_hostname ${targets[$i]}`)
456 host_list[$i]=${str[0]}
457 ost_names[$i]=${str[1]}