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