X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre-iokit%2Fobdfilter-survey%2Flibobd;fp=lustre-iokit%2Fobdfilter-survey%2Flibobd;h=3beeecf3361da177eae7ac4bdedb068484182107;hb=c2ec235e28383022a50c0a85c64844a491569d2e;hp=0000000000000000000000000000000000000000;hpb=3b713b9ca7b527805a8a0882e2bd722ac069bf3f;p=fs%2Flustre-release.git diff --git a/lustre-iokit/obdfilter-survey/libobd b/lustre-iokit/obdfilter-survey/libobd new file mode 100644 index 0000000..3beeecf --- /dev/null +++ b/lustre-iokit/obdfilter-survey/libobd @@ -0,0 +1,355 @@ +#!/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 <