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