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