Whamcloud - gitweb
b=17661
[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 RDIR=$DIR/racer
15 mkdir -p $RDIR
16 DURATION=${DURATION:-120}
17
18 assert_env CLIENTS
19
20 timer_on () {
21         sleep $1 && kill -s ALRM $$ &
22         TIMERPID=$!
23         echo TIMERPID=$TIMERPID
24 }
25
26 do_racer_cleanup () {
27         trap 0
28
29         local WAIT=0
30         local INTERVAL=5
31         local pids
32         local rc=0
33
34         echo "DOING RACER CLEANUP ... "
35
36         # Check if all processes are killed
37
38         local clients=$CLIENTS
39
40         # 1.Let chance to racer to kill all it's processes
41         # FIXME: not sure how long does it take for racer to kill all processes
42         # 80 is sometimes are enough for 2 clients; sometimes it takes more than 150 sec
43         while [ $WAIT -lt 90 ]; do
44                 running=$(do_nodes $clients "ps uax | grep $RDIR " | egrep -v "(acceptance|grep|pdsh|bash)" || true)
45                 [ -z "$running" ] && rc=0 && break
46                 echo "clients $clients are still running the racer processes. Waited $WAIT secs"
47                 echo $running
48                 rc=1
49                 [ $INTERVAL -lt 40 ] && INTERVAL=$((INTERVAL + INTERVAL))
50                 sleep $INTERVAL
51                 WAIT=$((WAIT + INTERVAL))
52         done
53
54         # 2. Kill the remaining processes
55         if [ $rc -ne 0 ]; then
56                 for C in ${clients//,/ } ; do
57                         pids=$(do_node $C "ps uax | grep $RDIR " | egrep -v "(acceptance|grep|PATH)" | awk '{print $2}' || true)
58                         if [ ! -z "$pids" ]; then
59                                 echo "client $C still running racer processes after $WAIT seconds. Killing $pids"
60                                 do_node $C "ps uax | grep $RDIR " | egrep -v "(acceptance|grep|PATH)"
61                                 do_node $C kill -TERM $pids || true
62                                 # let processes to be killed
63                                 sleep 2
64         # 3. Check if the processes were killed
65         # exit error if the processes still exist
66                                 for pid in $pids; do
67                                         do_node $C "ps -P $pid" && RC=1 || true
68                                 done
69                         else
70                                 echo "All processes on client $C exited after $WAIT seconds. OK."
71                         fi
72                 done
73         else
74                 echo "No racer processes running after $WAIT seconds. OK."
75                 wait_remote_prog $racer 10
76         fi
77 }
78
79 racer_cleanup () {
80         if [ "$timeout" == "timeout" ]; then
81                 echo $timeout killing RACERPID=$RACERPID
82                 kill $RACERPID || true
83                 sleep 2 # give chance racer to kill it's processes
84                 do_racer_cleanup
85         else
86                 echo "Racer completed before DURATION=$DURATION expired. Cleaning up..."
87                 kill $TIMERPID
88                 do_racer_cleanup
89         fi
90 }
91
92 racer_timeout () {
93         timeout="timeout"
94         racer_cleanup
95         echo "$0: completed $RC"
96         exit $RC
97 }
98
99 # run racer
100 log "Start racer on clients: $CLIENTS DURATION=$DURATION"
101 RC=0
102
103 trap racer_timeout ALRM
104
105 timer_on $((DURATION + 5))
106
107 do_nodes $CLIENTS "DURATION=$DURATION $racer $RDIR" &
108 RACERPID=$!
109 echo RACERPID=$RACERPID
110 wait $RACERPID || RC=2
111 racer_cleanup
112 echo "$0: completed $RC"
113 exit $RC