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 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         sleep 1 # wait connections being established
585         MDS_FILE=$LPROC/mdt/${mds1_svc}/num_exports
586         MDS_NEXP1="`do_facet $SINGLEMDS cat $MDS_FILE | cut -d' ' -f2`"
587         OST_FILE=$LPROC/obdfilter/${ost1_svc}/num_exports
588         OST_NEXP1="`do_facet ost1 cat $OST_FILE | cut -d' ' -f2`"
589         echo starting with $OST_NEXP1 OST and $MDS_NEXP1 MDS exports
590         zconf_umount `hostname` $MOUNT2 -f
591         # evictor takes up to 2.25x to evict.  But if there's a 
592         # race to start the evictor from various obds, the loser
593         # might have to wait for the next ping.
594         echo Waiting for $(($TIMEOUT * 4)) secs
595         sleep $(($TIMEOUT * 4))
596         OST_NEXP2="`do_facet ost1 cat $OST_FILE | cut -d' ' -f2`"
597         MDS_NEXP2="`do_facet $SINGLEMDS cat $MDS_FILE | cut -d' ' -f2`"
598         echo ending with $OST_NEXP2 OST and $MDS_NEXP2 MDS exports
599         [ $OST_NEXP1 -le $OST_NEXP2 ] && error "client not evicted from OST"
600         [ $MDS_NEXP1 -le $MDS_NEXP2 ] && error "client not evicted from MDS"
601         return 0
602 }
603 run_test 26b "evict dead exports"
604
605 test_27() {
606         remote_mds && { skip "remote MDS" && return 0; }
607         mkdir -p $DIR/$tdir
608         writemany -q -a $DIR/$tdir/$tfile 0 5 &
609         CLIENT_PID=$!
610         sleep 1
611         FAILURE_MODE="SOFT"
612         facet_failover $SINGLEMDS
613 #define OBD_FAIL_OSC_SHUTDOWN            0x407
614         sysctl -w lustre.fail_loc=0x80000407
615         # need to wait for reconnect
616         echo -n waiting for fail_loc
617         while [ `sysctl -n lustre.fail_loc` -eq -2147482617 ]; do
618             sleep 1
619             echo -n .
620         done
621         facet_failover $SINGLEMDS
622         #no crashes allowed!
623         kill -USR1 $CLIENT_PID
624         wait $CLIENT_PID 
625         true
626 }
627 run_test 27 "fail LOV while using OSC's"
628
629 test_28() {      # bug 6086 - error adding new clients
630         do_facet client mcreate $MOUNT/$tfile       || return 1
631         drop_bl_callback "chmod 0777 $MOUNT/$tfile" ||echo "evicted as expected"
632         #define OBD_FAIL_MDS_CLIENT_ADD 0x12f
633         do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x8000012f"
634         # fail once (evicted), reconnect fail (fail_loc), ok
635         df || (sleep 10; df) || (sleep 10; df) || error "reconnect failed"
636         rm -f $MOUNT/$tfile
637         fail $SINGLEMDS         # verify MDS last_rcvd can be loaded
638 }
639 run_test 28 "handle error adding new clients (bug 6086)"
640
641 test_50() {
642         mkdir -p $DIR/$tdir
643         # put a load of file creates/writes/deletes
644         writemany -q $DIR/$tdir/$tfile 0 5 &
645         CLIENT_PID=$!
646         echo writemany pid $CLIENT_PID
647         sleep 10
648         FAILURE_MODE="SOFT"
649         fail $SINGLEMDS
650         # wait for client to reconnect to MDS
651         sleep 60
652         fail $SINGLEMDS
653         sleep 60
654         fail $SINGLEMDS
655         # client process should see no problems even though MDS went down
656         sleep $TIMEOUT
657         kill -USR1 $CLIENT_PID
658         wait $CLIENT_PID 
659         rc=$?
660         echo writemany returned $rc
661         #these may fail because of eviction due to slow AST response.
662         return $rc
663 }
664 run_test 50 "failover MDS under load"
665
666 test_51() {
667         mkdir -p $DIR/$tdir
668         # put a load of file creates/writes/deletes
669         writemany -q $DIR/$tdir/$tfile 0 5 &
670         CLIENT_PID=$!
671         sleep 1
672         FAILURE_MODE="SOFT"
673         facet_failover $SINGLEMDS
674         # failover at various points during recovery
675         SEQ="1 5 10 $(seq $TIMEOUT 5 $(($TIMEOUT+10)))"
676         echo will failover at $SEQ
677         for i in $SEQ
678           do
679           echo failover in $i sec
680           sleep $i
681           facet_failover $SINGLEMDS
682         done
683         # client process should see no problems even though MDS went down
684         # and recovery was interrupted
685         sleep $TIMEOUT
686         kill -USR1 $CLIENT_PID
687         wait $CLIENT_PID 
688         rc=$?
689         echo writemany returned $rc
690         return $rc
691 }
692 run_test 51 "failover MDS during recovery"
693
694 test_52_guts() {
695         do_facet client "writemany -q -a $DIR/$tdir/$tfile 300 5" &
696         CLIENT_PID=$!
697         echo writemany pid $CLIENT_PID
698         sleep 10
699         FAILURE_MODE="SOFT"
700         fail ost1
701         rc=0
702         wait $CLIENT_PID || rc=$?
703         # active client process should see an EIO for down OST
704         [ $rc -eq 5 ] && { echo "writemany correctly failed $rc" && return 0; }
705         # but timing or failover setup may allow success
706         [ $rc -eq 0 ] && { echo "writemany succeeded" && return 0; }
707         echo "writemany returned $rc"
708         return $rc
709 }
710
711 test_52() {
712         mkdir -p $DIR/$tdir
713         test_52_guts
714         rc=$?
715         [ $rc -ne 0 ] && { return $rc; }
716         # wait for client to reconnect to OST
717         sleep 30
718         test_52_guts
719         rc=$?
720         [ $rc -ne 0 ] && { return $rc; }
721         sleep 30
722         test_52_guts
723         rc=$?
724         client_reconnect
725         #return $rc
726 }
727 run_test 52 "failover OST under load"
728
729 # test of open reconstruct
730 test_53() {
731         touch $DIR/$tfile
732         drop_ldlm_reply "openfile -f O_RDWR:O_CREAT -m 0755 $DIR/$tfile" ||\
733                 return 2
734 }
735 run_test 53 "touch: drop rep"
736
737 test_54() {
738         zconf_mount `hostname` $MOUNT2
739         touch $DIR/$tfile
740         touch $DIR2/$tfile.1
741         sleep 10
742         cat $DIR2/$tfile.missing # save transno = 0, rc != 0 into last_rcvd
743         fail $SINGLEMDS
744         umount $MOUNT2
745         ERROR=`dmesg | egrep "(test 54|went back in time)" | tail -n1 | grep "went back in time"`
746         [ x"$ERROR" == x ] || error "back in time occured"
747 }
748 run_test 54 "back in time"
749
750 # bug 11330 - liblustre application death during I/O locks up OST
751 test_55() {
752         remote_ost && { skip "remote OST" && return 0; }
753
754         mkdir -p $DIR/$tdir
755
756         # first dd should be finished quickly
757         dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=32M count=4  &
758         DDPID=$!
759         count=0
760         echo  "step1: testing ......"
761         while [ true ]; do
762             if [ -z `ps x | awk '$1 == '$DDPID' { print $5 }'` ]; then break; fi
763             count=$[count+1]
764             if [ $count -gt 64 ]; then
765                 error "dd should be finished!"
766             fi
767             sleep 1
768         done    
769         echo "(dd_pid=$DDPID, time=$count)successful"
770
771         #define OBD_FAIL_OST_DROP_REQ            0x21d
772         do_facet ost sysctl -w lustre.fail_loc=0x0000021d
773         # second dd will be never finished
774         dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=32M count=4  &        
775         DDPID=$!
776         count=0
777         echo  "step2: testing ......"
778         while [ $count -le 64 ]; do
779             dd_name="`ps x | awk '$1 == '$DDPID' { print $5 }'`"            
780             if [ -z  $dd_name ]; then 
781                 ls -l $DIR/$tdir
782                 echo  "debug: (dd_name=$dd_name, dd_pid=$DDPID, time=$count)"
783                 error "dd shouldn't be finished!"
784             fi
785             count=$[count+1]
786             sleep 1
787         done    
788         echo "(dd_pid=$DDPID, time=$count)successful"
789
790         #Recover fail_loc and dd will finish soon
791         do_facet ost sysctl -w lustre.fail_loc=0
792         count=0
793         echo  "step3: testing ......"
794         while [ true ]; do
795             if [ -z `ps x | awk '$1 == '$DDPID' { print $5 }'` ]; then break; fi
796             count=$[count+1]
797             if [ $count -gt 500 ]; then
798                 error "dd should be finished!"
799             fi
800             sleep 1
801         done    
802         echo "(dd_pid=$DDPID, time=$count)successful"
803
804         rm -rf $DIR/$tdir
805 }
806 run_test 55 "ost_brw_read/write drops timed-out read/write request"
807
808 test_56() { # b=11277
809 #define OBD_FAIL_MDS_RESEND      0x136
810         touch $DIR/$tfile
811         do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000136"
812         stat $DIR/$tfile
813         do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0"
814         rm -f $DIR/$tfile
815 }
816 run_test 56 "do not allow reconnect to busy exports"
817
818 test_57_helper() {
819         # no oscs means no client or mdt 
820         while [ -e $LPROC/osc ]; do
821                 for f in `find $LPROC -type f`; do 
822                         cat $f > /dev/null 2>&1
823                 done
824         done
825 }
826
827 test_57() { # bug 10866
828         test_57_helper &
829         pid=$!
830         sleep 1
831 #define OBD_FAIL_LPROC_REMOVE            0xB00
832         sysctl -w lustre.fail_loc=0x80000B00
833         zconf_umount `hostname` $DIR
834         sysctl -w lustre.fail_loc=0x80000B00
835         fail_abort $SINGLEMDS
836         kill -9 $pid
837         sysctl -w lustre.fail_loc=0
838         mount_client $DIR
839         do_facet client "df $DIR"
840 }
841 run_test 57 "read procfs entries causes kernel crash"
842
843 test_58() { # bug 11546
844 #define OBD_FAIL_MDC_ENQUEUE_PAUSE        0x801
845         touch $MOUNT/$tfile
846         ls -la $MOUNT/$tfile
847         sysctl -w lustre.fail_loc=0x80000801
848         cp $MOUNT/$tfile /dev/null &
849         pid=$!
850         sleep 1
851         sysctl -w lustre.fail_loc=0
852         drop_bl_callback rm -f $MOUNT/$tfile
853         wait $pid
854         do_facet client "df $DIR"
855 }
856 run_test 58 "Eviction in the middle of open RPC reply processing"
857
858 test_59() { # bug 10589
859         zconf_mount `hostname` $MOUNT2 || error "Failed to mount $MOUNT2"
860 #define OBD_FAIL_LDLM_CANCEL_EVICT_RACE  0x311
861         sysctl -w lustre.fail_loc=0x311
862         writes=`dd if=/dev/zero of=$DIR2/$tfile count=1 2>&1 | awk 'BEGIN { FS="+" } /out/ {print $1}'`
863         sysctl -w lustre.fail_loc=0
864         sync
865         zconf_umount `hostname` $DIR2 -f
866         reads=`dd if=$DIR/$tfile of=/dev/null 2>&1 | awk 'BEGIN { FS="+" } /in/ {print $1}'`
867         [ $reads -eq $writes ] || error "read" $reads "blocks, must be" $writes
868 }
869 run_test 59 "Read cancel race on client eviction"
870
871 equals_msg `basename $0`: test complete, cleaning up
872 check_and_cleanup_lustre
873 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true