Whamcloud - gitweb
b=14512
[fs/lustre-release.git] / lustre / tests / recovery-small.sh
1 #!/bin/bash
2
3 set -e
4
5 #         bug  5494 7288 5493
6 ALWAYS_EXCEPT="24   27   52 $RECOVERY_SMALL_EXCEPT"
7
8 # also long tests: 19, 21a, 21e, 21f, 23, 27                            
9 #                                     1     2.5    4    4          (min)"  
10 [ "$SLOW" = "no" ] && EXCEPT_SLOW="17    26b    50   51     57" 
11
12 PTLDEBUG=${PTLDEBUG:--1}
13 LUSTRE=${LUSTRE:-`dirname $0`/..}
14 . $LUSTRE/tests/test-framework.sh
15 init_test_env $@
16 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
17
18 build_test_filter
19
20 # Allow us to override the setup if we already have a mounted system by
21 # setting SETUP=" " and CLEANUP=" "
22 SETUP=${SETUP:-""}
23 CLEANUP=${CLEANUP:-""}
24
25 cleanup_and_setup_lustre
26 rm -rf $DIR/${TESTSUITE}/[df][0-9]* # bug 13798 new t-f tdir staff
27 rm -rf $DIR/[df][0-9]*
28
29 test_1() {
30     drop_request "mcreate $MOUNT/1"  || return 1
31     drop_reint_reply "mcreate $MOUNT/2"    || return 2
32 }
33 run_test 1 "mcreate: drop req, drop rep"
34
35 test_2() {
36     drop_request "tchmod 111 $MOUNT/2"  || return 1
37     drop_reint_reply "tchmod 666 $MOUNT/2"    || return 2
38 }
39 run_test 2 "chmod: drop req, drop rep"
40
41 test_3() {
42     drop_request "statone $MOUNT/2" || return 1
43     drop_reply "statone $MOUNT/2"   || return 2
44 }
45 run_test 3 "stat: drop req, drop rep"
46
47 test_4() {
48     do_facet client "cp /etc/inittab $MOUNT/inittab" || return 1
49     drop_request "cat $MOUNT/inittab > /dev/null"   || return 2
50     drop_reply "cat $MOUNT/inittab > /dev/null"     || return 3
51 }
52 run_test 4 "open: drop req, drop rep"
53
54 test_5() {
55     drop_request "mv $MOUNT/inittab $MOUNT/renamed" || return 1
56     drop_reint_reply "mv $MOUNT/renamed $MOUNT/renamed-again" || return 2
57     do_facet client "checkstat -v $MOUNT/renamed-again"  || return 3
58 }
59 run_test 5 "rename: drop req, drop rep"
60
61 [ ! -e $MOUNT/renamed-again ] && cp /etc/inittab $MOUNT/renamed-again
62 test_6() {
63     drop_request "mlink $MOUNT/renamed-again $MOUNT/link1" || return 1
64     drop_reint_reply "mlink $MOUNT/renamed-again $MOUNT/link2"   || return 2
65 }
66 run_test 6 "link: drop req, drop rep"
67
68 [ ! -e $MOUNT/link1 ] && mlink $MOUNT/renamed-again $MOUNT/link1
69 [ ! -e $MOUNT/link2 ] && mlink $MOUNT/renamed-again $MOUNT/link2
70 test_7() {
71     drop_request "munlink $MOUNT/link1"   || return 1
72     drop_reint_reply "munlink $MOUNT/link2"     || return 2
73 }
74 run_test 7 "unlink: drop req, drop rep"
75
76 #bug 1423
77 test_8() {
78     drop_reint_reply "touch $MOUNT/$tfile"    || return 1
79 }
80 run_test 8 "touch: drop rep (bug 1423)"
81
82 #bug 1420
83 test_9() {
84     pause_bulk "cp /etc/profile $MOUNT/$tfile"       || return 1
85     do_facet client "cp /etc/termcap $MOUNT/${tfile}.2"  || return 2
86     do_facet client "sync"
87     do_facet client "rm $MOUNT/$tfile $MOUNT/${tfile}.2" || return 3
88 }
89 run_test 9 "pause bulk on OST (bug 1420)"
90
91 #bug 1521
92 test_10() {
93     do_facet client mcreate $MOUNT/$tfile        || return 1
94     drop_bl_callback "chmod 0777 $MOUNT/$tfile"  || echo "evicted as expected"
95     # wait for the mds to evict the client
96     #echo "sleep $(($TIMEOUT*2))"
97     #sleep $(($TIMEOUT*2))
98     do_facet client touch $MOUNT/$tfile || echo "touch failed, evicted"
99     do_facet client checkstat -v -p 0777 $MOUNT/$tfile  || return 3
100     do_facet client "munlink $MOUNT/$tfile"
101 }
102 run_test 10 "finish request on server after client eviction (bug 1521)"
103
104 #bug 2460
105 # wake up a thread waiting for completion after eviction
106 test_11(){
107     do_facet client multiop $MOUNT/$tfile Ow  || return 1
108     do_facet client multiop $MOUNT/$tfile or  || return 2
109
110     cancel_lru_locks osc
111
112     do_facet client multiop $MOUNT/$tfile or  || return 3
113     drop_bl_callback multiop $MOUNT/$tfile Ow || echo "evicted as expected"
114
115     do_facet client munlink $MOUNT/$tfile  || return 4
116 }
117 run_test 11 "wake up a thread waiting for completion after eviction (b=2460)"
118
119 #b=2494
120 test_12(){
121     $LCTL mark multiop $MOUNT/$tfile OS_c 
122     do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x115"
123     clear_failloc $SINGLEMDS $((TIMEOUT * 2)) &
124     multiop $MOUNT/$tfile OS_c  &
125     PID=$!
126 #define OBD_FAIL_MDS_CLOSE_NET           0x115
127     sleep 2
128     kill -USR1 $PID
129     echo "waiting for multiop $PID"
130     wait $PID || return 2
131     do_facet client munlink $MOUNT/$tfile  || return 3
132 }
133 run_test 12 "recover from timed out resend in ptlrpcd (b=2494)"
134
135 # Bug 113, check that readdir lost recv timeout works.
136 test_13() {
137     mkdir $MOUNT/readdir || return 1
138     touch $MOUNT/readdir/newentry || return
139 # OBD_FAIL_MDS_READPAGE_NET|OBD_FAIL_ONCE
140     do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000104"
141     ls $MOUNT/readdir || return 3
142     do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
143     rm -rf $MOUNT/readdir || return 4
144 }
145 run_test 13 "mdc_readpage restart test (bug 1138)"
146
147 # Bug 113, check that readdir lost send timeout works.
148 test_14() {
149     mkdir $MOUNT/readdir
150     touch $MOUNT/readdir/newentry
151 # OBD_FAIL_MDS_SENDPAGE|OBD_FAIL_ONCE
152     do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000106"
153     ls $MOUNT/readdir || return 1
154     do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
155 }
156 run_test 14 "mdc_readpage resend test (bug 1138)"
157
158 test_15() {
159     do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000128"
160     touch $DIR/$tfile && return 1
161     return 0
162 }
163 run_test 15 "failed open (-ENOMEM)"
164
165 READ_AHEAD=`cat $LPROC/llite/*/max_read_ahead_mb | head -n 1`
166 stop_read_ahead() {
167    for f in $LPROC/llite/*/max_read_ahead_mb; do 
168       echo 0 > $f
169    done
170 }
171
172 start_read_ahead() {
173    for f in $LPROC/llite/*/max_read_ahead_mb; do 
174       echo $READ_AHEAD > $f
175    done
176 }
177
178 test_16() {
179     do_facet client cp /etc/termcap $MOUNT
180     sync
181     stop_read_ahead
182
183 #define OBD_FAIL_PTLRPC_BULK_PUT_NET 0x504 | OBD_FAIL_ONCE
184     do_facet ost1 "sysctl -w lustre.fail_loc=0x80000504"
185     cancel_lru_locks osc
186     # OST bulk will time out here, client resends
187     do_facet client "cmp /etc/termcap $MOUNT/termcap" || return 1
188     do_facet ost1 sysctl -w lustre.fail_loc=0
189     # give recovery a chance to finish (shouldn't take long)
190     sleep $TIMEOUT
191     do_facet client "cmp /etc/termcap $MOUNT/termcap" || return 2
192     start_read_ahead
193 }
194 run_test 16 "timeout bulk put, don't evict client (2732)"
195
196 test_17() {
197     # OBD_FAIL_PTLRPC_BULK_GET_NET 0x0503 | OBD_FAIL_ONCE
198     # OST bulk will time out here, client retries
199     do_facet ost1 sysctl -w lustre.fail_loc=0x80000503
200     # need to ensure we send an RPC
201     do_facet client cp /etc/termcap $DIR/$tfile
202     sync
203
204     sleep $TIMEOUT
205     do_facet ost1 sysctl -w lustre.fail_loc=0
206     do_facet client "df $DIR"
207     # expect cmp to succeed, client resent bulk
208     do_facet client "cmp /etc/termcap $DIR/$tfile" || return 3
209     do_facet client "rm $DIR/$tfile" || return 4
210     return 0
211 }
212 run_test 17 "timeout bulk get, don't evict client (2732)"
213
214 test_18a() {
215     [ -z ${ost2_svc} ] && skip "needs 2 osts" && return 0
216
217     do_facet client mkdir -p $MOUNT/$tdir
218     f=$MOUNT/$tdir/$tfile
219
220     cancel_lru_locks osc
221     pgcache_empty || return 1
222
223     # 1 stripe on ost2
224     lfs setstripe $f -s $((128 * 1024)) -i 1 -c 1
225
226     do_facet client cp /etc/termcap $f
227     sync
228     local osc2dev=`grep ${ost2_svc}-osc- $LPROC/devices | egrep -v 'MDT' | awk '{print $1}'`
229     $LCTL --device $osc2dev deactivate || return 3
230     # my understanding is that there should be nothing in the page
231     # cache after the client reconnects?     
232     rc=0
233     pgcache_empty || rc=2
234     $LCTL --device $osc2dev activate
235     rm -f $f
236     return $rc
237 }
238 run_test 18a "manual ost invalidate clears page cache immediately"
239
240 test_18b() {
241     do_facet client mkdir -p $MOUNT/$tdir
242     f=$MOUNT/$tdir/$tfile
243     f2=$MOUNT/$tdir/${tfile}-2
244
245     cancel_lru_locks osc
246     pgcache_empty || return 1
247
248     # shouldn't have to set stripe size of count==1
249     lfs setstripe $f -s $((128 * 1024)) -i 0 -c 1
250     lfs setstripe $f2 -s $((128 * 1024)) -i 0 -c 1
251
252     do_facet client cp /etc/termcap $f
253     sync
254     ost_evict_client
255     # allow recovery to complete
256     sleep $((TIMEOUT + 2))
257     # my understanding is that there should be nothing in the page
258     # cache after the client reconnects?     
259     rc=0
260     pgcache_empty || rc=2
261     rm -f $f $f2
262     return $rc
263 }
264 run_test 18b "eviction and reconnect clears page cache (2766)"
265
266 test_19a() {
267     f=$MOUNT/$tfile
268     do_facet client mcreate $f        || return 1
269     drop_ldlm_cancel "chmod 0777 $f"  || echo "evicted as expected"
270
271     do_facet client checkstat -v -p 0777 $f  || echo evicted
272     # let the client reconnect
273     sleep 5
274     do_facet client "munlink $f"
275 }
276 run_test 19a "test expired_lock_main on mds (2867)"
277
278 test_19b() {
279     f=$MOUNT/$tfile
280     do_facet client multiop $f Ow  || return 1
281     do_facet client multiop $f or  || return 2
282
283     cancel_lru_locks osc
284
285     do_facet client multiop $f or  || return 3
286     drop_ldlm_cancel multiop $f Ow  || echo "client evicted, as expected"
287
288     do_facet client munlink $f  || return 4
289 }
290 run_test 19b "test expired_lock_main on ost (2867)"
291
292 test_20a() {    # bug 2983 - ldlm_handle_enqueue cleanup
293         mkdir -p $DIR/$tdir
294         multiop $DIR/$tdir/${tfile} O_wc &
295         MULTI_PID=$!
296         sleep 1
297         cancel_lru_locks osc
298 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308
299         do_facet ost1 sysctl -w lustre.fail_loc=0x80000308
300         kill -USR1 $MULTI_PID
301         wait $MULTI_PID
302         rc=$?
303         [ $rc -eq 0 ] && error "multiop didn't fail enqueue: rc $rc" || true
304 }
305 run_test 20a "ldlm_handle_enqueue error (should return error)" 
306
307 test_20b() {    # bug 2986 - ldlm_handle_enqueue error during open
308         mkdir -p $DIR/$tdir
309         touch $DIR/$tdir/${tfile}
310         cancel_lru_locks osc
311 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308
312         do_facet ost1 sysctl -w lustre.fail_loc=0x80000308
313         dd if=/etc/hosts of=$DIR/$tdir/$tfile && \
314                 error "didn't fail open enqueue" || true
315 }
316 run_test 20b "ldlm_handle_enqueue error (should return error)"
317
318 test_21a() {
319        mkdir -p $DIR/$tdir-1
320        mkdir -p $DIR/$tdir-2
321        multiop $DIR/$tdir-1/f O_c &
322        close_pid=$!
323
324        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000129"
325        multiop $DIR/$tdir-2/f Oc &
326        open_pid=$!
327        sleep 1
328        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
329
330        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000115"
331        kill -USR1 $close_pid
332        cancel_lru_locks mdc
333        wait $close_pid || return 1
334        wait $open_pid || return 2
335        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
336
337        $CHECKSTAT -t file $DIR/$tdir-1/f || return 3
338        $CHECKSTAT -t file $DIR/$tdir-2/f || return 4
339
340        rm -rf $DIR/$tdir-*
341 }
342 run_test 21a "drop close request while close and open are both in flight"
343
344 test_21b() {
345        mkdir -p $DIR/$tdir-1
346        mkdir -p $DIR/$tdir-2
347        multiop $DIR/$tdir-1/f O_c &
348        close_pid=$!
349
350        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000107"
351        mcreate $DIR/$tdir-2/f &
352        open_pid=$!
353        sleep 1
354        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
355
356        kill -USR1 $close_pid
357        cancel_lru_locks mdc
358        wait $close_pid || return 1
359        wait $open_pid || return 3
360
361        $CHECKSTAT -t file $DIR/$tdir-1/f || return 4
362        $CHECKSTAT -t file $DIR/$tdir-2/f || return 5
363        rm -rf $DIR/$tdir-*
364 }
365 run_test 21b "drop open request while close and open are both in flight"
366
367 test_21c() {
368        mkdir -p $DIR/$tdir-1
369        mkdir -p $DIR/$tdir-2
370        multiop $DIR/$tdir-1/f O_c &
371        close_pid=$!
372
373        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000107"
374        mcreate $DIR/$tdir-2/f &
375        open_pid=$!
376        sleep 3
377        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
378
379        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000115"
380        kill -USR1 $close_pid
381        cancel_lru_locks mdc
382        wait $close_pid || return 1
383        wait $open_pid || return 2
384
385        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
386
387        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
388        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
389        rm -rf $DIR/$tdir-*
390 }
391 run_test 21c "drop both request while close and open are both in flight"
392
393 test_21d() {
394        mkdir -p $DIR/$tdir-1
395        mkdir -p $DIR/$tdir-2
396        multiop $DIR/$tdir-1/f O_c &
397        pid=$!
398
399        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000129"
400        multiop $DIR/$tdir-2/f Oc &
401        sleep 1
402        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
403
404        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000122"
405        kill -USR1 $pid
406        cancel_lru_locks mdc
407        wait $pid || return 1
408        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
409
410        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
411        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
412
413        rm -rf $DIR/$tdir-*
414 }
415 run_test 21d "drop close reply while close and open are both in flight"
416
417 test_21e() {
418        mkdir -p $DIR/$tdir-1
419        mkdir -p $DIR/$tdir-2
420        multiop $DIR/$tdir-1/f O_c &
421        pid=$!
422
423        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000119"
424        touch $DIR/$tdir-2/f &
425        sleep 1
426        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
427
428        kill -USR1 $pid
429        cancel_lru_locks mdc
430        wait $pid || return 1
431
432        sleep $TIMEOUT
433        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
434        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
435        rm -rf $DIR/$tdir-*
436 }
437 run_test 21e "drop open reply while close and open are both in flight"
438
439 test_21f() {
440        mkdir -p $DIR/$tdir-1
441        mkdir -p $DIR/$tdir-2
442        multiop $DIR/$tdir-1/f O_c &
443        pid=$!
444
445        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000119"
446        touch $DIR/$tdir-2/f &
447        sleep 1
448        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
449
450        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000122"
451        kill -USR1 $pid
452        cancel_lru_locks mdc
453        wait $pid || return 1
454        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
455
456        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
457        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
458        rm -rf $DIR/$tdir-*
459 }
460 run_test 21f "drop both reply while close and open are both in flight"
461
462 test_21g() {
463        mkdir -p $DIR/$tdir-1
464        mkdir -p $DIR/$tdir-2
465        multiop $DIR/$tdir-1/f O_c &
466        pid=$!
467
468        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000119"
469        touch $DIR/$tdir-2/f &
470        sleep 1
471        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
472
473        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000115"
474        kill -USR1 $pid
475        cancel_lru_locks mdc
476        wait $pid || return 1
477        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
478
479        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
480        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
481        rm -rf $DIR/$tdir-*
482 }
483 run_test 21g "drop open reply and close request while close and open are both in flight"
484
485 test_21h() {
486        mkdir -p $DIR/$tdir-1
487        mkdir -p $DIR/$tdir-2
488        multiop $DIR/$tdir-1/f O_c &
489        pid=$!
490
491        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000107"
492        touch $DIR/$tdir-2/f &
493        touch_pid=$!
494        sleep 1
495        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
496
497        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000122"
498        cancel_lru_locks mdc
499        kill -USR1 $pid
500        wait $pid || return 1
501        do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
502
503        wait $touch_pid || return 2
504
505        $CHECKSTAT -t file $DIR/$tdir-1/f || return 3
506        $CHECKSTAT -t file $DIR/$tdir-2/f || return 4
507        rm -rf $DIR/$tdir-*
508 }
509 run_test 21h "drop open request and close reply while close and open are both in flight"
510
511 # bug 3462 - multiple MDC requests
512 test_22() {
513     f1=$DIR/${tfile}-1
514     f2=$DIR/${tfile}-2
515     
516     do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000115"
517     multiop $f2 Oc &
518     close_pid=$!
519
520     sleep 1
521     multiop $f1 msu || return 1
522
523     cancel_lru_locks mdc
524     do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
525
526     wait $close_pid || return 2
527     rm -rf $f2 || return 4
528 }
529 run_test 22 "drop close request and do mknod"
530
531 test_23() { #b=4561
532     multiop $DIR/$tfile O_c &
533     pid=$!
534     # give a chance for open
535     sleep 5
536
537     # try the close
538     drop_request "kill -USR1 $pid"
539
540     fail $SINGLEMDS
541     wait $pid || return 1
542     return 0
543 }
544 run_test 23 "client hang when close a file after mds crash"
545
546 test_24() {     # bug 2248 - eviction fails writeback but app doesn't see it
547         mkdir -p $DIR/$tdir
548         cancel_lru_locks osc
549         multiop $DIR/$tdir/$tfile Owy_wyc &
550         MULTI_PID=$!
551         usleep 500
552         ost_evict_client
553         usleep 500
554         kill -USR1 $MULTI_PID
555         wait $MULTI_PID
556         rc=$?
557         sysctl -w lustre.fail_loc=0x0
558         client_reconnect
559         [ $rc -eq 0 ] && error_ignore 5494 "multiop didn't fail fsync: rc $rc" || true
560 }
561 run_test 24 "fsync error (should return error)"
562
563 test_26() {      # bug 5921 - evict dead exports by pinger
564 # this test can only run from a client on a separate node.
565         remote_ost || skip "local OST" && return
566         remote_mds || skip "local MDS" && return
567         OST_FILE=$LPROC/obdfilter/${ost1_svc}/num_exports
568         OST_EXP="`do_facet ost1 cat $OST_FILE`"
569         OST_NEXP1=`echo $OST_EXP | cut -d' ' -f2`
570         echo starting with $OST_NEXP1 OST exports
571 # OBD_FAIL_PTLRPC_DROP_RPC 0x505
572         do_facet client sysctl -w lustre.fail_loc=0x505
573         # evictor takes up to 2.25x to evict.  But if there's a 
574         # race to start the evictor from various obds, the loser
575         # might have to wait for the next ping.
576         echo Waiting for $(($TIMEOUT * 4)) secs
577         sleep $(($TIMEOUT * 4))
578         OST_EXP="`do_facet ost1 cat $OST_FILE`"
579         OST_NEXP2=`echo $OST_EXP | cut -d' ' -f2`
580         echo ending with $OST_NEXP2 OST exports
581         do_facet client sysctl -w lustre.fail_loc=0x0
582         [ $OST_NEXP1 -le $OST_NEXP2 ] && error "client not evicted"
583         return 0
584 }
585 run_test 26 "evict dead exports"
586
587 test_26b() {      # bug 10140 - evict dead exports by pinger
588         client_df
589         zconf_mount `hostname` $MOUNT2 || error "Failed to mount $MOUNT2"
590         sleep 1 # wait connections being established
591         MDS_FILE=$LPROC/mdt/${mds1_svc}/num_exports
592         MDS_NEXP1="`do_facet $SINGLEMDS cat $MDS_FILE | cut -d' ' -f2`"
593         OST_FILE=$LPROC/obdfilter/${ost1_svc}/num_exports
594         OST_NEXP1="`do_facet ost1 cat $OST_FILE | cut -d' ' -f2`"
595         echo starting with $OST_NEXP1 OST and $MDS_NEXP1 MDS exports
596         zconf_umount `hostname` $MOUNT2 -f
597         # evictor takes up to 2.25x to evict.  But if there's a 
598         # race to start the evictor from various obds, the loser
599         # might have to wait for the next ping.
600         echo Waiting for $(($TIMEOUT * 4)) secs
601         sleep $(($TIMEOUT * 4))
602         OST_NEXP2="`do_facet ost1 cat $OST_FILE | cut -d' ' -f2`"
603         MDS_NEXP2="`do_facet $SINGLEMDS cat $MDS_FILE | cut -d' ' -f2`"
604         echo ending with $OST_NEXP2 OST and $MDS_NEXP2 MDS exports
605         [ $OST_NEXP1 -le $OST_NEXP2 ] && error "client not evicted from OST"
606         [ $MDS_NEXP1 -le $MDS_NEXP2 ] && error "client not evicted from MDS"
607         return 0
608 }
609 run_test 26b "evict dead exports"
610
611 test_27() {
612         remote_mds && { skip "remote MDS" && return 0; }
613         mkdir -p $DIR/$tdir
614         writemany -q -a $DIR/$tdir/$tfile 0 5 &
615         CLIENT_PID=$!
616         sleep 1
617         FAILURE_MODE="SOFT"
618         facet_failover $SINGLEMDS
619 #define OBD_FAIL_OSC_SHUTDOWN            0x407
620         sysctl -w lustre.fail_loc=0x80000407
621         # need to wait for reconnect
622         echo -n waiting for fail_loc
623         while [ `sysctl -n lustre.fail_loc` -eq -2147482617 ]; do
624             sleep 1
625             echo -n .
626         done
627         facet_failover $SINGLEMDS
628         #no crashes allowed!
629         kill -USR1 $CLIENT_PID
630         wait $CLIENT_PID 
631         true
632 }
633 run_test 27 "fail LOV while using OSC's"
634
635 test_28() {      # bug 6086 - error adding new clients
636         do_facet client mcreate $MOUNT/$tfile       || return 1
637         drop_bl_callback "chmod 0777 $MOUNT/$tfile" ||echo "evicted as expected"
638         #define OBD_FAIL_MDS_CLIENT_ADD 0x12f
639         do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x8000012f"
640         # fail once (evicted), reconnect fail (fail_loc), ok
641         df || (sleep 10; df) || (sleep 10; df) || error "reconnect failed"
642         rm -f $MOUNT/$tfile
643         fail $SINGLEMDS         # verify MDS last_rcvd can be loaded
644 }
645 run_test 28 "handle error adding new clients (bug 6086)"
646
647 test_50() {
648         mkdir -p $DIR/$tdir
649         # put a load of file creates/writes/deletes
650         writemany -q $DIR/$tdir/$tfile 0 5 &
651         CLIENT_PID=$!
652         echo writemany pid $CLIENT_PID
653         sleep 10
654         FAILURE_MODE="SOFT"
655         fail $SINGLEMDS
656         # wait for client to reconnect to MDS
657         sleep 60
658         fail $SINGLEMDS
659         sleep 60
660         fail $SINGLEMDS
661         # client process should see no problems even though MDS went down
662         sleep $TIMEOUT
663         kill -USR1 $CLIENT_PID
664         wait $CLIENT_PID 
665         rc=$?
666         echo writemany returned $rc
667         #these may fail because of eviction due to slow AST response.
668         [ $rc -eq 0 ] || error_ignore 13652 "writemany returned rc $rc" || true
669 }
670 run_test 50 "failover MDS under load"
671
672 test_51() {
673         mkdir -p $DIR/$tdir
674         # put a load of file creates/writes/deletes
675         writemany -q $DIR/$tdir/$tfile 0 5 &
676         CLIENT_PID=$!
677         sleep 1
678         FAILURE_MODE="SOFT"
679         facet_failover $SINGLEMDS
680         # failover at various points during recovery
681         SEQ="1 5 10 $(seq $TIMEOUT 5 $(($TIMEOUT+10)))"
682         echo will failover at $SEQ
683         for i in $SEQ
684           do
685           echo failover in $i sec
686           sleep $i
687           facet_failover $SINGLEMDS
688         done
689         # client process should see no problems even though MDS went down
690         # and recovery was interrupted
691         sleep $TIMEOUT
692         kill -USR1 $CLIENT_PID
693         wait $CLIENT_PID 
694         rc=$?
695         echo writemany returned $rc
696         [ $rc -eq 0 ] || error_ignore 13652 "writemany returned rc $rc" || true
697 }
698 run_test 51 "failover MDS during recovery"
699
700 test_52_guts() {
701         do_facet client "writemany -q -a $DIR/$tdir/$tfile 300 5" &
702         CLIENT_PID=$!
703         echo writemany pid $CLIENT_PID
704         sleep 10
705         FAILURE_MODE="SOFT"
706         fail ost1
707         rc=0
708         wait $CLIENT_PID || rc=$?
709         # active client process should see an EIO for down OST
710         [ $rc -eq 5 ] && { echo "writemany correctly failed $rc" && return 0; }
711         # but timing or failover setup may allow success
712         [ $rc -eq 0 ] && { echo "writemany succeeded" && return 0; }
713         echo "writemany returned $rc"
714         return $rc
715 }
716
717 test_52() {
718         mkdir -p $DIR/$tdir
719         test_52_guts
720         rc=$?
721         [ $rc -ne 0 ] && { return $rc; }
722         # wait for client to reconnect to OST
723         sleep 30
724         test_52_guts
725         rc=$?
726         [ $rc -ne 0 ] && { return $rc; }
727         sleep 30
728         test_52_guts
729         rc=$?
730         client_reconnect
731         #return $rc
732 }
733 run_test 52 "failover OST under load"
734
735 # test of open reconstruct
736 test_53() {
737         touch $DIR/$tfile
738         drop_ldlm_reply "openfile -f O_RDWR:O_CREAT -m 0755 $DIR/$tfile" ||\
739                 return 2
740 }
741 run_test 53 "touch: drop rep"
742
743 test_54() {
744         zconf_mount `hostname` $MOUNT2
745         touch $DIR/$tfile
746         touch $DIR2/$tfile.1
747         sleep 10
748         cat $DIR2/$tfile.missing # save transno = 0, rc != 0 into last_rcvd
749         fail $SINGLEMDS
750         umount $MOUNT2
751         ERROR=`dmesg | egrep "(test 54|went back in time)" | tail -n1 | grep "went back in time"`
752         [ x"$ERROR" == x ] || error "back in time occured"
753 }
754 run_test 54 "back in time"
755
756 # bug 11330 - liblustre application death during I/O locks up OST
757 test_55() {
758         remote_ost && { skip "remote OST" && return 0; }
759
760         mkdir -p $DIR/$tdir
761
762         # first dd should be finished quickly
763         dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=32M count=4  &
764         DDPID=$!
765         count=0
766         echo  "step1: testing ......"
767         while [ true ]; do
768             if [ -z `ps x | awk '$1 == '$DDPID' { print $5 }'` ]; then break; fi
769             count=$[count+1]
770             if [ $count -gt 64 ]; then
771                 error "dd should be finished!"
772             fi
773             sleep 1
774         done    
775         echo "(dd_pid=$DDPID, time=$count)successful"
776
777         #define OBD_FAIL_OST_DROP_REQ            0x21d
778         do_facet ost sysctl -w lustre.fail_loc=0x0000021d
779         # second dd will be never finished
780         dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=32M count=4  &        
781         DDPID=$!
782         count=0
783         echo  "step2: testing ......"
784         while [ $count -le 64 ]; do
785             dd_name="`ps x | awk '$1 == '$DDPID' { print $5 }'`"            
786             if [ -z  $dd_name ]; then 
787                 ls -l $DIR/$tdir
788                 echo  "debug: (dd_name=$dd_name, dd_pid=$DDPID, time=$count)"
789                 error "dd shouldn't be finished!"
790             fi
791             count=$[count+1]
792             sleep 1
793         done    
794         echo "(dd_pid=$DDPID, time=$count)successful"
795
796         #Recover fail_loc and dd will finish soon
797         do_facet ost sysctl -w lustre.fail_loc=0
798         count=0
799         echo  "step3: testing ......"
800         while [ true ]; do
801             if [ -z `ps x | awk '$1 == '$DDPID' { print $5 }'` ]; then break; fi
802             count=$[count+1]
803             if [ $count -gt 500 ]; then
804                 error "dd should be finished!"
805             fi
806             sleep 1
807         done    
808         echo "(dd_pid=$DDPID, time=$count)successful"
809
810         rm -rf $DIR/$tdir
811 }
812 run_test 55 "ost_brw_read/write drops timed-out read/write request"
813
814 test_56() { # b=11277
815 #define OBD_FAIL_MDS_RESEND      0x136
816         touch $DIR/$tfile
817         do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000136"
818         stat $DIR/$tfile
819         do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
820         rm -f $DIR/$tfile
821 }
822 run_test 56 "do not allow reconnect to busy exports"
823
824 test_57_helper() {
825         # no oscs means no client or mdt 
826         while [ -e $LPROC/osc ]; do
827                 for f in `find $LPROC -type f`; do 
828                         cat $f > /dev/null 2>&1
829                 done
830         done
831 }
832
833 test_57() { # bug 10866
834         test_57_helper &
835         pid=$!
836         sleep 1
837 #define OBD_FAIL_LPROC_REMOVE            0xB00
838         sysctl -w lustre.fail_loc=0x80000B00
839         zconf_umount `hostname` $DIR
840         sysctl -w lustre.fail_loc=0x80000B00
841         fail_abort $SINGLEMDS
842         kill -9 $pid
843         sysctl -w lustre.fail_loc=0
844         mount_client $DIR
845         do_facet client "df $DIR"
846 }
847 run_test 57 "read procfs entries causes kernel crash"
848
849 test_58() { # bug 11546
850 #define OBD_FAIL_MDC_ENQUEUE_PAUSE        0x801
851         touch $MOUNT/$tfile
852         ls -la $MOUNT/$tfile
853         sysctl -w lustre.fail_loc=0x80000801
854         cp $MOUNT/$tfile /dev/null &
855         pid=$!
856         sleep 1
857         sysctl -w lustre.fail_loc=0
858         drop_bl_callback rm -f $MOUNT/$tfile
859         wait $pid
860         do_facet client "df $DIR"
861 }
862 run_test 58 "Eviction in the middle of open RPC reply processing"
863
864 test_59() { # bug 10589
865         zconf_mount `hostname` $MOUNT2 || error "Failed to mount $MOUNT2"
866 #define OBD_FAIL_LDLM_CANCEL_EVICT_RACE  0x311
867         sysctl -w lustre.fail_loc=0x311
868         writes=`dd if=/dev/zero of=$DIR2/$tfile count=1 2>&1 | awk 'BEGIN { FS="+" } /out/ {print $1}'`
869         sysctl -w lustre.fail_loc=0
870         sync
871         zconf_umount `hostname` $DIR2 -f
872         reads=`dd if=$DIR/$tfile of=/dev/null 2>&1 | awk 'BEGIN { FS="+" } /in/ {print $1}'`
873         [ $reads -eq $writes ] || error "read" $reads "blocks, must be" $writes
874 }
875 run_test 59 "Read cancel race on client eviction"
876
877 equals_msg `basename $0`: test complete, cleaning up
878 check_and_cleanup_lustre
879 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true