Whamcloud - gitweb
Land b1_2_smallfix onto b1_2 (20040824_0018)
[fs/lustre-release.git] / lustre / tests / replay-dual.sh
1 #!/bin/sh
2
3 set -e
4
5 LUSTRE=${LUSTRE:-`dirname $0`/..}
6 . $LUSTRE/tests/test-framework.sh
7
8 init_test_env $@
9
10 . ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
11
12 SETUP=${SETUP:-"setup"}
13 CLEANUP=${CLEANUP:-"cleanup"}
14
15 gen_config() {
16     rm -f $XMLCONFIG
17     add_mds mds --dev $MDSDEV --size $MDSSIZE
18     if [ ! -z "$mdsfailover_HOST" ]; then
19          add_mdsfailover mds --dev $MDSDEV --size $MDSSIZE
20     fi
21     
22     add_lov lov1 mds --stripe_sz $STRIPE_BYTES\
23         --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
24     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE --failover
25     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE  --failover
26     add_client client mds --lov lov1 --path $MOUNT
27 }
28
29
30
31 build_test_filter
32
33 cleanup() {
34     # make sure we are using the primary MDS, so the config log will
35     # be able to clean up properly.
36     activemds=`facet_active mds`
37     if [ $activemds != "mds" ]; then
38         fail mds
39     fi
40
41     umount $MOUNT2 || true
42     umount $MOUNT  || true
43     rmmod llite
44     stop mds ${FORCE}
45     stop ost2 ${FORCE}
46     stop ost ${FORCE}  --dump cleanup-dual.log
47 }
48
49 if [ "$ONLY" == "cleanup" ]; then
50     sysctl -w portals.debug=0
51     cleanup
52     exit
53 fi
54
55 setup() {
56     gen_config
57     start ost --reformat $OSTLCONFARGS 
58     start ost2 --reformat $OSTLCONFARGS 
59     start mds $MDSLCONFARGS --reformat
60     grep " $MOUNT " /proc/mounts || zconf_mount `hostname` $MOUNT
61     grep " $MOUNT2 " /proc/mounts || zconf_mount `hostname` $MOUNT2
62
63 #    echo $TIMEOUT > /proc/sys/lustre/timeout
64 }
65
66 $SETUP
67 [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
68
69 test_1() {
70     touch $MOUNT1/a
71     replay_barrier mds
72     touch $MOUNT2/b
73
74     fail mds
75     checkstat $MOUNT2/a || return 1
76     checkstat $MOUNT1/b || return 2
77     rm $MOUNT2/a $MOUNT1/b
78     checkstat $MOUNT1/a && return 3
79     checkstat $MOUNT2/b && return 4
80     return 0
81 }
82
83 run_test 1 "|X| simple create"
84
85
86 test_2() {
87     replay_barrier mds
88     mkdir $MOUNT1/adir
89
90     fail mds
91     checkstat $MOUNT2/adir || return 1
92     rmdir $MOUNT2/adir
93     checkstat $MOUNT2/adir && return 2
94     return 0
95 }
96
97 run_test 2 "|X| mkdir adir"
98
99 test_3() {
100     replay_barrier mds
101     mkdir $MOUNT1/adir
102     mkdir $MOUNT2/adir/bdir
103
104     fail mds
105     checkstat $MOUNT2/adir      || return 1
106     checkstat $MOUNT1/adir/bdir || return 2
107     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
108     checkstat $MOUNT1/adir      && return 3
109     checkstat $MOUNT2/adir/bdir && return 4
110     return 0
111 }
112
113 run_test 3 "|X| mkdir adir, mkdir adir/bdir "
114
115 test_4() {
116     mkdir $MOUNT1/adir
117     replay_barrier mds
118     mkdir $MOUNT1/adir  && return 1
119     mkdir $MOUNT2/adir/bdir
120
121     fail mds
122     checkstat $MOUNT2/adir      || return 2
123     checkstat $MOUNT1/adir/bdir || return 3
124
125     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
126     checkstat $MOUNT1/adir      && return 4
127     checkstat $MOUNT2/adir/bdir && return 5
128     return 0
129 }
130
131 run_test 4 "|X| mkdir adir (-EEXIST), mkdir adir/bdir "
132
133
134 test_5() {
135     # multiclient version of replay_single.sh/test_8
136     mcreate $MOUNT1/a
137     multiop $MOUNT2/a o_tSc &
138     pid=$!
139     # give multiop a chance to open
140     sleep 1 
141     rm -f $MOUNT1/a
142     replay_barrier mds
143     kill -USR1 $pid
144     wait $pid || return 1
145
146     fail mds
147     [ -e $MOUNT2/a ] && return 2
148     return 0
149 }
150 run_test 5 "open, unlink |X| close"
151
152
153 test_6() {
154     mcreate $MOUNT1/a
155     multiop $MOUNT2/a o_c &
156     pid1=$!
157     multiop $MOUNT1/a o_c &
158     pid2=$!
159     # give multiop a chance to open
160     sleep 1 
161     rm -f $MOUNT1/a
162     replay_barrier mds
163     kill -USR1 $pid1
164     wait $pid1 || return 1
165
166     fail mds
167     kill -USR1 $pid2
168     wait $pid2 || return 1
169     [ -e $MOUNT2/a ] && return 2
170     return 0
171 }
172 run_test 6 "open1, open2, unlink |X| close1 [fail mds] close2"
173
174 test_8() {
175     replay_barrier mds
176     drop_reint_reply "mcreate $MOUNT1/$tfile"    || return 1
177     fail mds
178     checkstat $MOUNT2/$tfile || return 2
179     rm $MOUNT1/$tfile || return 3
180
181     return 0
182 }
183 run_test 8 "replay of resent request"
184
185 test_9() {
186     replay_barrier mds
187     mcreate $MOUNT1/$tfile-1
188     mcreate $MOUNT2/$tfile-2
189     # drop first reint reply
190     sysctl -w lustre.fail_loc=0x80000119
191     fail mds
192     sysctl -w lustre.fail_loc=0
193
194     rm $MOUNT1/$tfile-[1,2] || return 1
195
196     return 0
197 }
198 run_test 9 "resending a replayed create"
199
200 test_10() {
201     mcreate $MOUNT1/$tfile-1
202     replay_barrier mds
203     munlink $MOUNT1/$tfile-1
204     mcreate $MOUNT2/$tfile-2
205     # drop first reint reply
206     sysctl -w lustre.fail_loc=0x80000119
207     fail mds
208     sysctl -w lustre.fail_loc=0
209
210     checkstat $MOUNT1/$tfile-1 && return 1
211     checkstat $MOUNT1/$tfile-2 || return 2
212     rm $MOUNT1/$tfile-2
213
214     return 0
215 }
216 run_test 10 "resending a replayed unlink"
217
218 test_11() {
219     replay_barrier mds
220     mcreate $MOUNT1/$tfile-1
221     mcreate $MOUNT2/$tfile-2
222     mcreate $MOUNT1/$tfile-3
223     mcreate $MOUNT2/$tfile-4
224     mcreate $MOUNT1/$tfile-5
225     # drop all reint replies for a while
226     sysctl -w lustre.fail_loc=0x0119
227     facet_failover mds
228     #sleep for while, let both clients reconnect and timeout
229     sleep $((TIMEOUT * 2))
230     sysctl -w lustre.fail_loc=0
231
232     rm $MOUNT1/$tfile-[1-5] || return 1
233
234     return 0
235 }
236 run_test 11 "both clients timeout during replay"
237
238 test_12() {
239     replay_barrier mds
240
241     multiop $DIR/$tfile mo_c &
242     MULTIPID=$!
243     sleep 5
244
245     # drop first enqueue
246     sysctl -w lustre.fail_loc=0x80000302
247     facet_failover mds
248     df $MOUNT || return 1
249     sysctl -w lustre.fail_loc=0
250
251     ls $DIR/$tfile
252     $CHECKSTAT -t file $DIR/$tfile || return 2
253     kill -USR1 $MULTIPID || return 3
254     wait $MULTIPID || return 4
255     rm $DIR/$tfile
256
257     return 0
258 }
259 run_test 12 "open resend timeout"
260
261 test_13() {
262     multiop $DIR/$tfile mo_c &
263     MULTIPID=$!
264     sleep 5
265
266     replay_barrier mds
267
268     kill -USR1 $MULTIPID || return 3
269     wait $MULTIPID || return 4
270
271     # drop close 
272     sysctl -w lustre.fail_loc=0x80000115
273     facet_failover mds
274     df $MOUNT || return 1
275     sysctl -w lustre.fail_loc=0
276
277     ls $DIR/$tfile
278     $CHECKSTAT -t file $DIR/$tfile || return 2
279     rm $DIR/$tfile
280
281     return 0
282 }
283 run_test 13 "close resend timeout"
284
285 test_14() {
286     replay_barrier mds
287     createmany -o $MOUNT1/$tfile- 25
288     createmany -o $MOUNT2/$tfile-2- 1
289     createmany -o $MOUNT1/$tfile-3- 25
290     umount $MOUNT2
291
292     facet_failover mds
293     # expect failover to fail
294     df $MOUNT && return 1
295
296     # first 25 files shouuld have been 
297     # replayed 
298     unlinkmany $MOUNT1/$tfile- 25 || return 2
299
300     zconf_mount `hostname` $MOUNT2
301     return 0
302 }
303 run_test 14 "timeouts waiting for lost client during replay"
304
305 test_15() {
306     replay_barrier mds
307     createmany -o $MOUNT1/$tfile- 25
308     createmany -o $MOUNT2/$tfile-2- 1
309     umount $MOUNT2
310
311     facet_failover mds
312     df $MOUNT || return 1
313
314     unlinkmany $MOUNT1/$tfile- 25 || return 2
315
316     zconf_mount `hostname` $MOUNT2
317     return 0
318 }
319 run_test 15 "timeout waiting for lost client during replay, 1 client completes"
320
321 test_16() {
322     replay_barrier mds
323     createmany -o $MOUNT1/$tfile- 25
324     createmany -o $MOUNT2/$tfile-2- 1
325     umount $MOUNT2
326
327     facet_failover mds
328     sleep $TIMEOUT
329     facet_failover mds
330     df $MOUNT || return 1
331
332     unlinkmany $MOUNT1/$tfile- 25 || return 2
333
334     zconf_mount `hostname` $MOUNT2
335     return 0
336
337 }
338 run_test 16 "fail MDS during recovery (3571)"
339
340 test_17() {
341     createmany -o $MOUNT1/$tfile- 25
342     createmany -o $MOUNT2/$tfile-2- 1
343
344     # Make sure the disconnect is lost
345     replay_barrier ost
346     umount $MOUNT2
347
348     facet_failover ost
349     sleep $TIMEOUT
350     facet_failover ost
351     df $MOUNT || return 1
352
353     unlinkmany $MOUNT1/$tfile- 25 || return 2
354
355     zconf_mount `hostname` $MOUNT2
356     return 0
357
358 }
359 run_test 17 "fail OST during recovery (3571)"
360
361 # cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for it
362 export NOW=0
363
364 test_18() {     # bug 3822 - evicting client with enqueued lock
365         set -vx
366         mkdir -p $MOUNT1/$tdir
367         touch $MOUNT1/$tdir/f0
368 #define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
369         statmany -s $MOUNT1/$tdir/f 500 &
370         OPENPID=$!
371         NOW=`date +%s`
372         do_facet mds sysctl -w lustre.fail_loc=0x8000030b  # hold enqueue
373         sleep 1
374 #define OBD_FAIL_LDLM_BL_CALLBACK        0x305
375         do_facet client sysctl -w lustre.fail_loc=0x80000305  # drop cb, evict
376         cancel_lru_locks MDC
377         usleep 500 # wait to ensure first client is one that will be evicted
378         openfile -f O_RDONLY $MOUNT2/$tdir/f0
379         wait $OPENPID
380         dmesg | grep "entering recovery in server" && \
381                 error "client not evicted" || true
382 }
383 run_test 18 "ldlm_handle_enqueue succeeds on evicted export (3822)"
384
385 if [ "$ONLY" != "setup" ]; then
386         equals_msg test complete, cleaning up
387         SLEEP=$((`date +%s` - $NOW))
388         [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
389         $CLEANUP
390 fi