Whamcloud - gitweb
Branch HEAD
[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
41         local RDIR=$1
42
43         echo "DOING RACER CLEANUP ... "
44
45         # Check if all processes are killed
46
47         local clients=$CLIENTS
48
49         # 1.Let chance to racer to kill all it's processes
50         # FIXME: not sure how long does it take for racer to kill all processes
51         # 80 is sometimes are enough for 2 clients; sometimes it takes more than 150 sec
52         while [ $WAIT -lt 90 ]; do
53                 running=$(do_nodes $clients "ps uax | grep $RDIR " | egrep -v "(acceptance|grep|pdsh|bash)" || true)
54                 [ -z "$running" ] && rc=0 && break
55                 echo "clients $clients are still running the racer processes. Waited $WAIT secs"
56                 echo $running
57                 rc=1
58                 [ $INTERVAL -lt 40 ] && INTERVAL=$((INTERVAL + INTERVAL))
59                 sleep $INTERVAL
60                 WAIT=$((WAIT + INTERVAL))
61         done
62
63         # 2. Kill the remaining processes
64         if [ $rc -ne 0 ]; then
65                 for C in ${clients//,/ } ; do
66                         pids=$(do_node $C "ps uax | grep $RDIR " | egrep -v "(acceptance|grep|PATH)" | awk '{print $2}' || true)
67                         if [ ! -z "$pids" ]; then
68                                 echo "client $C still running racer processes after $WAIT seconds. Killing $pids"
69                                 do_node $C "ps uax | grep $RDIR " | egrep -v "(acceptance|grep|PATH)"
70                                 do_node $C kill -TERM $pids || true
71                                 # let processes to be killed
72                                 sleep 2
73         # 3. Check if the processes were killed
74         # exit error if the processes still exist
75                                 for pid in $pids; do
76                                         do_node $C "ps -P $pid" && RC=1 || true
77                                 done
78                         else
79                                 echo "All processes on client $C exited after $WAIT seconds. OK."
80                         fi
81                 done
82         else
83                 echo "No racer processes running after $WAIT seconds. OK."
84                 wait_remote_prog $racer 10
85         fi
86 }
87
88 racer_cleanup () {
89         if [ "$timeout" == "timeout" ]; then
90                 echo $timeout killing RACERPID=$RACERPID
91                 kill $RACERPID || true
92                 sleep 2 # give chance racer to kill it's processes
93                 local dir
94                 for dir in $RDIRS; do
95                         do_racer_cleanup $dir
96                 done
97         else
98                 echo "Racer completed before DURATION=$DURATION expired. Cleaning up..."
99                 kill $TIMERPID
100                 for dir in $RDIRS; do
101                         do_racer_cleanup $dir
102                 done
103         fi
104 }
105
106 racer_timeout () {
107         timeout="timeout"
108         racer_cleanup
109         echo "$0: completed $RC"
110         exit $RC
111 }
112
113 # run racer
114 log "Start racer on clients: $CLIENTS DURATION=$DURATION"
115 RC=0
116
117 trap racer_timeout ALRM
118
119 timer_on $((DURATION + 5))
120
121 RACERPID=""
122 for rdir in $RDIRS; do
123         do_nodes $CLIENTS "DURATION=$DURATION $racer $rdir $NUM_RACER_THREADS" &
124         pid=$!
125         RACERPID="$RACERPID $pid"
126 done
127
128 echo RACERPID=$RACERPID
129 for rpid in $RACERPID; do
130         wait $rpid
131         rc=$?
132         echo "rpid=$rpid rc=$rc"
133         if [ $rc != 0 ]; then
134                 RC=$((RC + 1))
135         fi
136 done
137
138 racer_cleanup
139 echo "$0: completed $RC"
140 exit $RC