Whamcloud - gitweb
b=20748
[fs/lustre-release.git] / lustre / tests / runracer
1 #!/bin/bash
2 #set -vx
3 set -e
4
5 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
6 . $LUSTRE/tests/test-framework.sh
7 init_test_env $@
8 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
9
10 racer=`which racer.sh`
11 [ -z "$racer" ] && echo racer is not installed && exit 1
12
13 CLIENTS=${CLIENTS:-$HOSTNAME}
14 RACERDIRS=$@
15 RACERDIRS=${RACERDIRS:-$DIR}
16 echo RACERDIRS=$RACERDIRS
17 for d in ${RACERDIRS}; do
18         RDIRS="$RDIRS $d/racer"
19         mkdir -p $d/racer
20 #       lfs setstripe $d/racer -c -1
21 done
22
23 DURATION=${DURATION:-120}
24
25 assert_env CLIENTS
26
27 timer_on () {
28         sleep $1 && kill -s ALRM $$ &
29         TIMERPID=$!
30         echo TIMERPID=$TIMERPID
31 }
32
33 do_racer_cleanup () {
34         trap 0
35
36         local WAIT=0
37         local INTERVAL=5
38         local pids
39         local rc=0
40         local TMAX
41
42         local RDIR=$1
43
44         echo "DOING RACER CLEANUP ... "
45
46         # Check if all processes are killed
47
48         local clients=$CLIENTS
49         local num_clients=$(get_node_count ${clients//,/ })
50
51         if at_is_enabled; then
52             TMAX=$(at_max_get mds)
53         else
54             TMAX=$(lctl get_param -n timeout)
55         fi
56
57         [ $TMAX -gt $((num_clients * 60)) ] || TMAX=$((num_clients * 60))
58         # 1.Let chance to racer to kill all it's processes
59         # FIXME: not sure how long does it take for racer to kill all processes
60         # 80 is sometimes are enough for 2 clients; sometimes it takes more than 150 sec
61         while [ $WAIT -lt $TMAX ]; do
62                 running=$(do_nodes $clients "ps uax | grep $RDIR " | egrep -v "(acceptance|grep|pdsh|bash)" || true)
63                 [ -z "$running" ] && rc=0 && break
64                 echo "clients $clients are still running the racer processes. Waited $WAIT secs"
65                 echo $running
66                 rc=1
67                 [ $INTERVAL -lt 40 ] && INTERVAL=$((INTERVAL + INTERVAL))
68                 sleep $INTERVAL
69                 WAIT=$((WAIT + INTERVAL))
70         done
71
72         # 2. Kill the remaining processes
73         if [ $rc -ne 0 ]; then
74                 for C in ${clients//,/ } ; do
75                         pids=$(do_node $C "ps uax | grep $RDIR " | egrep -v "(acceptance|grep|PATH)" | awk '{print $2}' || true)
76                         if [ ! -z "$pids" ]; then
77                                 echo "client $C still running racer processes after $WAIT seconds. Killing $pids"
78                                 do_node $C "ps uax | grep $RDIR " | egrep -v "(acceptance|grep|PATH)"
79                                 do_node $C kill -TERM $pids || true
80                                 # let processes to be killed, there maybe many threads to be killed, so give 20 sec gap
81                                 sleep 20
82         # 3. Check if the processes were killed
83         # exit error if the processes still exist
84                                 for pid in $pids; do
85                                         do_node $C "ps -P $pid" && RC=1 || true
86                                 done
87                         else
88                                 echo "All processes on client $C exited after $WAIT seconds. OK."
89                         fi
90                 done
91         else
92                 echo "No racer processes running after $WAIT seconds. OK."
93                 wait_remote_prog $racer 10
94         fi
95 }
96
97 racer_cleanup () {
98         if [ "$timeout" == "timeout" ]; then
99                 echo $timeout killing RACERPID=$RACERPID
100                 kill $RACERPID || true
101                 sleep 2 # give chance racer to kill it's processes
102                 local dir
103                 for dir in $RDIRS; do
104                         do_racer_cleanup $dir
105                 done
106         else
107                 echo "Racer completed before DURATION=$DURATION expired. Cleaning up..."
108                 kill $TIMERPID
109                 for dir in $RDIRS; do
110                         do_racer_cleanup $dir
111                 done
112         fi
113 }
114
115 racer_timeout () {
116         timeout="timeout"
117         racer_cleanup
118         echo "$0: completed $RC"
119         exit $RC
120 }
121
122 # run racer
123 log "Start racer on clients: $CLIENTS DURATION=$DURATION"
124 RC=0
125
126 trap racer_timeout ALRM
127
128 timer_on $((DURATION + 5))
129
130 RACERPID=""
131 for rdir in $RDIRS; do
132         do_nodes $CLIENTS "DURATION=$DURATION $racer $rdir $NUM_RACER_THREADS" &
133         pid=$!
134         RACERPID="$RACERPID $pid"
135 done
136
137 echo RACERPID=$RACERPID
138 for rpid in $RACERPID; do
139         wait $rpid
140         rc=$?
141         echo "rpid=$rpid rc=$rc"
142         if [ $rc != 0 ]; then
143                 RC=$((RC + 1))
144         fi
145 done
146
147 racer_cleanup
148 echo "$0: completed $RC"
149 exit $RC