Whamcloud - gitweb
Update based on lustre-iokit-20051107.tar.gz from the customer download area.
[fs/lustre-release.git] / lustre / tests / replay-sanity.sh
1 #!/bin/sh
2
3 set -e
4
5 #
6 # This test needs to be run on the client
7 #
8
9 LUSTRE=${LUSTRE:-`dirname $0`/..}
10 . $LUSTRE/tests/test-framework.sh
11
12 init_test_env $@
13
14 . ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
15
16 # Skip these tests
17 ALWAYS_EXCEPT="1 3"
18
19 gen_config() {
20     rm -f $XMLCONFIG
21     add_mds mds --dev $MDSDEV --size $MDSSIZE
22     if [ ! -z "$mdsfailover_HOST" ]; then
23          add_mdsfailover mds --dev $MDSDEV --size $MDSSIZE
24     fi
25     
26     add_lov lov1 mds --stripe_sz $STRIPE_BYTES \
27         --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
28     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
29     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
30     add_client client mds --lov lov1 --path $MOUNT
31 }
32
33 build_test_filter
34
35 cleanup() {
36     # make sure we are using the primary MDS, so the config log will
37     # be able to clean up properly.
38     activemds=`facet_active mds`
39     if [ $activemds != "mds" ]; then
40         fail mds
41     fi
42     zconf_umount `hostname` $MOUNT
43     stop mds ${FORCE} $MDSLCONFARGS
44     stop ost2 ${FORCE} --dump cleanup.log
45     stop ost ${FORCE} --dump cleanup.log
46 }
47
48 if [ "$ONLY" == "cleanup" ]; then
49     sysctl -w portals.debug=0 || true
50     cleanup
51     exit
52 fi
53
54 SETUP=${SETUP:-"setup"}
55 CLEANUP=${CLEANUP:-"cleanup"}
56
57 setup() {
58     gen_config
59
60     start ost --reformat $OSTLCONFARGS 
61     start ost2 --reformat $OSTLCONFARGS 
62     [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
63     start mds $MDSLCONFARGS --reformat
64     grep " $MOUNT " /proc/mounts || zconf_mount `hostname` $MOUNT
65 }
66
67 $SETUP
68
69 if [ "$ONLY" == "setup" ]; then
70     exit 0
71 fi
72
73 mkdir -p $DIR
74  
75 # bug 3488 - test MDS replay more intensely
76 test_1() {
77     sh rundbench 2 &
78     pid=$!
79     sleep 3
80     replay_barrier mds
81     sleep 2
82     fail mds
83     wait $PID || return 1
84 }
85 run_test 1 "fail MDS during dbench"
86
87 test_2() {
88     mkdir $DIR/$tdir
89     bonnie++ -u root -d $DIR/$tdir -s 0 -n 1 &
90     pid=$!
91     sleep 3
92     replay_barrier mds
93     sleep 2
94     fail mds
95     wait $PID || return 1
96     rm -rf $DIR/root
97 }
98 run_test 2 "fail MDS during bonnie++"
99
100 if [ $UID -ne 0 ]; then
101         RUNAS_ID="$UID"
102         RUNAS=""
103 else
104         RUNAS_ID=${RUNAS_ID:-500}
105         if [ -z "$RUNAS_GID" ]; then
106             RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
107         else
108             RUNAS=${RUNAS:-"runas -u $RUNAS_ID -g $RUNAS_GID"}
109         fi
110 fi
111
112 OLDTMPDIR=$TMPDIR
113 OLDTMP=$TMP
114 TMPDIR=/tmp
115 TMP=/tmp
116 OLDHOME=$HOME
117 [ $RUNAS_ID -ne $UID ] && HOME=/tmp
118                                                                                                                              
119 test_3() {
120     cvsroot=$DIR/${tdir}-csvroot
121     repos=${tdir}-repos
122     mkdir -p $cvsroot
123     chown $RUNAS_ID $cvsroot
124     $RUNAS cvs -d $cvsroot init || error
125
126     cd /etc/init.d
127     # some versions of cvs import exit(1) when asked to import links or
128     # files they can't read.  ignore those files.
129     TOIGNORE=$(find . -type l -printf '-I %f\n' -o \
130                     ! -perm +4 -printf '-I %f\n')
131     $RUNAS cvs -d $cvsroot import -m "nomesg" $TOIGNORE \
132             $repos vtag rtag
133
134     cd $DIR
135         mkdir -p $DIR/$repos
136     chown $RUNAS_ID $DIR/$repos
137     $RUNAS cvs -d $cvsroot co $repos
138
139     cd $DIR/$repos
140
141     for i in `seq 1 20`; do
142         $RUNAS touch ${tfile}-$i
143         $RUNAS cvs add -m 'addmsg' ${tfile}-$i
144     done
145
146     replay_barrier mds
147     $RUNAS cvs update
148     $RUNAS cvs commit -m 'nomsg' ${tfile}-*
149     cd $LUSTRE
150     fail mds
151 }
152 run_test 3 "fail MDS during cvs commit"
153
154 TMPDIR=$OLDTMPDIR
155 TMP=$OLDTMP
156 HOME=$OLDHOME
157
158 test_4() {
159     touch $DIR/$tfile-1
160     ln $DIR/$tfile-1 $DIR/$tfile-2 || return 1
161
162     replay_barrier mds
163     multiop $DIR/$tfile-2 Ouc
164     fail mds
165
166     $CHECKSTAT -t file $DIR/$tfile-1 || return 2
167     rm -rf $DIR/$tfile-*
168 }
169 run_test 4 "|X| unlink file with multiple links while open"
170
171 test_5() {
172     replay_barrier mds
173     touch $DIR/$tfile-1
174     ln $DIR/$tfile-1 $DIR/$tfile-2 || return 1
175     multiop $DIR/$tfile-2 Ouc
176
177     fail mds
178
179     $CHECKSTAT -t file $DIR/$tfile-1 || return 2
180     rm -rf $DIR/$tfile-*
181 }
182 run_test 5 "|X| unlink file with multiple links while open"
183
184 test_6() {
185     touch $DIR/$tfile-1
186     ln $DIR/$tfile-1 $DIR/$tfile-2
187
188     replay_barrier mds
189     multiop $DIR/$tfile-1 O_uc &
190     MULTIPID=$!
191     multiop $DIR/$tfile-2 Ouc
192     usleep 500
193     fail mds
194
195     kill -USR1 $MULTIPID
196     wait $MUTLIPID || return 1
197
198     [ -e $DIR/$tfile-1 ] && return 2
199     [ -e $DIR/$tfile-2 ] && return 3
200     return 0
201 }
202 run_test 6 "|X| open-unlink file with multiple links"
203
204 test_7() {
205     replay_barrier mds
206     touch $DIR/$tfile-1
207     ln $DIR/$tfile-1 $DIR/$tfile-2
208     multiop $DIR/$tfile-1 O_uc &
209     MULTIPID=$!
210
211     multiop $DIR/$tfile-2 Ouc
212     usleep 500
213
214     kill -USR1 $MULTIPID
215     wait $MUTLIPID || return 1
216     fail mds
217
218     [ -e $DIR/$tfile-1 ] && return 2
219     [ -e $DIR/$tfile-2 ] && return 3
220     return 0
221 }
222 run_test 7 "|X| open-unlink file with multiple links"
223
224 test_8() {
225     replay_barrier mds
226     opendirunlink $DIR/$tdir $DIR/$tdir || return 1
227     fail mds
228     $CHECKSTAT -a $DIR/$tdir || return 2
229 }
230 run_test 8 "|X| remove of open directory"
231
232 check_kernel_version() {
233     VERSION_FILE=/proc/fs/lustre/kernel_version
234     WANT_VER=$1
235     [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
236     GOT_VER=`cat $VERSION_FILE`
237     [ $GOT_VER -ge $WANT_VER ] && return 0
238     log "test needs at least kernel version $WANT_VER, running $GOT_VER"
239     return 1
240 }
241
242 test_9() {
243     check_kernel_version 34 || return 0
244     replay_barrier mds
245     openfilleddirunlink $DIR/$tdir || return 1
246     fail mds
247 }
248 run_test 9 "|X| remove of open non-empty directory"
249
250 equals_msg test complete, cleaning up
251 $CLEANUP
252