Whamcloud - gitweb
8e7dfb87ec838ac4125ca28f414a5d9b8d8272f7
[fs/lustre-release.git] / lustre / tests / replay-single.sh
1 #!/bin/sh
2
3 set -e
4
5 #
6 # This test needs to be run on the client
7 #
8
9 LUSTRE=${LUSTRE:-`dirname $0`/..}
10 . $LUSTRE/tests/test-framework.sh
11
12 init_test_env $@
13
14 . ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
15
16 # Skip these tests
17 ALWAYS_EXCEPT=""
18
19
20 gen_config() {
21     rm -f $XMLCONFIG
22     add_mds mds --dev $MDSDEV --size $MDSSIZE
23     if [ ! -z "$mdsfailover_HOST" ]; then
24          add_mdsfailover mds --dev $MDSDEV --size $MDSSIZE
25     fi
26     
27     add_lov lov1 mds --stripe_sz $STRIPE_BYTES\
28         --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
29     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
30     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
31     add_client client mds --lov lov1 --path $MOUNT
32 }
33
34 build_test_filter
35
36 cleanup() {
37     # make sure we are using the primary MDS, so the config log will
38     # be able to clean up properly.
39     activemds=`facet_active mds`
40     if [ $activemds != "mds" ]; then
41         fail mds
42     fi
43     zconf_umount `hostname` $MOUNT
44     stop mds ${FORCE} $MDSLCONFARGS
45     stop ost2 ${FORCE} --dump cleanup.log
46     stop ost ${FORCE} --dump cleanup.log
47 }
48
49 if [ "$ONLY" == "cleanup" ]; then
50     sysctl -w portals.debug=0 || true
51     cleanup
52     exit
53 fi
54
55 SETUP=${SETUP:-"setup"}
56 CLEANUP=${CLEANUP:-"cleanup"}
57
58 setup() {
59     gen_config
60
61     start ost --reformat $OSTLCONFARGS 
62     start ost2 --reformat $OSTLCONFARGS 
63     [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
64     start mds $MDSLCONFARGS --reformat
65     zconf_mount `hostname` $MOUNT
66 }
67
68 $SETUP
69
70 if [ "$ONLY" == "setup" ]; then
71     exit 0
72 fi
73
74 mkdir -p $DIR
75
76 test_0() {
77     replay_barrier mds
78     fail mds
79 }
80 run_test 0 "empty replay"
81
82 test_1() {
83     replay_barrier mds
84     mcreate $DIR/$tfile
85     fail mds
86     $CHECKSTAT -t file $DIR/$tfile || return 1
87     rm $DIR/$tfile
88 }
89 run_test 1 "simple create"
90
91 test_2a() {
92     replay_barrier mds
93     touch $DIR/$tfile
94     fail mds
95     $CHECKSTAT -t file $DIR/$tfile || return 1
96     rm $DIR/$tfile
97 }
98 run_test 2a "touch"
99
100 test_2b() {
101     ./mcreate $DIR/$tfile
102     replay_barrier mds
103     touch $DIR/$tfile
104     fail mds
105     $CHECKSTAT -t file $DIR/$tfile || return 1
106     rm $DIR/$tfile
107 }
108 run_test 2b "touch"
109
110 test_3a() {
111     replay_barrier mds
112     mcreate $DIR/$tfile
113     o_directory $DIR/$tfile
114     fail mds
115     $CHECKSTAT -t file $DIR/$tfile || return 2
116     rm $DIR/$tfile
117 }
118 run_test 3a "replay failed open(O_DIRECTORY)"
119
120 test_3b() {
121     replay_barrier mds
122 #define OBD_FAIL_MDS_OPEN_PACK | OBD_FAIL_ONCE
123     do_facet mds "sysctl -w lustre.fail_loc=0x80000114"
124     touch $DIR/$tfile
125     do_facet mds "sysctl -w lustre.fail_loc=0"
126     fail mds
127     $CHECKSTAT -t file $DIR/$tfile && return 2
128     return 0
129 }
130 run_test 3b "replay failed open -ENOMEM"
131
132 test_3c() {
133     replay_barrier mds
134 #define OBD_FAIL_MDS_ALLOC_OBDO | OBD_FAIL_ONCE
135     do_facet mds "sysctl -w lustre.fail_loc=0x80000128"
136     touch $DIR/$tfile
137     do_facet mds "sysctl -w lustre.fail_loc=0"
138     fail mds
139
140     $CHECKSTAT -t file $DIR/$tfile && return 2
141     return 0
142 }
143 run_test 3c "replay failed open -ENOMEM"
144
145 test_4() {
146     replay_barrier mds
147     for i in `seq 10`; do
148         echo "tag-$i" > $DIR/$tfile-$i
149     done 
150     fail mds
151     for i in `seq 10`; do
152       grep -q "tag-$i" $DIR/$tfile-$i || error "$tfile-$i"
153     done 
154 }
155 run_test 4 "|x| 10 open(O_CREAT)s"
156
157 test_4b() {
158     replay_barrier mds
159     rm -rf $DIR/$tfile-*
160     fail mds
161     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
162 }
163 run_test 4b "|x| rm 10 files"
164
165 # The idea is to get past the first block of precreated files on both 
166 # osts, and then replay.
167 test_5() {
168     replay_barrier mds
169     for i in `seq 220`; do
170         echo "tag-$i" > $DIR/$tfile-$i
171     done 
172     fail mds
173     for i in `seq 220`; do
174       grep -q "tag-$i" $DIR/$tfile-$i || error "f1c-$i"
175     done 
176     rm -rf $DIR/$tfile-*
177     sleep 3
178     # waiting for commitment of removal
179 }
180 run_test 5 "|x| 220 open(O_CREAT)"
181
182
183 test_6() {
184     replay_barrier mds
185     mkdir $DIR/$tdir
186     mcreate $DIR/$tdir/$tfile
187     fail mds
188     $CHECKSTAT -t dir $DIR/$tdir || return 1
189     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
190     sleep 2
191     # waiting for log process thread
192 }
193 run_test 6 "mkdir + contained create"
194
195 test_6b() {
196     replay_barrier mds
197     rm -rf $DIR/$tdir
198     fail mds
199     $CHECKSTAT -t dir $DIR/$tdir && return 1 || true 
200 }
201 run_test 6b "|X| rmdir"
202
203 test_7() {
204     mkdir $DIR/$tdir
205     replay_barrier mds
206     mcreate $DIR/$tdir/$tfile
207     fail mds
208     $CHECKSTAT -t dir $DIR/$tdir || return 1
209     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
210     rm -fr $DIR/$tdir
211 }
212 run_test 7 "mkdir |X| contained create"
213
214 test_8() {
215     replay_barrier mds
216     multiop $DIR/$tfile mo_c &
217     MULTIPID=$!
218     sleep 1
219     fail mds
220     ls $DIR/$tfile
221     $CHECKSTAT -t file $DIR/$tfile || return 1
222     kill -USR1 $MULTIPID || return 2
223     wait $MULTIPID || return 3
224     rm $DIR/$tfile
225 }
226 run_test 8 "creat open |X| close"
227
228 test_9() {
229     replay_barrier mds
230     mcreate $DIR/$tfile
231     local old_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
232     fail mds
233     local new_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
234
235     echo " old_inum == $old_inum, new_inum == $new_inum"
236     if [ $old_inum -eq $new_inum  ] ;
237     then
238         echo " old_inum and new_inum match"
239     else
240         echo "!!!! old_inum and new_inum NOT match"
241         return 1
242     fi
243     rm $DIR/$tfile
244 }
245 run_test 9  "|X| create (same inum/gen)"
246
247 test_10() {
248     mcreate $DIR/$tfile
249     replay_barrier mds
250     mv $DIR/$tfile $DIR/$tfile-2
251     rm -f $DIR/$tfile
252     fail mds
253     $CHECKSTAT $DIR/$tfile && return 1
254     $CHECKSTAT $DIR/$tfile-2 ||return 2
255     rm $DIR/$tfile-2
256     return 0
257 }
258 run_test 10 "create |X| rename unlink"
259
260 test_11() {
261     mcreate $DIR/$tfile
262     echo "old" > $DIR/$tfile
263     mv $DIR/$tfile $DIR/$tfile-2
264     replay_barrier mds
265     echo "new" > $DIR/$tfile
266     grep new $DIR/$tfile 
267     grep old $DIR/$tfile-2
268     fail mds
269     grep new $DIR/$tfile || return 1
270     grep old $DIR/$tfile-2 || return 2
271 }
272 run_test 11 "create open write rename |X| create-old-name read"
273
274 test_12() {
275     mcreate $DIR/$tfile 
276     multiop $DIR/$tfile o_tSc &
277     pid=$!
278     # give multiop a chance to open
279     sleep 1
280     rm -f $DIR/$tfile
281     replay_barrier mds
282     kill -USR1 $pid
283     wait $pid || return 1
284
285     fail mds
286     [ -e $DIR/$tfile ] && return 2
287     return 0
288 }
289 run_test 12 "open, unlink |X| close"
290
291
292 # 1777 - replay open after committed chmod that would make
293 #        a regular open a failure    
294 test_13() {
295     mcreate $DIR/$tfile 
296     multiop $DIR/$tfile O_wc &
297     pid=$!
298     # give multiop a chance to open
299     sleep 1 
300     chmod 0 $DIR/$tfile
301     $CHECKSTAT -p 0 $DIR/$tfile
302     replay_barrier mds
303     fail mds
304     kill -USR1 $pid
305     wait $pid || return 1
306
307     $CHECKSTAT -s 1 -p 0 $DIR/$tfile || return 2
308     return 0
309 }
310 run_test 13 "open chmod 0 |x| write close"
311
312 test_14() {
313     multiop $DIR/$tfile O_tSc &
314     pid=$!
315     # give multiop a chance to open
316     sleep 1 
317     rm -f $DIR/$tfile
318     replay_barrier mds
319     kill -USR1 $pid || return 1
320     wait $pid || return 2
321
322     fail mds
323     [ -e $DIR/$tfile ] && return 3
324     return 0
325 }
326 run_test 14 "open(O_CREAT), unlink |X| close"
327
328 test_15() {
329     multiop $DIR/$tfile O_tSc &
330     pid=$!
331     # give multiop a chance to open
332     sleep 1 
333     rm -f $DIR/$tfile
334     replay_barrier mds
335     touch $DIR/g11 || return 1
336     kill -USR1 $pid
337     wait $pid || return 2
338
339     fail mds
340     [ -e $DIR/$tfile ] && return 3
341     touch $DIR/h11 || return 4
342     return 0
343 }
344 run_test 15 "open(O_CREAT), unlink |X|  touch new, close"
345
346
347 test_16() {
348     replay_barrier mds
349     mcreate $DIR/$tfile
350     munlink $DIR/$tfile
351     mcreate $DIR/$tfile-2
352     fail mds
353     [ -e $DIR/$tfile ] && return 1
354     [ -e $DIR/$tfile-2 ] || return 2
355     munlink $DIR/$tfile-2 || return 3
356 }
357 run_test 16 "|X| open(O_CREAT), unlink, touch new,  unlink new"
358
359 test_17() {
360     replay_barrier mds
361     multiop $DIR/$tfile O_c &
362     pid=$!
363     # give multiop a chance to open
364     sleep 1 
365     fail mds
366     kill -USR1 $pid || return 1
367     wait $pid || return 2
368     $CHECKSTAT -t file $DIR/$tfile || return 3
369     rm $DIR/$tfile
370 }
371 run_test 17 "|X| open(O_CREAT), |replay| close"
372
373 test_18() {
374     replay_barrier mds
375     multiop $DIR/$tfile O_tSc &
376     pid=$!
377     # give multiop a chance to open
378     sleep 1 
379     rm -f $DIR/$tfile
380     touch $DIR/$tfile-2 || return 1
381     echo "pid: $pid will close"
382     kill -USR1 $pid
383     wait $pid || return 2
384
385     fail mds
386     [ -e $DIR/$tfile ] && return 3
387     [ -e $DIR/$tfile-2 ] || return 4
388     # this touch frequently fails
389     touch $DIR/$tfile-3 || return 5
390     munlink $DIR/$tfile-2 || return 6
391     munlink $DIR/$tfile-3 || return 7
392     return 0
393 }
394 run_test 18 "|X| open(O_CREAT), unlink, touch new, close, touch, unlink"
395
396 # bug 1855 (a simpler form of test_11 above)
397 test_19() {
398     replay_barrier mds
399     mcreate $DIR/$tfile
400     echo "old" > $DIR/$tfile
401     mv $DIR/$tfile $DIR/$tfile-2
402     grep old $DIR/$tfile-2
403     fail mds
404     grep old $DIR/$tfile-2 || return 2
405 }
406 run_test 19 "|X| mcreate, open, write, rename "
407
408 test_20() {
409     replay_barrier mds
410     multiop $DIR/$tfile O_tSc &
411     pid=$!
412     # give multiop a chance to open
413     sleep 1 
414     rm -f $DIR/$tfile
415
416     fail mds
417     kill -USR1 $pid
418     wait $pid || return 1
419     [ -e $DIR/$tfile ] && return 2
420     return 0
421 }
422 run_test 20 "|X| open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
423
424 test_21() {
425     replay_barrier mds
426     multiop $DIR/$tfile O_tSc &
427     pid=$!
428     # give multiop a chance to open
429     sleep 1 
430     rm -f $DIR/$tfile
431     touch $DIR/g11 || return 1
432
433     fail mds
434     kill -USR1 $pid
435     wait $pid || return 2
436     [ -e $DIR/$tfile ] && return 3
437     touch $DIR/h11 || return 4
438     return 0
439 }
440 run_test 21 "|X| open(O_CREAT), unlink touch new, replay, close (test mds_cleanup_orphans)"
441
442 test_22() {
443     multiop $DIR/$tfile O_tSc &
444     pid=$!
445     # give multiop a chance to open
446     sleep 1 
447
448     replay_barrier mds
449     rm -f $DIR/$tfile
450
451     fail mds
452     kill -USR1 $pid
453     wait $pid || return 1
454     [ -e $DIR/$tfile ] && return 2
455     return 0
456 }
457 run_test 22 "open(O_CREAT), |X| unlink, replay, close (test mds_cleanup_orphans)"
458
459 test_23() {
460     multiop $DIR/$tfile O_tSc &
461     pid=$!
462     # give multiop a chance to open
463     sleep 1 
464
465     replay_barrier mds
466     rm -f $DIR/$tfile
467     touch $DIR/g11 || return 1
468
469     fail mds
470     kill -USR1 $pid
471     wait $pid || return 2
472     [ -e $DIR/$tfile ] && return 3
473     touch $DIR/h11 || return 4
474     return 0
475 }
476 run_test 23 "open(O_CREAT), |X| unlink touch new, replay, close (test mds_cleanup_orphans)"
477
478 test_24() {
479     multiop $DIR/$tfile O_tSc &
480     pid=$!
481     # give multiop a chance to open
482     sleep 1 
483
484     replay_barrier mds
485     fail mds
486     rm -f $DIR/$tfile
487     kill -USR1 $pid
488     wait $pid || return 1
489     [ -e $DIR/$tfile ] && return 2
490     return 0
491 }
492 run_test 24 "open(O_CREAT), replay, unlink, close (test mds_cleanup_orphans)"
493
494 test_25() {
495     multiop $DIR/$tfile O_tSc &
496     pid=$!
497     # give multiop a chance to open
498     sleep 1 
499     rm -f $DIR/$tfile
500
501     replay_barrier mds
502     fail mds
503     kill -USR1 $pid
504     wait $pid || return 1
505     [ -e $DIR/$tfile ] && return 2
506     return 0
507 }
508 run_test 25 "open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
509
510 test_26() {
511     replay_barrier mds
512     multiop $DIR/$tfile-1 O_tSc &
513     pid1=$!
514     multiop $DIR/$tfile-2 O_tSc &
515     pid2=$!
516     # give multiop a chance to open
517     sleep 1 
518     rm -f $DIR/$tfile-1
519     rm -f $DIR/$tfile-2
520     kill -USR1 $pid2
521     wait $pid2 || return 1
522
523     fail mds
524     kill -USR1 $pid1
525     wait $pid1 || return 2
526     [ -e $DIR/$tfile-1 ] && return 3
527     [ -e $DIR/$tfile-2 ] && return 4
528     return 0
529 }
530 run_test 26 "|X| open(O_CREAT), unlink two, close one, replay, close one (test mds_cleanup_orphans)"
531
532 test_27() {
533     replay_barrier mds
534     multiop $DIR/$tfile-1 O_tSc &
535     pid1=$!
536     multiop $DIR/$tfile-2 O_tSc &
537     pid2=$!
538     # give multiop a chance to open
539     sleep 1 
540     rm -f $DIR/$tfile-1
541     rm -f $DIR/$tfile-2
542
543     fail mds
544     kill -USR1 $pid1
545     wait $pid1 || return 1
546     kill -USR1 $pid2
547     wait $pid2 || return 2
548     [ -e $DIR/$tfile-1 ] && return 3
549     [ -e $DIR/$tfile-2 ] && return 4
550     return 0
551 }
552 run_test 27 "|X| open(O_CREAT), unlink two, replay, close two (test mds_cleanup_orphans)"
553
554 test_28() {
555     multiop $DIR/$tfile-1 O_tSc &
556     pid1=$!
557     multiop $DIR/$tfile-2 O_tSc &
558     pid2=$!
559     # give multiop a chance to open
560     sleep 1 
561     replay_barrier mds
562     rm -f $DIR/$tfile-1
563     rm -f $DIR/$tfile-2
564     kill -USR1 $pid2
565     wait $pid2 || return 1
566
567     fail mds
568     kill -USR1 $pid1
569     wait $pid1 || return 2
570     [ -e $DIR/$tfile-1 ] && return 3
571     [ -e $DIR/$tfile-2 ] && return 4
572     return 0
573 }
574 run_test 28 "open(O_CREAT), |X| unlink two, close one, replay, close one (test mds_cleanup_orphans)"
575
576 test_29() {
577     multiop $DIR/$tfile-1 O_tSc &
578     pid1=$!
579     multiop $DIR/$tfile-2 O_tSc &
580     pid2=$!
581     # give multiop a chance to open
582     sleep 1 
583     replay_barrier mds
584     rm -f $DIR/$tfile-1
585     rm -f $DIR/$tfile-2
586
587     fail mds
588     kill -USR1 $pid1
589     wait $pid1 || return 1
590     kill -USR1 $pid2
591     wait $pid2 || return 2
592     [ -e $DIR/$tfile-1 ] && return 3
593     [ -e $DIR/$tfile-2 ] && return 4
594     return 0
595 }
596 run_test 29 "open(O_CREAT), |X| unlink two, replay, close two (test mds_cleanup_orphans)"
597
598 test_30() {
599     multiop $DIR/$tfile-1 O_tSc &
600     pid1=$!
601     multiop $DIR/$tfile-2 O_tSc &
602     pid2=$!
603     # give multiop a chance to open
604     sleep 1 
605     rm -f $DIR/$tfile-1
606     rm -f $DIR/$tfile-2
607
608     replay_barrier mds
609     fail mds
610     kill -USR1 $pid1
611     wait $pid1 || return 1
612     kill -USR1 $pid2
613     wait $pid2 || return 2
614     [ -e $DIR/$tfile-1 ] && return 3
615     [ -e $DIR/$tfile-2 ] && return 4
616     return 0
617 }
618 run_test 30 "open(O_CREAT) two, unlink two, replay, close two (test mds_cleanup_orphans)"
619
620 test_31() {
621     multiop $DIR/$tfile-1 O_tSc &
622     pid1=$!
623     multiop $DIR/$tfile-2 O_tSc &
624     pid2=$!
625     # give multiop a chance to open
626     sleep 1 
627     rm -f $DIR/$tfile-1
628
629     replay_barrier mds
630     rm -f $DIR/$tfile-2
631     fail mds
632     kill -USR1 $pid1
633     wait $pid1 || return 1
634     kill -USR1 $pid2
635     wait $pid2 || return 2
636     [ -e $DIR/$tfile-1 ] && return 3
637     [ -e $DIR/$tfile-2 ] && return 4
638     return 0
639 }
640 run_test 31 "open(O_CREAT) two, unlink one, |X| unlink one, close two (test mds_cleanup_orphans)"
641
642 # tests for bug 2104; completion without crashing is success.  The close is
643 # stale, but we always return 0 for close, so the app never sees it.
644 test_32() {
645     multiop $DIR/$tfile O_c &
646     pid1=$!
647     multiop $DIR/$tfile O_c &
648     pid2=$!
649     # give multiop a chance to open
650     sleep 1
651     mds_evict_client
652     df $MOUNT || df $MOUNT || return 1
653     kill -USR1 $pid1
654     kill -USR1 $pid2
655     sleep 1
656     return 0
657 }
658 run_test 32 "close() notices client eviction; close() after client eviction"
659
660 # Abort recovery before client complete
661 test_33() {
662     replay_barrier mds
663     touch $DIR/$tfile
664     fail_abort mds
665     # this file should be gone, because the replay was aborted
666     $CHECKSTAT -t file $DIR/$tfile && return 1
667     return 0
668 }
669 run_test 33 "abort recovery before client does replay"
670
671 test_34() {
672     multiop $DIR/$tfile O_c &
673     pid=$!
674     # give multiop a chance to open
675     sleep 1 
676     rm -f $DIR/$tfile
677
678     replay_barrier mds
679     fail_abort mds
680     kill -USR1 $pid
681     [ -e $DIR/$tfile ] && return 1
682     sync
683     return 0
684 }
685 run_test 34 "abort recovery before client does replay (test mds_cleanup_orphans)"
686
687 # bug 2278 - generate one orphan on OST, then destroy it during recovery from llog 
688 test_35() {
689     touch $DIR/$tfile
690
691 #define OBD_FAIL_MDS_REINT_NET_REP       0x119
692     do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
693     rm -f $DIR/$tfile &
694     sleep 1
695     sync
696     sleep 1
697     # give a chance to remove from MDS
698     fail_abort mds
699     $CHECKSTAT -t file $DIR/$tfile && return 1 || true
700 }
701 run_test 35 "test recovery from llog for unlink op"
702
703 # b=2432 resent cancel after replay uses wrong cookie,
704 # so don't resend cancels
705 test_36() {
706     replay_barrier mds
707     touch $DIR/$tfile
708     checkstat $DIR/$tfile
709     facet_failover mds
710     cancel_lru_locks MDC
711     if dmesg | grep "unknown lock cookie"; then 
712         echo "cancel after replay failed"
713         return 1
714     fi
715 }
716 run_test 36 "don't resend cancel"
717
718 # b=2368
719 # directory orphans can't be unlinked from PENDING directory
720 test_37() {
721     rmdir $DIR/$tfile 2>/dev/null
722     multiop $DIR/$tfile dD_c &
723     pid=$!
724     # give multiop a chance to open
725     sleep 1 
726     rmdir $DIR/$tfile
727
728     replay_barrier mds
729     # clear the dmesg buffer so we only see errors from this recovery
730     dmesg -c >/dev/null
731     fail_abort mds
732     kill -USR1 $pid
733     dmesg | grep  "mds_unlink_orphan.*error .* unlinking orphan" && return 1
734     sync
735     return 0
736 }
737 run_test 37 "abort recovery before client does replay (test mds_cleanup_orphans for directories)"
738
739 test_38() {
740     createmany -o $DIR/$tfile-%d 800
741     unlinkmany $DIR/$tfile-%d 0 400
742     replay_barrier mds
743     fail mds
744     unlinkmany $DIR/$tfile-%d 400 400
745     sleep 2
746     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
747 }
748 run_test 38 "test recovery from unlink llog (test llog_gen_rec) "
749
750 test_39() {
751     createmany -o $DIR/$tfile-%d 800
752     replay_barrier mds
753     unlinkmany $DIR/$tfile-%d 0 400
754     fail mds
755     unlinkmany $DIR/$tfile-%d 400 400
756     sleep 2
757     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
758 }
759 run_test 39 "test recovery from unlink llog (test llog_gen_rec) "
760
761 count_ost_writes() {
762         cat /proc/fs/lustre/osc/*/stats |
763             awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }'
764 }
765
766 #b=2477,2532
767 test_40(){
768     $LCTL mark multiop $MOUNT/$tfile OS_c 
769     multiop $MOUNT/$tfile OS_c  &
770     PID=$!
771     writeme -s $MOUNT/${tfile}-2 &
772     WRITE_PID=$!
773     sleep 1
774     facet_failover mds
775 #define OBD_FAIL_MDS_CONNECT_NET         0x117
776     do_facet mds "sysctl -w lustre.fail_loc=0x80000117"
777     kill -USR1 $PID
778     stat1=`count_ost_writes`
779     sleep $TIMEOUT
780     stat2=`count_ost_writes`
781     echo "$stat1, $stat2"
782     if [ $stat1 -lt $stat2 ]; then 
783        echo "writes continuing during recovery"
784        RC=0
785     else
786        echo "writes not continuing during recovery, bug 2477"
787        RC=4
788     fi
789     echo "waiting for writeme $WRITE_PID"
790     kill $WRITE_PID
791     wait $WRITE_PID 
792
793     echo "waiting for multiop $PID"
794     wait $PID || return 2
795     do_facet client munlink $MOUNT/$tfile  || return 3
796     do_facet client munlink $MOUNT/${tfile}-2  || return 3
797     return $RC
798 }
799 run_test 40 "cause recovery in ptlrpc, ensure IO continues"
800
801
802 #b=2814
803 # make sure that a read to one osc doesn't try to double-unlock its page just
804 # because another osc is invalid.  trigger_group_io used to mistakenly return
805 # an error if any oscs were invalid even after having successfully put rpcs
806 # on valid oscs.  This was fatal if the caller was ll_readpage who unlocked
807 # the page, guarnateeing that the unlock from the RPC completion would
808 # assert on trying to unlock the unlocked page.
809 test_41() {
810     local f=$MOUNT/$tfile
811     # make sure the start of the file is ost1
812     lfs setstripe $f $((128 * 1024)) 0 0 
813     do_facet client dd if=/dev/zero of=$f bs=4k count=1 || return 3
814     cancel_lru_locks OSC
815     # fail ost2 and read from ost1
816     local osc2_dev=`$LCTL device_list | \
817                 awk '(/ost2.*client_facet/){print $4}' `
818     $LCTL --device %$osc2_dev deactivate
819     do_facet client dd if=$f of=/dev/null bs=4k count=1 || return 3
820     $LCTL --device %$osc2_dev activate
821     return 0
822 }
823 run_test 41 "read from a valid osc while other oscs are invalid"
824
825 # test MDS recovery after ost failure
826 test_42() {
827     blocks=`df $MOUNT | tail -1 | awk '{ print $1 }'`
828     createmany -o $DIR/$tfile-%d 800
829     replay_barrier ost
830     unlinkmany $DIR/$tfile-%d 0 400
831     facet_failover ost
832     
833     # osc is evicted, fs is smaller
834     blocks_after=`df $MOUNT | tail -1 | awk '{ print $1 }'`
835     [ $blocks_after -lt $blocks ] || return 1
836     echo wait for MDS to timeout and recover
837     sleep $((TIMEOUT * 2))
838     unlinkmany $DIR/$tfile-%d 400 400
839     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
840 }
841 run_test 42 "recovery after ost failure"
842
843 # b=2530
844 # directory orphans can't be unlinked from PENDING directory
845 test_43() {
846     replay_barrier mds
847
848     # OBD_FAIL_OST_CREATE_NET 0x204
849     do_facet ost "sysctl -w lustre.fail_loc=0x80000204"
850     facet_failover mds
851     df $MOUNT || return 1
852     sleep 10
853     do_facet ost "sysctl -w lustre.fail_loc=0"
854
855     return 0
856 }
857 run_test 43 "mds osc import failure during recovery; don't LBUG"
858
859 test_44() {
860     mdcdev=`awk '/mds_svc_MNT/ {print $1}' < /proc/fs/lustre/devices`
861     do_facet mds "sysctl -w lustre.fail_loc=0x80000701"
862     $LCTL --device $mdcdev recover
863     df $MOUNT
864     do_facet mds "sysctl -w lustre.fail_loc=0"
865     return 0
866 }
867 run_test 44 "race in target handle connect"
868
869 # Handle failed close
870 test_45() {
871     mdcdev=`awk '/mds_svc_MNT/ {print $1}' < /proc/fs/lustre/devices`
872     $LCTL --device $mdcdev recover
873
874     multiop $DIR/$tfile O_c &
875     pid=$!
876
877     # This will cause the CLOSE to fail before even 
878     # allocating a reply buffer
879     $LCTL --device $mdcdev deactivate
880
881     # try the close
882     kill -USR1 $pid
883     wait $pid || return 1
884
885     $LCTL --device $mdcdev activate
886
887     $CHECKSTAT -t file $DIR/$tfile || return 2
888     return 0
889 }
890 run_test 45 "Handle failed close"
891
892 equals_msg test complete, cleaning up
893 $CLEANUP
894