Whamcloud - gitweb
land b_inodebits
[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     echo 0x3f0410 > /proc/sys/portals/debug
67 }
68
69 $SETUP
70
71 if [ "$ONLY" == "setup" ]; then
72     exit 0
73 fi
74
75 mkdir -p $DIR
76
77 test_0() {
78     replay_barrier mds
79     fail mds
80 }
81 run_test 0 "empty replay"
82
83 test_1() {
84     replay_barrier mds
85     mcreate $DIR/$tfile
86     fail mds
87     $CHECKSTAT -t file $DIR/$tfile || return 1
88     rm $DIR/$tfile
89 }
90 run_test 1 "simple create"
91
92 test_2a() {
93     replay_barrier mds
94     touch $DIR/$tfile
95     fail mds
96     $CHECKSTAT -t file $DIR/$tfile || return 1
97     rm $DIR/$tfile
98 }
99 run_test 2a "touch"
100
101 test_2b() {
102     ./mcreate $DIR/$tfile
103     replay_barrier mds
104     touch $DIR/$tfile
105     fail mds
106     $CHECKSTAT -t file $DIR/$tfile || return 1
107     rm $DIR/$tfile
108 }
109 run_test 2b "touch"
110
111 test_3a() {
112     replay_barrier mds
113     mcreate $DIR/$tfile
114     o_directory $DIR/$tfile
115     fail mds
116     $CHECKSTAT -t file $DIR/$tfile || return 2
117     rm $DIR/$tfile
118 }
119 run_test 3a "replay failed open(O_DIRECTORY)"
120
121 test_3b() {
122     replay_barrier mds
123 #define OBD_FAIL_MDS_OPEN_PACK | OBD_FAIL_ONCE
124     do_facet mds "sysctl -w lustre.fail_loc=0x80000114"
125     touch $DIR/$tfile
126     do_facet mds "sysctl -w lustre.fail_loc=0"
127     fail mds
128     $CHECKSTAT -t file $DIR/$tfile && return 2
129     return 0
130 }
131 run_test 3b "replay failed open -ENOMEM"
132
133 test_3c() {
134     replay_barrier mds
135 #define OBD_FAIL_MDS_ALLOC_OBDO | OBD_FAIL_ONCE
136     do_facet mds "sysctl -w lustre.fail_loc=0x80000128"
137     touch $DIR/$tfile
138     do_facet mds "sysctl -w lustre.fail_loc=0"
139     fail mds
140
141     $CHECKSTAT -t file $DIR/$tfile && return 2
142     return 0
143 }
144 run_test 3c "replay failed open -ENOMEM"
145
146 test_4() {
147     replay_barrier mds
148     for i in `seq 10`; do
149         echo "tag-$i" > $DIR/$tfile-$i
150     done 
151     fail mds
152     for i in `seq 10`; do
153       grep -q "tag-$i" $DIR/$tfile-$i || error "$tfile-$i"
154     done 
155 }
156 run_test 4 "|x| 10 open(O_CREAT)s"
157
158 test_4b() {
159     replay_barrier mds
160     rm -rf $DIR/$tfile-*
161     fail mds
162     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
163 }
164 run_test 4b "|x| rm 10 files"
165
166 # The idea is to get past the first block of precreated files on both 
167 # osts, and then replay.
168 test_5() {
169     replay_barrier mds
170     for i in `seq 220`; do
171         echo "tag-$i" > $DIR/$tfile-$i
172     done 
173     fail mds
174     for i in `seq 220`; do
175       grep -q "tag-$i" $DIR/$tfile-$i || error "f1c-$i"
176     done 
177     rm -rf $DIR/$tfile-*
178     sleep 3
179     # waiting for commitment of removal
180 }
181 run_test 5 "|x| 220 open(O_CREAT)"
182
183
184 test_6() {
185     replay_barrier mds
186     mkdir $DIR/$tdir
187     mcreate $DIR/$tdir/$tfile
188     fail mds
189     $CHECKSTAT -t dir $DIR/$tdir || return 1
190     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
191     sleep 2
192     # waiting for log process thread
193 }
194 run_test 6 "mkdir + contained create"
195
196 test_6b() {
197     replay_barrier mds
198     rm -rf $DIR/$tdir
199     fail mds
200     $CHECKSTAT -t dir $DIR/$tdir && return 1 || true 
201 }
202 run_test 6b "|X| rmdir"
203
204 test_7() {
205     mkdir $DIR/$tdir
206     replay_barrier mds
207     mcreate $DIR/$tdir/$tfile
208     fail mds
209     $CHECKSTAT -t dir $DIR/$tdir || return 1
210     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
211     rm -fr $DIR/$tdir
212 }
213 run_test 7 "mkdir |X| contained create"
214
215 test_8() {
216     replay_barrier mds
217     multiop $DIR/$tfile mo_c &
218     MULTIPID=$!
219     sleep 1
220     fail mds
221     ls $DIR/$tfile
222     $CHECKSTAT -t file $DIR/$tfile || return 1
223     kill -USR1 $MULTIPID || return 2
224     wait $MULTIPID || return 3
225     rm $DIR/$tfile
226 }
227 run_test 8 "creat open |X| close"
228
229 test_9() {
230     replay_barrier mds
231     mcreate $DIR/$tfile
232     local old_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
233     fail mds
234     local new_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
235
236     echo " old_inum == $old_inum, new_inum == $new_inum"
237     if [ $old_inum -eq $new_inum  ] ;
238     then
239         echo " old_inum and new_inum match"
240     else
241         echo "!!!! old_inum and new_inum NOT match"
242         return 1
243     fi
244     rm $DIR/$tfile
245 }
246 run_test 9  "|X| create (same inum/gen)"
247
248 test_10() {
249     mcreate $DIR/$tfile
250     replay_barrier mds
251     mv $DIR/$tfile $DIR/$tfile-2
252     rm -f $DIR/$tfile
253     fail mds
254     $CHECKSTAT $DIR/$tfile && return 1
255     $CHECKSTAT $DIR/$tfile-2 ||return 2
256     rm $DIR/$tfile-2
257     return 0
258 }
259 run_test 10 "create |X| rename unlink"
260
261 test_11() {
262     mcreate $DIR/$tfile
263     echo "old" > $DIR/$tfile
264     mv $DIR/$tfile $DIR/$tfile-2
265     replay_barrier mds
266     echo "new" > $DIR/$tfile
267     grep new $DIR/$tfile 
268     grep old $DIR/$tfile-2
269     fail mds
270     grep new $DIR/$tfile || return 1
271     grep old $DIR/$tfile-2 || return 2
272 }
273 run_test 11 "create open write rename |X| create-old-name read"
274
275 test_12() {
276     mcreate $DIR/$tfile 
277     multiop $DIR/$tfile o_tSc &
278     pid=$!
279     # give multiop a chance to open
280     sleep 1
281     rm -f $DIR/$tfile
282     replay_barrier mds
283     kill -USR1 $pid
284     wait $pid || return 1
285
286     fail mds
287     [ -e $DIR/$tfile ] && return 2
288     return 0
289 }
290 run_test 12 "open, unlink |X| close"
291
292
293 # 1777 - replay open after committed chmod that would make
294 #        a regular open a failure    
295 test_13() {
296     mcreate $DIR/$tfile 
297     multiop $DIR/$tfile O_wc &
298     pid=$!
299     # give multiop a chance to open
300     sleep 1 
301     chmod 0 $DIR/$tfile
302     $CHECKSTAT -p 0 $DIR/$tfile
303     replay_barrier mds
304     fail mds
305     kill -USR1 $pid
306     wait $pid || return 1
307
308     $CHECKSTAT -s 1 -p 0 $DIR/$tfile || return 2
309     return 0
310 }
311 run_test 13 "open chmod 0 |x| write close"
312
313 test_14() {
314     multiop $DIR/$tfile O_tSc &
315     pid=$!
316     # give multiop a chance to open
317     sleep 1 
318     rm -f $DIR/$tfile
319     replay_barrier mds
320     kill -USR1 $pid || return 1
321     wait $pid || return 2
322
323     fail mds
324     [ -e $DIR/$tfile ] && return 3
325     return 0
326 }
327 run_test 14 "open(O_CREAT), unlink |X| close"
328
329 test_15() {
330     multiop $DIR/$tfile O_tSc &
331     pid=$!
332     # give multiop a chance to open
333     sleep 1 
334     rm -f $DIR/$tfile
335     replay_barrier mds
336     touch $DIR/g11 || return 1
337     kill -USR1 $pid
338     wait $pid || return 2
339
340     fail mds
341     [ -e $DIR/$tfile ] && return 3
342     touch $DIR/h11 || return 4
343     return 0
344 }
345 run_test 15 "open(O_CREAT), unlink |X|  touch new, close"
346
347
348 test_16() {
349     replay_barrier mds
350     mcreate $DIR/$tfile
351     munlink $DIR/$tfile
352     mcreate $DIR/$tfile-2
353     fail mds
354     [ -e $DIR/$tfile ] && return 1
355     [ -e $DIR/$tfile-2 ] || return 2
356     munlink $DIR/$tfile-2 || return 3
357 }
358 run_test 16 "|X| open(O_CREAT), unlink, touch new,  unlink new"
359
360 test_17() {
361     replay_barrier mds
362     multiop $DIR/$tfile O_c &
363     pid=$!
364     # give multiop a chance to open
365     sleep 1 
366     fail mds
367     kill -USR1 $pid || return 1
368     wait $pid || return 2
369     $CHECKSTAT -t file $DIR/$tfile || return 3
370     rm $DIR/$tfile
371 }
372 run_test 17 "|X| open(O_CREAT), |replay| close"
373
374 test_18() {
375     replay_barrier mds
376     multiop $DIR/$tfile O_tSc &
377     pid=$!
378     # give multiop a chance to open
379     sleep 1 
380     rm -f $DIR/$tfile
381     touch $DIR/$tfile-2 || return 1
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 equals_msg test complete, cleaning up
870 $CLEANUP
871