#!/bin/bash #* Copyright (C) 2002 Cluster File Systems, Inc. #* Author: Jitendra Pawar #* #* Lustre-iokit is free software; you can redistribute it and/or #* modify it under the terms of version 2 of the GNU General Public #* License as published by the Free Software Foundation. #* #* Lustre-iokit is distributed in the hope that it will be useful, #* but WITHOUT ANY WARRANTY; without even the implied warranty of #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #* GNU General Public License for more details. #* #* You should have received a copy of the GNU General Public License #* along with Lustre; if not, write to the Free Software #* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # binaries lsmod="/sbin/lsmod" modprobe="/sbin/modprobe" insmod="/sbin/insmod" rmmod="/sbin/rmmod" declare -a ost_names declare -a host_list declare -a dev_list declare -a unique_hosts declare count declare -a vmstatpids declare -a do_unload_echo # This function executes the command sent through parameters to host # parameters # 1. hostname # 2. command to be executed on host custom_remote_shell () { host=$1 shift cmds="$*" here=`pwd` # Hop on to the remote node, chdir to 'here' and run the given # commands. One of the following will probably work. ssh $host "cd $here; $cmds" #rsh $host "cd $here; $cmds" # we have to remove the leading `uname -n`: from pdsh output lines #pdsh -w $host "cd $here; $cmds" | sed 's/^[^:]*://' } # how to run commands on other nodes # You need to make this work on your cluster if you have specified # non-local obd instances above remote_shell () { host=$1 shift cmds="$*" if [ "$host" = "localhost" -o "$host" = `uname -n` ]; then eval "$cmds" else custom_remote_shell $host "$cmds" fi } # checks whether obdecho module is loded on given host. # parameter: 1. hostname obdecho_loaded() { local host=$1 remote_shell $host $lsmod | grep obdecho > /dev/null 2>&1 } # load obdecho.ko or obdecho.o module on host kernel. load_obdecho () { local index=$1 local host=${unique_hosts[$index]} do_unload_echo[$index]=0 if obdecho_loaded $host; then return 0 fi if [ -z "$lustre_root" ]; then remote_shell $host $modprobe obdecho elif [ -f ${lustre_root}/obdecho/obdecho.ko ]; then remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.ko else remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.o fi if obdecho_loaded $host; then do_unload_echo[$index]=1 else echo Could not install obdecho on $host return 1 fi return 0 } load_obdechos () { for ((i = 0; i < ${#unique_hosts[@]}; i++)); do load_obdecho $i || cleanup 1 done } # unload obdecho module from host kernel. unload_obdecho () { local index=$1 local host=${unique_hosts[$index]} if ((${do_unload_echo[$index]})); then remote_shell $host $rmmod obdecho do_unload_echo[$index]=0 fi } # returns the device number which is displayed in "lctl device_list" # # parameter: 1. hostname # 2. type of device ex: echo_client # 3. name of device ex: ECHO_matrix.linsyssoft.com get_devno () { local host=$1 local type=$2 local name=$3 remote_shell $host $lctl device_list | \ awk "{if (\$2 == \"UP\" && \$3 == \"$type\" && \$4 == \"$name\") {\ print \$1; exit}}" } get_devnos () { local i=0 local host for ((i = 0; i < $count; i++)); do ost=${ost_names[$i]} host=${host_list[$i]} dev=$(get_devno $host obdfilter $ost) dev_list[$i]=$dev if [ -z "$dev" ]; then echo Cant find device for $ost on $host return 1 fi done return 0 } # do cleanup and exit. cleanup () { for ((i = 0; i < ndevs; i++)); do host=${host_names[$i]} if [ -n ${do_teardown_ec[$i]} ]; then teardown_ec_devno $host ${client_names[$i]} fi done pidcount=0 for host in ${unique_hosts[@]}; do remote_shell $host "killall vmstat -q" & pid=$! kill -term ${vmstatpids[$pidcount]} 2>/dev/null kill -kill ${vmstatpids[$pidcount]} 2>/dev/null wait $pid pidcount=$((pidcount+1)) if ((${do_unload_obdecho[$host]})); then unload_obdecho $host fi done if [ $case == "network" ]; then lctl <&2 return fi client_name=${ost_name}_echo_client fi ec=`get_devno $host echo_client $client_name` if [ -n "$ec" ]; then echo $ec $client_name $client_name return fi if [ -z "$ost_name" ]; then echo "no echo client and ost_name not set, client: $client_name, host: $host" 1>&2 return fi ost=`get_devno $host obdfilter $ost_name` if [ -z "$ost" ]; then echo "OST $ost_name not setup" 1>&2 return fi remote_shell $host "$lctl <&2 return fi echo $ec $client_name 1 } # Create echo-clients using osc_names and osc_uuid # It creates echoclients for all osc listed using #lctl device_list command ec_using_osc () { local osc_name=$1 local osc_uuid=$2 $lctl <