Whamcloud - gitweb
a6fb3a2901b298bca6f704bf3f73114def85a863
[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     kill -USR1 $pid
382     wait $pid || return 2
383
384     fail mds
385     [ -e $DIR/$tfile ] && return 3
386     [ -e $DIR/$tfile-2 ] || return 4
387     # this touch frequently fails
388     touch $DIR/$tfile-3 || return 5
389     munlink $DIR/$tfile-2 || return 6
390     munlink $DIR/$tfile-3 || return 7
391     return 0
392 }
393 run_test 18 "|X| open(O_CREAT), unlink, touch new, close, touch, unlink"
394
395 # bug 1855 (a simpler form of test_11 above)
396 test_19() {
397     replay_barrier mds
398     mcreate $DIR/$tfile
399     echo "old" > $DIR/$tfile
400     mv $DIR/$tfile $DIR/$tfile-2
401     grep old $DIR/$tfile-2
402     fail mds
403     grep old $DIR/$tfile-2 || return 2
404 }
405 run_test 19 "|X| mcreate, open, write, rename "
406
407 test_20() {
408     replay_barrier mds
409     multiop $DIR/$tfile O_tSc &
410     pid=$!
411     # give multiop a chance to open
412     sleep 1 
413     rm -f $DIR/$tfile
414
415     fail mds
416     kill -USR1 $pid
417     wait $pid || return 1
418     [ -e $DIR/$tfile ] && return 2
419     return 0
420 }
421 run_test 20 "|X| open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
422
423 test_21() {
424     replay_barrier mds
425     multiop $DIR/$tfile O_tSc &
426     pid=$!
427     # give multiop a chance to open
428     sleep 1 
429     rm -f $DIR/$tfile
430     touch $DIR/g11 || return 1
431
432     fail mds
433     kill -USR1 $pid
434     wait $pid || return 2
435     [ -e $DIR/$tfile ] && return 3
436     touch $DIR/h11 || return 4
437     return 0
438 }
439 run_test 21 "|X| open(O_CREAT), unlink touch new, replay, close (test mds_cleanup_orphans)"
440
441 test_22() {
442     multiop $DIR/$tfile O_tSc &
443     pid=$!
444     # give multiop a chance to open
445     sleep 1 
446
447     replay_barrier mds
448     rm -f $DIR/$tfile
449
450     fail mds
451     kill -USR1 $pid
452     wait $pid || return 1
453     [ -e $DIR/$tfile ] && return 2
454     return 0
455 }
456 run_test 22 "open(O_CREAT), |X| unlink, replay, close (test mds_cleanup_orphans)"
457
458 test_23() {
459     multiop $DIR/$tfile O_tSc &
460     pid=$!
461     # give multiop a chance to open
462     sleep 1 
463
464     replay_barrier mds
465     rm -f $DIR/$tfile
466     touch $DIR/g11 || return 1
467
468     fail mds
469     kill -USR1 $pid
470     wait $pid || return 2
471     [ -e $DIR/$tfile ] && return 3
472     touch $DIR/h11 || return 4
473     return 0
474 }
475 run_test 23 "open(O_CREAT), |X| unlink touch new, replay, close (test mds_cleanup_orphans)"
476
477 test_24() {
478     multiop $DIR/$tfile O_tSc &
479     pid=$!
480     # give multiop a chance to open
481     sleep 1 
482
483     replay_barrier mds
484     fail mds
485     rm -f $DIR/$tfile
486     kill -USR1 $pid
487     wait $pid || return 1
488     [ -e $DIR/$tfile ] && return 2
489     return 0
490 }
491 run_test 24 "open(O_CREAT), replay, unlink, close (test mds_cleanup_orphans)"
492
493 test_25() {
494     multiop $DIR/$tfile O_tSc &
495     pid=$!
496     # give multiop a chance to open
497     sleep 1 
498     rm -f $DIR/$tfile
499
500     replay_barrier mds
501     fail mds
502     kill -USR1 $pid
503     wait $pid || return 1
504     [ -e $DIR/$tfile ] && return 2
505     return 0
506 }
507 run_test 25 "open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
508
509 test_26() {
510     replay_barrier mds
511     multiop $DIR/$tfile-1 O_tSc &
512     pid1=$!
513     multiop $DIR/$tfile-2 O_tSc &
514     pid2=$!
515     # give multiop a chance to open
516     sleep 1 
517     rm -f $DIR/$tfile-1
518     rm -f $DIR/$tfile-2
519     kill -USR1 $pid2
520     wait $pid2 || return 1
521
522     fail mds
523     kill -USR1 $pid1
524     wait $pid1 || return 2
525     [ -e $DIR/$tfile-1 ] && return 3
526     [ -e $DIR/$tfile-2 ] && return 4
527     return 0
528 }
529 run_test 26 "|X| open(O_CREAT), unlink two, close one, replay, close one (test mds_cleanup_orphans)"
530
531 test_27() {
532     replay_barrier mds
533     multiop $DIR/$tfile-1 O_tSc &
534     pid1=$!
535     multiop $DIR/$tfile-2 O_tSc &
536     pid2=$!
537     # give multiop a chance to open
538     sleep 1 
539     rm -f $DIR/$tfile-1
540     rm -f $DIR/$tfile-2
541
542     fail mds
543     kill -USR1 $pid1
544     wait $pid1 || return 1
545     kill -USR1 $pid2
546     wait $pid2 || return 2
547     [ -e $DIR/$tfile-1 ] && return 3
548     [ -e $DIR/$tfile-2 ] && return 4
549     return 0
550 }
551 run_test 27 "|X| open(O_CREAT), unlink two, replay, close two (test mds_cleanup_orphans)"
552
553 test_28() {
554     multiop $DIR/$tfile-1 O_tSc &
555     pid1=$!
556     multiop $DIR/$tfile-2 O_tSc &
557     pid2=$!
558     # give multiop a chance to open
559     sleep 1 
560     replay_barrier mds
561     rm -f $DIR/$tfile-1
562     rm -f $DIR/$tfile-2
563     kill -USR1 $pid2
564     wait $pid2 || return 1
565
566     fail mds
567     kill -USR1 $pid1
568     wait $pid1 || return 2
569     [ -e $DIR/$tfile-1 ] && return 3
570     [ -e $DIR/$tfile-2 ] && return 4
571     return 0
572 }
573 run_test 28 "open(O_CREAT), |X| unlink two, close one, replay, close one (test mds_cleanup_orphans)"
574
575 test_29() {
576     multiop $DIR/$tfile-1 O_tSc &
577     pid1=$!
578     multiop $DIR/$tfile-2 O_tSc &
579     pid2=$!
580     # give multiop a chance to open
581     sleep 1 
582     replay_barrier mds
583     rm -f $DIR/$tfile-1
584     rm -f $DIR/$tfile-2
585
586     fail mds
587     kill -USR1 $pid1
588     wait $pid1 || return 1
589     kill -USR1 $pid2
590     wait $pid2 || return 2
591     [ -e $DIR/$tfile-1 ] && return 3
592     [ -e $DIR/$tfile-2 ] && return 4
593     return 0
594 }
595 run_test 29 "open(O_CREAT), |X| unlink two, replay, close two (test mds_cleanup_orphans)"
596
597 test_30() {
598     multiop $DIR/$tfile-1 O_tSc &
599     pid1=$!
600     multiop $DIR/$tfile-2 O_tSc &
601     pid2=$!
602     # give multiop a chance to open
603     sleep 1 
604     rm -f $DIR/$tfile-1
605     rm -f $DIR/$tfile-2
606
607     replay_barrier mds
608     fail mds
609     kill -USR1 $pid1
610     wait $pid1 || return 1
611     kill -USR1 $pid2
612     wait $pid2 || return 2
613     [ -e $DIR/$tfile-1 ] && return 3
614     [ -e $DIR/$tfile-2 ] && return 4
615     return 0
616 }
617 run_test 30 "open(O_CREAT) two, unlink two, replay, close two (test mds_cleanup_orphans)"
618
619 test_31() {
620     multiop $DIR/$tfile-1 O_tSc &
621     pid1=$!
622     multiop $DIR/$tfile-2 O_tSc &
623     pid2=$!
624     # give multiop a chance to open
625     sleep 1 
626     rm -f $DIR/$tfile-1
627
628     replay_barrier mds
629     rm -f $DIR/$tfile-2
630     fail mds
631     kill -USR1 $pid1
632     wait $pid1 || return 1
633     kill -USR1 $pid2
634     wait $pid2 || return 2
635     [ -e $DIR/$tfile-1 ] && return 3
636     [ -e $DIR/$tfile-2 ] && return 4
637     return 0
638 }
639 run_test 31 "open(O_CREAT) two, unlink one, |X| unlink one, close two (test mds_cleanup_orphans)"
640
641 # tests for bug 2104; completion without crashing is success.  The close is
642 # stale, but we always return 0 for close, so the app never sees it.
643 test_32() {
644     multiop $DIR/$tfile O_c &
645     pid1=$!
646     multiop $DIR/$tfile O_c &
647     pid2=$!
648     # give multiop a chance to open
649     sleep 1
650     mds_evict_client
651     df $MOUNT || df $MOUNT || return 1
652     kill -USR1 $pid1
653     kill -USR1 $pid2
654     sleep 1
655     return 0
656 }
657 run_test 32 "close() notices client eviction; close() after client eviction"
658
659 # Abort recovery before client complete
660 test_33() {
661     replay_barrier mds
662     touch $DIR/$tfile
663     fail_abort mds
664     # this file should be gone, because the replay was aborted
665     $CHECKSTAT -t file $DIR/$tfile && return 1
666     return 0
667 }
668 run_test 33 "abort recovery before client does replay"
669
670 test_34() {
671     multiop $DIR/$tfile O_c &
672     pid=$!
673     # give multiop a chance to open
674     sleep 1 
675     rm -f $DIR/$tfile
676
677     replay_barrier mds
678     fail_abort mds
679     kill -USR1 $pid
680     [ -e $DIR/$tfile ] && return 1
681     sync
682     return 0
683 }
684 run_test 34 "abort recovery before client does replay (test mds_cleanup_orphans)"
685
686 # bug 2278 - generate one orphan on OST, then destroy it during recovery from llog 
687 test_35() {
688     touch $DIR/$tfile
689
690 #define OBD_FAIL_MDS_REINT_NET_REP       0x119
691     do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
692     rm -f $DIR/$tfile &
693     sleep 1
694     sync
695     sleep 1
696     # give a chance to remove from MDS
697     fail_abort mds
698     $CHECKSTAT -t file $DIR/$tfile && return 1 || true
699 }
700 run_test 35 "test recovery from llog for unlink op"
701
702 # b=2432 resent cancel after replay uses wrong cookie,
703 # so don't resend cancels
704 test_36() {
705     replay_barrier mds
706     touch $DIR/$tfile
707     checkstat $DIR/$tfile
708     facet_failover mds
709     cancel_lru_locks MDC
710     if dmesg | grep "unknown lock cookie"; then 
711         echo "cancel after replay failed"
712         return 1
713     fi
714 }
715 run_test 36 "don't resend cancel"
716
717 # b=2368
718 # directory orphans can't be unlinked from PENDING directory
719 test_37() {
720     rmdir $DIR/$tfile 2>/dev/null
721     multiop $DIR/$tfile dD_c &
722     pid=$!
723     # give multiop a chance to open
724     sleep 1 
725     rmdir $DIR/$tfile
726
727     replay_barrier mds
728     # clear the dmesg buffer so we only see errors from this recovery
729     dmesg -c >/dev/null
730     fail_abort mds
731     kill -USR1 $pid
732     dmesg | grep  "mds_unlink_orphan.*error .* unlinking orphan" && return 1
733     sync
734     return 0
735 }
736 run_test 37 "abort recovery before client does replay (test mds_cleanup_orphans for directories)"
737
738 test_38() {
739     createmany -o $DIR/$tfile-%d 800
740     unlinkmany $DIR/$tfile-%d 0 400
741     replay_barrier mds
742     fail mds
743     unlinkmany $DIR/$tfile-%d 400 400
744     sleep 2
745     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
746 }
747 run_test 38 "test recovery from unlink llog (test llog_gen_rec) "
748
749 test_39() {
750     createmany -o $DIR/$tfile-%d 800
751     replay_barrier mds
752     unlinkmany $DIR/$tfile-%d 0 400
753     fail mds
754     unlinkmany $DIR/$tfile-%d 400 400
755     sleep 2
756     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
757 }
758 run_test 39 "test recovery from unlink llog (test llog_gen_rec) "
759
760 count_ost_writes() {
761         cat /proc/fs/lustre/osc/*/stats |
762             awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }'
763 }
764
765 #b=2477,2532
766 test_40(){
767     $LCTL mark multiop $MOUNT/$tfile OS_c 
768     multiop $MOUNT/$tfile OS_c  &
769     PID=$!
770     writeme -s $MOUNT/${tfile}-2 &
771     WRITE_PID=$!
772     sleep 1
773     facet_failover mds
774 #define OBD_FAIL_MDS_CONNECT_NET         0x117
775     do_facet mds "sysctl -w lustre.fail_loc=0x80000117"
776     kill -USR1 $PID
777     stat1=`count_ost_writes`
778     sleep $TIMEOUT
779     stat2=`count_ost_writes`
780     echo "$stat1, $stat2"
781     if [ $stat1 -lt $stat2 ]; then 
782        echo "writes continuing during recovery"
783        RC=0
784     else
785        echo "writes not continuing during recovery, bug 2477"
786        RC=4
787     fi
788     echo "waiting for writeme $WRITE_PID"
789     kill $WRITE_PID
790     wait $WRITE_PID 
791
792     echo "waiting for multiop $PID"
793     wait $PID || return 2
794     do_facet client munlink $MOUNT/$tfile  || return 3
795     do_facet client munlink $MOUNT/${tfile}-2  || return 3
796     return $RC
797 }
798 run_test 40 "cause recovery in ptlrpc, ensure IO continues"
799
800
801 #b=2814
802 # make sure that a read to one osc doesn't try to double-unlock its page just
803 # because another osc is invalid.  trigger_group_io used to mistakenly return
804 # an error if any oscs were invalid even after having successfully put rpcs
805 # on valid oscs.  This was fatal if the caller was ll_readpage who unlocked
806 # the page, guarnateeing that the unlock from the RPC completion would
807 # assert on trying to unlock the unlocked page.
808 test_41() {
809     local f=$MOUNT/$tfile
810     # make sure the start of the file is ost1
811     lfs setstripe $f $((128 * 1024)) 0 0 
812     do_facet client dd if=/dev/zero of=$f bs=4k count=1 || return 3
813     cancel_lru_locks OSC
814     # fail ost2 and read from ost1
815     local osc2_dev=`$LCTL device_list | \
816                 awk '(/ost2.*client_facet/){print $4}' `
817     $LCTL --device %$osc2_dev deactivate
818     do_facet client dd if=$f of=/dev/null bs=4k count=1 || return 3
819     $LCTL --device %$osc2_dev activate
820     return 0
821 }
822 run_test 41 "read from a valid osc while other oscs are invalid"
823
824 # test MDS recovery after ost failure
825 test_42() {
826     blocks=`df $MOUNT | tail -1 | awk '{ print $1 }'`
827     createmany -o $DIR/$tfile-%d 800
828     replay_barrier ost
829     unlinkmany $DIR/$tfile-%d 0 400
830     facet_failover ost
831     
832     # osc is evicted, fs is smaller
833     blocks_after=`df $MOUNT | tail -1 | awk '{ print $1 }'`
834     [ $blocks_after -lt $blocks ] || return 1
835     echo wait for MDS to timeout and recover
836     sleep $((TIMEOUT * 2))
837     unlinkmany $DIR/$tfile-%d 400 400
838     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
839 }
840 run_test 42 "recovery after ost failure"
841
842 # b=2530
843 # directory orphans can't be unlinked from PENDING directory
844 test_43() {
845     replay_barrier mds
846
847     # OBD_FAIL_OST_CREATE_NET 0x204
848     do_facet ost "sysctl -w lustre.fail_loc=0x80000204"
849     facet_failover mds
850     df $MOUNT || return 1
851     sleep 10
852     do_facet ost "sysctl -w lustre.fail_loc=0"
853
854     return 0
855 }
856 run_test 43 "mds osc import failure during recovery; don't LBUG"
857
858 test_44() {
859     mdcdev=`awk '/mds_svc_MNT/ {print $1}' < /proc/fs/lustre/devices`
860     do_facet mds "sysctl -w lustre.fail_loc=0x80000701"
861     $LCTL --device $mdcdev recover
862     df $MOUNT
863     do_facet mds "sysctl -w lustre.fail_loc=0"
864     return 0
865 }
866 run_test 44 "race in target handle connect"
867
868 equals_msg test complete, cleaning up
869 $CLEANUP
870