Whamcloud - gitweb
- cleanups in sanity-fid.sh
[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 build_test_filter
17
18 assert_env MDSCOUNT
19
20 # Skip these tests
21 # 46 - The MDS will always have to force close the cached opens
22 ALWAYS_EXCEPT="46"
23
24 if [ `using_krb5_sec $SECURITY` == 'n' ] ; then
25     ALWAYS_EXCEPT="0c $ALWAYS_EXCEPT"
26 fi
27
28
29 gen_config() {
30     rm -f $XMLCONFIG
31
32     if [ "$MDSCOUNT" -gt 1 ]; then
33         add_lmv lmv1_svc
34         for mds in `mds_list`; do
35             MDSDEV=$TMP/${mds}-`hostname`
36             add_mds $mds --dev $MDSDEV --size $MDSSIZE --lmv lmv1_svc
37         done
38         add_lov_to_lmv lov1 lmv1_svc --stripe_sz $STRIPE_BYTES \
39             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
40         MDS=lmv1
41     else
42         add_mds mds1 --dev $MDSDEV --size $MDSSIZE
43         if [ ! -z "$mds1failover_HOST" ]; then
44              add_mdsfailover mds1 --dev $MDSDEV --size $MDSSIZE
45         fi
46         add_lov lov1 mds1 --stripe_sz $STRIPE_BYTES \
47             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
48         MDS=mds1_svc
49     fi
50     
51     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
52     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
53     add_client client $MDS --lov lov1 --path $MOUNT
54 }
55
56 build_test_filter
57
58 cleanup() {
59     # make sure we are using the primary MDS, so the config log will
60     # be able to clean up properly.
61     activemds=`facet_active mds1`
62     if [ $activemds != "mds1" ]; then
63         fail mds1
64     fi
65     zconf_umount `hostname` $MOUNT
66     for mds in `mds_list`; do
67         stop $mds ${FORCE} $MDSLCONFARGS
68     done
69     stop_lgssd
70     stop_lsvcgssd
71     stop ost2 ${FORCE} --dump cleanup.log
72     stop ost ${FORCE} --dump cleanup.log
73 }
74
75 if [ "$ONLY" == "cleanup" ]; then
76     sysctl -w portals.debug=0 || true
77     cleanup
78     exit
79 fi
80
81 SETUP=${SETUP:-"setup"}
82 CLEANUP=${CLEANUP:-"cleanup"}
83
84 setup() {
85     gen_config
86
87     start_krb5_kdc || exit 1
88     start ost --reformat $OSTLCONFARGS 
89     start ost2 --reformat $OSTLCONFARGS 
90     start_lsvcgssd || exit 2
91     start_lgssd || exit 3
92     [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
93     for mds in `mds_list`; do
94         start $mds --reformat $MDSLCONFARGS
95     done
96     grep " $MOUNT " /proc/mounts || zconf_mount `hostname` $MOUNT
97 }
98
99 $SETUP
100
101 if [ "$ONLY" == "setup" ]; then
102     exit 0
103 fi
104
105 mkdir -p $DIR
106
107 test_0() {
108     replay_barrier mds1
109     fail mds1
110 }
111 run_test 0 "empty replay"
112
113 test_0b() {
114     # this test attempts to trigger a race in the precreation code, 
115     # and must run before any other objects are created on the filesystem
116     fail ost
117     createmany -o $DIR/$tfile 20 || return 1
118     unlinkmany $DIR/$tfile 20 || return 2
119 }
120 run_test 0b "ensure object created after recover exists. (3284)"
121
122 test_0c() {
123     # drop gss error notification
124     replay_barrier mds1
125     fail_drop mds1 0x760
126
127     # drop gss init request
128     replay_barrier mds1
129     fail_drop mds1 0x780
130 }
131 run_test 0c "empty replay with gss init failures"
132
133 test_1() {
134     replay_barrier mds1
135     mcreate $DIR/$tfile
136     fail mds1
137     $CHECKSTAT -t file $DIR/$tfile || return 1
138     rm $DIR/$tfile
139 }
140 run_test 1 "simple create"
141
142 test_2a() {
143     replay_barrier mds1
144     touch $DIR/$tfile
145     fail mds1
146     $CHECKSTAT -t file $DIR/$tfile || return 1
147     rm $DIR/$tfile
148 }
149 run_test 2a "touch"
150
151 test_2b() {
152     ./mcreate $DIR/$tfile
153     replay_barrier mds1
154     touch $DIR/$tfile
155     fail mds1
156     $CHECKSTAT -t file $DIR/$tfile || return 1
157     rm $DIR/$tfile
158 }
159 run_test 2b "touch"
160
161 test_3a() {
162     replay_barrier mds1
163     mcreate $DIR/$tfile
164     o_directory $DIR/$tfile
165     fail mds1
166     $CHECKSTAT -t file $DIR/$tfile || return 2
167     rm $DIR/$tfile
168 }
169 run_test 3a "replay failed open(O_DIRECTORY)"
170
171 test_3b() {
172     replay_barrier mds1
173 #define OBD_FAIL_MDS_OPEN_PACK | OBD_FAIL_ONCE
174     do_facet mds "sysctl -w lustre.fail_loc=0x80000114"
175     touch $DIR/$tfile
176     do_facet mds "sysctl -w lustre.fail_loc=0"
177     fail mds1
178     $CHECKSTAT -t file $DIR/$tfile && return 2
179     return 0
180 }
181 run_test 3b "replay failed open -ENOMEM"
182
183 test_3c() {
184     replay_barrier mds1
185 #define OBD_FAIL_MDS_ALLOC_OBDO | OBD_FAIL_ONCE
186     do_facet mds "sysctl -w lustre.fail_loc=0x80000128"
187     touch $DIR/$tfile
188     do_facet mds "sysctl -w lustre.fail_loc=0"
189     fail mds1
190
191     $CHECKSTAT -t file $DIR/$tfile && return 2
192     return 0
193 }
194 run_test 3c "replay failed open -ENOMEM"
195
196 test_4() {
197     replay_barrier mds1
198     for i in `seq 10`; do
199         echo "tag-$i" > $DIR/$tfile-$i
200     done 
201     fail mds1
202     for i in `seq 10`; do
203       grep -q "tag-$i" $DIR/$tfile-$i || error "$tfile-$i"
204     done 
205 }
206 run_test 4 "|x| 10 open(O_CREAT)s"
207
208 test_4b() {
209     replay_barrier mds1
210     rm -rf $DIR/$tfile-*
211     fail mds1
212     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
213 }
214 run_test 4b "|x| rm 10 files"
215
216 # The idea is to get past the first block of precreated files on both 
217 # osts, and then replay.
218 test_5() {
219     replay_barrier mds1
220     for i in `seq 220`; do
221         echo "tag-$i" > $DIR/$tfile-$i
222     done 
223     fail mds1
224     for i in `seq 220`; do
225       grep -q "tag-$i" $DIR/$tfile-$i || error "f1c-$i"
226     done 
227     rm -rf $DIR/$tfile-*
228     sleep 3
229     # waiting for commitment of removal
230 }
231 run_test 5 "|x| 220 open(O_CREAT)"
232
233
234 test_6() {
235     replay_barrier mds1
236     mkdir $DIR/$tdir
237     mcreate $DIR/$tdir/$tfile
238     fail mds1
239     $CHECKSTAT -t dir $DIR/$tdir || return 1
240     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
241     sleep 2
242     # waiting for log process thread
243 }
244 run_test 6 "mkdir + contained create"
245
246 test_6b() {
247     replay_barrier mds1
248     rm -rf $DIR/$tdir
249     fail mds1
250     $CHECKSTAT -t dir $DIR/$tdir && return 1 || true 
251 }
252 run_test 6b "|X| rmdir"
253
254 test_7() {
255     mkdir $DIR/$tdir
256     replay_barrier mds1
257     mcreate $DIR/$tdir/$tfile
258     fail mds1
259     $CHECKSTAT -t dir $DIR/$tdir || return 1
260     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
261     rm -fr $DIR/$tdir
262 }
263 run_test 7 "mkdir |X| contained create"
264
265 test_8() {
266     replay_barrier mds1
267     multiop $DIR/$tfile mo_c &
268     MULTIPID=$!
269     sleep 1
270     fail mds1
271     ls $DIR/$tfile
272     $CHECKSTAT -t file $DIR/$tfile || return 1
273     kill -USR1 $MULTIPID || return 2
274     wait $MULTIPID || return 3
275     rm $DIR/$tfile
276 }
277 run_test 8 "creat open |X| close"
278
279 test_9() {
280     replay_barrier mds1
281     mcreate $DIR/$tfile
282     local old_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
283     fail mds1
284     local new_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
285
286     echo " old_inum == $old_inum, new_inum == $new_inum"
287     if [ $old_inum -eq $new_inum  ] ;
288     then
289         echo " old_inum and new_inum match"
290     else
291         echo "!!!! old_inum and new_inum NOT match"
292         return 1
293     fi
294     rm $DIR/$tfile
295 }
296 run_test 9  "|X| create (same inum/gen)"
297
298 test_10() {
299     mcreate $DIR/$tfile
300     replay_barrier mds1
301     mv $DIR/$tfile $DIR/$tfile-2
302     rm -f $DIR/$tfile
303     fail mds1
304     
305     $CHECKSTAT $DIR/$tfile && return 1
306     $CHECKSTAT $DIR/$tfile-2 || return 2
307     rm $DIR/$tfile-2
308     return 0
309 }
310 run_test 10 "create |X| rename unlink"
311
312 test_11() {
313     mcreate $DIR/$tfile
314     echo "old" > $DIR/$tfile
315     mv $DIR/$tfile $DIR/$tfile-2
316     replay_barrier mds1
317     echo "new" > $DIR/$tfile
318     grep new $DIR/$tfile 
319     grep old $DIR/$tfile-2
320     fail mds1
321     grep new $DIR/$tfile || return 1
322     grep old $DIR/$tfile-2 || return 2
323 }
324 run_test 11 "create open write rename |X| create-old-name read"
325
326 test_12() {
327     mcreate $DIR/$tfile 
328     multiop $DIR/$tfile o_tSc &
329     pid=$!
330     # give multiop a chance to open
331     sleep 1
332     rm -f $DIR/$tfile
333     replay_barrier mds1
334     kill -USR1 $pid
335     wait $pid || return 1
336
337     fail mds1
338     [ -e $DIR/$tfile ] && return 2
339     return 0
340 }
341 run_test 12 "open, unlink |X| close"
342
343
344 # 1777 - replay open after committed chmod that would make
345 #        a regular open a failure    
346 test_13() {
347     mcreate $DIR/$tfile 
348     multiop $DIR/$tfile O_wc &
349     pid=$!
350     # give multiop a chance to open
351     sleep 1 
352     chmod 0 $DIR/$tfile
353     $CHECKSTAT -p 0 $DIR/$tfile
354     replay_barrier mds1
355     fail mds1
356     kill -USR1 $pid
357     wait $pid || return 1
358
359     $CHECKSTAT -s 1 -p 0 $DIR/$tfile || return 2
360     return 0
361 }
362 run_test 13 "open chmod 0 |x| write close"
363
364 test_14() {
365     multiop $DIR/$tfile O_tSc &
366     pid=$!
367     # give multiop a chance to open
368     sleep 1 
369     rm -f $DIR/$tfile
370     replay_barrier mds1
371     kill -USR1 $pid || return 1
372     wait $pid || return 2
373
374     fail mds1
375     [ -e $DIR/$tfile ] && return 3
376     return 0
377 }
378 run_test 14 "open(O_CREAT), unlink |X| close"
379
380 test_15() {
381     multiop $DIR/$tfile O_tSc &
382     pid=$!
383     # give multiop a chance to open
384     sleep 1 
385     rm -f $DIR/$tfile
386     replay_barrier mds1
387     touch $DIR/g11 || return 1
388     kill -USR1 $pid
389     wait $pid || return 2
390
391     fail mds1
392     [ -e $DIR/$tfile ] && return 3
393     touch $DIR/h11 || return 4
394     return 0
395 }
396 run_test 15 "open(O_CREAT), unlink |X|  touch new, close"
397
398
399 test_16() {
400     replay_barrier mds1
401     mcreate $DIR/$tfile
402     munlink $DIR/$tfile
403     mcreate $DIR/$tfile-2
404     fail mds1
405     [ -e $DIR/$tfile ] && return 1
406     [ -e $DIR/$tfile-2 ] || return 2
407     munlink $DIR/$tfile-2 || return 3
408 }
409 run_test 16 "|X| open(O_CREAT), unlink, touch new,  unlink new"
410
411 test_17() {
412     replay_barrier mds1
413     multiop $DIR/$tfile O_c &
414     pid=$!
415     # give multiop a chance to open
416     sleep 1 
417     fail mds1
418     kill -USR1 $pid || return 1
419     wait $pid || return 2
420     $CHECKSTAT -t file $DIR/$tfile || return 3
421     rm $DIR/$tfile
422 }
423 run_test 17 "|X| open(O_CREAT), |replay| close"
424
425 test_18() {
426     replay_barrier mds1
427     multiop $DIR/$tfile O_tSc &
428     pid=$!
429     # give multiop a chance to open
430     sleep 1 
431     rm -f $DIR/$tfile
432     touch $DIR/$tfile-2 || return 1
433     echo "pid: $pid will close"
434     kill -USR1 $pid
435     wait $pid || return 2
436
437     fail mds1
438     [ -e $DIR/$tfile ] && return 3
439     [ -e $DIR/$tfile-2 ] || return 4
440     # this touch frequently fails
441     touch $DIR/$tfile-3 || return 5
442     munlink $DIR/$tfile-2 || return 6
443     munlink $DIR/$tfile-3 || return 7
444     return 0
445 }
446 run_test 18 "|X| open(O_CREAT), unlink, touch new, close, touch, unlink"
447
448 # bug 1855 (a simpler form of test_11 above)
449 test_19() {
450     replay_barrier mds1
451     mcreate $DIR/$tfile
452     echo "old" > $DIR/$tfile
453     mv $DIR/$tfile $DIR/$tfile-2
454     grep old $DIR/$tfile-2
455     fail mds1
456     grep old $DIR/$tfile-2 || return 2
457 }
458 run_test 19 "|X| mcreate, open, write, rename "
459
460 test_20() {
461     replay_barrier mds1
462     multiop $DIR/$tfile O_tSc &
463     pid=$!
464     # give multiop a chance to open
465     sleep 1 
466     rm -f $DIR/$tfile
467
468     fail mds1
469     kill -USR1 $pid
470     wait $pid || return 1
471     [ -e $DIR/$tfile ] && return 2
472     return 0
473 }
474 run_test 20 "|X| open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
475
476 test_21() {
477     replay_barrier mds1
478     multiop $DIR/$tfile O_tSc &
479     pid=$!
480     # give multiop a chance to open
481     sleep 1 
482     rm -f $DIR/$tfile
483     touch $DIR/g11 || return 1
484
485     fail mds1
486     kill -USR1 $pid
487     wait $pid || return 2
488     [ -e $DIR/$tfile ] && return 3
489     touch $DIR/h11 || return 4
490     return 0
491 }
492 run_test 21 "|X| open(O_CREAT), unlink touch new, replay, close (test mds_cleanup_orphans)"
493
494 test_22() {
495     multiop $DIR/$tfile O_tSc &
496     pid=$!
497     # give multiop a chance to open
498     sleep 1 
499
500     replay_barrier mds1
501     rm -f $DIR/$tfile
502
503     fail mds1
504     kill -USR1 $pid
505     wait $pid || return 1
506     [ -e $DIR/$tfile ] && return 2
507     return 0
508 }
509 run_test 22 "open(O_CREAT), |X| unlink, replay, close (test mds_cleanup_orphans)"
510
511 test_23() {
512     multiop $DIR/$tfile O_tSc &
513     pid=$!
514     # give multiop a chance to open
515     sleep 1 
516
517     replay_barrier mds1
518     rm -f $DIR/$tfile
519     touch $DIR/g11 || return 1
520
521     fail mds1
522     kill -USR1 $pid
523     wait $pid || return 2
524     [ -e $DIR/$tfile ] && return 3
525     touch $DIR/h11 || return 4
526     return 0
527 }
528 run_test 23 "open(O_CREAT), |X| unlink touch new, replay, close (test mds_cleanup_orphans)"
529
530 test_24() {
531     multiop $DIR/$tfile O_tSc &
532     pid=$!
533     # give multiop a chance to open
534     sleep 1 
535
536     replay_barrier mds1
537     fail mds1
538     rm -f $DIR/$tfile
539     kill -USR1 $pid
540     wait $pid || return 1
541     [ -e $DIR/$tfile ] && return 2
542     return 0
543 }
544 run_test 24 "open(O_CREAT), replay, unlink, close (test mds_cleanup_orphans)"
545
546 test_25() {
547     multiop $DIR/$tfile O_tSc &
548     pid=$!
549     # give multiop a chance to open
550     sleep 1 
551     rm -f $DIR/$tfile
552
553     replay_barrier mds1
554     fail mds1
555     kill -USR1 $pid
556     wait $pid || return 1
557     [ -e $DIR/$tfile ] && return 2
558     return 0
559 }
560 run_test 25 "open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
561
562 test_26() {
563     replay_barrier mds1
564     multiop $DIR/$tfile-1 O_tSc &
565     pid1=$!
566     multiop $DIR/$tfile-2 O_tSc &
567     pid2=$!
568     # give multiop a chance to open
569     sleep 1 
570     rm -f $DIR/$tfile-1
571     rm -f $DIR/$tfile-2
572     kill -USR1 $pid2
573     wait $pid2 || return 1
574
575     fail mds1
576     kill -USR1 $pid1
577     wait $pid1 || return 2
578     [ -e $DIR/$tfile-1 ] && return 3
579     [ -e $DIR/$tfile-2 ] && return 4
580     return 0
581 }
582 run_test 26 "|X| open(O_CREAT), unlink two, close one, replay, close one (test mds_cleanup_orphans)"
583
584 test_27() {
585     replay_barrier mds1
586     multiop $DIR/$tfile-1 O_tSc &
587     pid1=$!
588     multiop $DIR/$tfile-2 O_tSc &
589     pid2=$!
590     # give multiop a chance to open
591     sleep 1 
592     rm -f $DIR/$tfile-1
593     rm -f $DIR/$tfile-2
594
595     fail mds1
596     kill -USR1 $pid1
597     wait $pid1 || return 1
598     kill -USR1 $pid2
599     wait $pid2 || return 2
600     [ -e $DIR/$tfile-1 ] && return 3
601     [ -e $DIR/$tfile-2 ] && return 4
602     return 0
603 }
604 run_test 27 "|X| open(O_CREAT), unlink two, replay, close two (test mds_cleanup_orphans)"
605
606 test_28() {
607     multiop $DIR/$tfile-1 O_tSc &
608     pid1=$!
609     multiop $DIR/$tfile-2 O_tSc &
610     pid2=$!
611     # give multiop a chance to open
612     sleep 1 
613     replay_barrier mds1
614     rm -f $DIR/$tfile-1
615     rm -f $DIR/$tfile-2
616     kill -USR1 $pid2
617     wait $pid2 || return 1
618
619     fail mds1
620     kill -USR1 $pid1
621     wait $pid1 || return 2
622     [ -e $DIR/$tfile-1 ] && return 3
623     [ -e $DIR/$tfile-2 ] && return 4
624     return 0
625 }
626 run_test 28 "open(O_CREAT), |X| unlink two, close one, replay, close one (test mds_cleanup_orphans)"
627
628 test_29() {
629     multiop $DIR/$tfile-1 O_tSc &
630     pid1=$!
631     multiop $DIR/$tfile-2 O_tSc &
632     pid2=$!
633     # give multiop a chance to open
634     sleep 1 
635     replay_barrier mds1
636     rm -f $DIR/$tfile-1
637     rm -f $DIR/$tfile-2
638
639     fail mds1
640     kill -USR1 $pid1
641     wait $pid1 || return 1
642     kill -USR1 $pid2
643     wait $pid2 || return 2
644     [ -e $DIR/$tfile-1 ] && return 3
645     [ -e $DIR/$tfile-2 ] && return 4
646     return 0
647 }
648 run_test 29 "open(O_CREAT), |X| unlink two, replay, close two (test mds_cleanup_orphans)"
649
650 test_30() {
651     multiop $DIR/$tfile-1 O_tSc &
652     pid1=$!
653     multiop $DIR/$tfile-2 O_tSc &
654     pid2=$!
655     # give multiop a chance to open
656     sleep 1 
657     rm -f $DIR/$tfile-1
658     rm -f $DIR/$tfile-2
659
660     replay_barrier mds1
661     fail mds1
662     kill -USR1 $pid1
663     wait $pid1 || return 1
664     kill -USR1 $pid2
665     wait $pid2 || return 2
666     [ -e $DIR/$tfile-1 ] && return 3
667     [ -e $DIR/$tfile-2 ] && return 4
668     return 0
669 }
670 run_test 30 "open(O_CREAT) two, unlink two, replay, close two (test mds_cleanup_orphans)"
671
672 test_31() {
673     multiop $DIR/$tfile-1 O_tSc &
674     pid1=$!
675     multiop $DIR/$tfile-2 O_tSc &
676     pid2=$!
677     # give multiop a chance to open
678     sleep 1 
679     rm -f $DIR/$tfile-1
680
681     replay_barrier mds1
682     rm -f $DIR/$tfile-2
683     fail mds1
684     kill -USR1 $pid1
685     wait $pid1 || return 1
686     kill -USR1 $pid2
687     wait $pid2 || return 2
688     [ -e $DIR/$tfile-1 ] && return 3
689     [ -e $DIR/$tfile-2 ] && return 4
690     return 0
691 }
692 run_test 31 "open(O_CREAT) two, unlink one, |X| unlink one, close two (test mds_cleanup_orphans)"
693
694 # tests for bug 2104; completion without crashing is success.  The close is
695 # stale, but we always return 0 for close, so the app never sees it.
696 test_32() {
697     multiop $DIR/$tfile O_c &
698     pid1=$!
699     multiop $DIR/$tfile O_c &
700     pid2=$!
701     # give multiop a chance to open
702     sleep 1
703     mds_evict_client
704     df $MOUNT || sleep 1 && df $MOUNT || return 1
705     kill -USR1 $pid1
706     kill -USR1 $pid2
707     sleep 1
708     return 0
709 }
710 run_test 32 "close() notices client eviction; close() after client eviction"
711
712 # Abort recovery before client complete
713 test_33() {
714     replay_barrier mds1
715     touch $DIR/$tfile
716     fail_abort mds1
717     # this file should be gone, because the replay was aborted
718     $CHECKSTAT -t file $DIR/$tfile && return 1
719     return 0
720 }
721 run_test 33 "abort recovery before client does replay"
722
723 test_34() {
724     multiop $DIR/$tfile O_c &
725     pid=$!
726     # give multiop a chance to open
727     sleep 1 
728     rm -f $DIR/$tfile
729
730     replay_barrier mds1
731     fail_abort mds1
732     kill -USR1 $pid
733     [ -e $DIR/$tfile ] && return 1
734     sync
735     return 0
736 }
737 run_test 34 "abort recovery before client does replay (test mds_cleanup_orphans)"
738
739 # bug 2278 - generate one orphan on OST, then destroy it during recovery from llog 
740 test_35() {
741     touch $DIR/$tfile
742
743 #define OBD_FAIL_MDS_REINT_NET_REP       0x119
744     do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
745     rm -f $DIR/$tfile &
746     sleep 1
747     sync
748     sleep 1
749     # give a chance to remove from MDS
750     fail_abort mds1
751     $CHECKSTAT -t file $DIR/$tfile && return 1 || true
752 }
753 run_test 35 "test recovery from llog for unlink op"
754
755 # b=2432 resent cancel after replay uses wrong cookie,
756 # so don't resend cancels
757 test_36() {
758     replay_barrier mds1
759     touch $DIR/$tfile
760     checkstat $DIR/$tfile
761     facet_failover mds1
762     cancel_lru_locks MDC
763     if dmesg | grep "unknown lock cookie"; then 
764         echo "cancel after replay failed"
765         return 1
766     fi
767 }
768 run_test 36 "don't resend cancel"
769
770 # b=2368
771 # directory orphans can't be unlinked from PENDING directory
772 test_37() {
773     rmdir $DIR/$tfile 2>/dev/null
774     multiop $DIR/$tfile dD_c &
775     pid=$!
776     # give multiop a chance to open
777     sleep 1 
778     rmdir $DIR/$tfile
779
780     replay_barrier mds1
781     # clear the dmesg buffer so we only see errors from this recovery
782     dmesg -c >/dev/null
783     fail_abort mds1
784     kill -USR1 $pid
785     dmesg | grep  "mds_unlink_orphan.*error .* unlinking orphan" && return 1
786     sync
787     return 0
788 }
789 run_test 37 "abort recovery before client does replay (test mds_cleanup_orphans for directories)"
790
791 test_38() {
792     createmany -o $DIR/$tfile-%d 800
793     unlinkmany $DIR/$tfile-%d 0 400
794     replay_barrier mds1
795     fail mds1
796     unlinkmany $DIR/$tfile-%d 400 400
797     sleep 2
798     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
799 }
800 run_test 38 "test recovery from unlink llog (test llog_gen_rec) "
801
802 test_39() {
803     createmany -o $DIR/$tfile-%d 800
804     replay_barrier mds1
805     unlinkmany $DIR/$tfile-%d 0 400
806     fail mds1
807     unlinkmany $DIR/$tfile-%d 400 400
808     sleep 2
809     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
810 }
811 run_test 39 "test recovery from unlink llog (test llog_gen_rec) "
812
813 count_ost_writes() {
814         cat /proc/fs/lustre/osc/*/stats |
815             awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }'
816 }
817
818 #b=2477,2532
819 test_40(){
820     $LCTL mark multiop $MOUNT/$tfile OS_c 
821     multiop $MOUNT/$tfile OS_c  &
822     PID=$!
823     writeme -s $MOUNT/${tfile}-2 &
824     WRITE_PID=$!
825     sleep 1
826     facet_failover mds1
827 #define OBD_FAIL_MDS_CONNECT_NET         0x117
828     do_facet mds "sysctl -w lustre.fail_loc=0x80000117"
829     kill -USR1 $PID
830     stat1=`count_ost_writes`
831     sleep $TIMEOUT
832     stat2=`count_ost_writes`
833     echo "$stat1, $stat2"
834     if [ $stat1 -lt $stat2 ]; then 
835        echo "writes continuing during recovery"
836        RC=0
837     else
838        echo "writes not continuing during recovery, bug 2477"
839        RC=4
840     fi
841     echo "waiting for writeme $WRITE_PID"
842     kill $WRITE_PID
843     wait $WRITE_PID 
844
845     echo "waiting for multiop $PID"
846     wait $PID || return 2
847     do_facet client munlink $MOUNT/$tfile  || return 3
848     do_facet client munlink $MOUNT/${tfile}-2  || return 3
849     return $RC
850 }
851 run_test 40 "cause recovery in ptlrpc, ensure IO continues"
852
853
854 #b=2814
855 # make sure that a read to one osc doesn't try to double-unlock its page just
856 # because another osc is invalid.  trigger_group_io used to mistakenly return
857 # an error if any oscs were invalid even after having successfully put rpcs
858 # on valid oscs.  This was fatal if the caller was ll_readpage who unlocked
859 # the page, guarnateeing that the unlock from the RPC completion would
860 # assert on trying to unlock the unlocked page.
861 test_41() {
862     local f=$MOUNT/$tfile
863     # make sure the start of the file is ost1
864     lfs setstripe $f $((128 * 1024)) 0 0 
865     do_facet client dd if=/dev/zero of=$f bs=4k count=1 || return 3
866     cancel_lru_locks OSC
867     # fail ost2 and read from ost1
868     local osc2_dev=`$LCTL device_list | \
869                 awk '(/ost2.*client_facet/){print $4}' `
870     $LCTL --device %$osc2_dev deactivate
871     do_facet client dd if=$f of=/dev/null bs=4k count=1 || return 3
872     $LCTL --device %$osc2_dev activate
873     return 0
874 }
875 run_test 41 "read from a valid osc while other oscs are invalid"
876
877 # test MDS recovery after ost failure
878 test_42() {
879     blocks=`df $MOUNT | tail -n 1 | awk '{ print $1 }'`
880     createmany -o $DIR/$tfile-%d 800
881     replay_barrier ost
882     unlinkmany $DIR/$tfile-%d 0 400
883     facet_failover ost
884     
885     # osc is evicted, fs is smaller
886     blocks_after=`df $MOUNT | tail -n 1 | awk '{ print $1 }'`
887     [ $blocks_after -lt $blocks ] || return 1
888     echo wait for MDS to timeout and recover
889     sleep $((TIMEOUT * 2))
890     unlinkmany $DIR/$tfile-%d 400 400
891     $CHECKSTAT -t file $DIR/$tfile-* && return 2 || true
892 }
893 run_test 42 "recovery after ost failure"
894
895 # b=2530
896 # timeout in MDS/OST recovery RPC will LBUG MDS
897 test_43() {
898     replay_barrier mds1
899
900     # OBD_FAIL_OST_CREATE_NET 0x204
901     do_facet ost "sysctl -w lustre.fail_loc=0x80000204"
902     facet_failover mds1
903     df $MOUNT || return 1
904     sleep 10
905     do_facet ost "sysctl -w lustre.fail_loc=0"
906
907     return 0
908 }
909 run_test 43 "mds osc import failure during recovery; don't LBUG"
910
911 test_44() {
912     mdcdev=`awk '/mds_svc_MNT/ {print $1}' < /proc/fs/lustre/devices`
913     do_facet mds "sysctl -w lustre.fail_loc=0x80000701"
914     $LCTL --device $mdcdev recover
915     df $MOUNT
916     do_facet mds "sysctl -w lustre.fail_loc=0"
917     return 0
918 }
919 run_test 44 "race in target handle connect"
920
921 # Handle failed close
922 test_45() {
923     mdcdev=`awk '/mds_svc_MNT/ {print $1}' < /proc/fs/lustre/devices`
924     $LCTL --device $mdcdev recover
925
926     multiop $DIR/$tfile O_c &
927     pid=$!
928     sleep 1
929
930     # This will cause the CLOSE to fail before even 
931     # allocating a reply buffer
932     $LCTL --device $mdcdev deactivate
933
934     # try the close
935     kill -USR1 $pid
936     wait $pid || return 1
937
938     $LCTL --device $mdcdev activate
939     sleep 1
940
941     $CHECKSTAT -t file $DIR/$tfile || return 2
942     return 0
943 }
944 run_test 45 "Handle failed close"
945
946 test_46() {
947     dmesg -c >/dev/null
948     drop_reply "touch $DIR/$tfile"
949     fail mds1
950     # ironically, the previous test, 45, will cause a real forced close,
951     # so just look for one for this test
952     dmesg | grep -i "force closing client file handle for $tfile" && return 1
953     return 0
954 }
955 run_test 46 "Don't leak file handle after open resend (3325)"
956
957 # b=2824
958 test_47() {
959
960     # create some files to make sure precreate has been done on all 
961     # OSTs. (just in case this test is run independently)
962     createmany -o $DIR/$tfile 20  || return 1
963
964     # OBD_FAIL_OST_CREATE_NET 0x204
965     fail ost
966     do_facet ost "sysctl -w lustre.fail_loc=0x80000204"
967     df $MOUNT || return 2
968
969     # let the MDS discover the OST failure, attempt to recover, fail
970     # and recover again.  
971     sleep $((3 * TIMEOUT))
972
973     # Without 2824, this createmany would hang 
974     createmany -o $DIR/$tfile 20 || return 3
975     unlinkmany $DIR/$tfile 20 || return 4
976
977     do_facet ost "sysctl -w lustre.fail_loc=0"
978     return 0
979 }
980 run_test 47 "MDS->OSC failure during precreate cleanup (2824)"
981
982
983 test_48() {
984     createmany -o $DIR/${tfile}- 100
985     $CHECKSTAT $DIR/${tfile}-99 || return 1
986     mds_evict_client
987     df $MOUNT || df $MOUNT || return 2
988     sleep 1
989     $CHECKSTAT $DIR/${tfile}-99 || return 3
990
991     dmesg -c >/dev/null
992     replay_barrier mds1
993     fail mds1
994     unlinkmany $DIR/${tfile}- 100 || return 4
995     if dmesg | grep "back in time"; then 
996         echo "server went back in time!"
997         return 5
998     fi
999     return 0
1000 }
1001 run_test 48 "Don't lose transno when client is evicted (2525)"
1002
1003 # b=3550 - replay of unlink
1004 test_49() {
1005     replay_barrier mds1
1006     createmany -o $DIR/$tfile-%d 400 || return 1
1007     unlinkmany $DIR/$tfile-%d 0 400 || return 2
1008     fail mds1
1009     $CHECKSTAT -t file $DIR/$tfile-* && return 3 || true
1010 }
1011 run_test 49 "re-write records to llog as written during fail"
1012
1013 test_50() {
1014     local osc_dev=`$LCTL device_list | \
1015                awk '(/ost_svc_mds1_svc/){print $4}' `
1016     $LCTL --device %$osc_dev recover &&  $LCTL --device %$osc_dev recover
1017     # give the mds_lov_sync threads a chance to run
1018     sleep 5
1019 }
1020 run_test 50 "Double OSC recovery, don't LASSERT (3812)"
1021
1022 # bug 3462 - simultaneous MDC requests
1023 test_51a() {
1024     replay_barrier_nodf mds
1025     mkdir -p $DIR/${tdir}-1
1026     mkdir -p $DIR/${tdir}-2
1027     touch $DIR/${tdir}-2/f
1028     multiop $DIR/${tdir}-1/f O_c &
1029     pid=$!
1030     # give multiop a chance to open
1031     sleep 1
1032
1033     do_facet mds "sysctl -w lustre.fail_loc=0x80000115"
1034     kill -USR1 $pid
1035     do_facet mds "sysctl -w lustre.fail_loc=0"
1036     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 1
1037
1038     fail mds
1039
1040     wait $pid || return 2
1041     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1042     rm -rf $DIR/${tdir}-*
1043 }
1044 run_test 51a "|X| close request while two MDC requests in flight"
1045
1046 test_51b() {
1047     replay_barrier_nodf mds
1048     mkdir -p $DIR/$tdir-1
1049     mkdir -p $DIR/$tdir-2
1050     multiop $DIR/$tdir-1/f O_c &
1051     pid=$!
1052     # give multiop a chance to open
1053     sleep 1
1054
1055     do_facet mds "sysctl -w lustre.fail_loc=0x80000107"
1056     touch $DIR/${tdir}-2/f &
1057     usleep 500
1058     do_facet mds "sysctl -w lustre.fail_loc=0"
1059
1060     kill -USR1 $pid
1061     wait $pid || return 1
1062                                                                                                                              
1063     fail mds
1064
1065     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 2
1066     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 3
1067     rm -rf $DIR/${tdir}-*
1068 }
1069 run_test 51b "|X| open request while two MDC requests in flight"
1070
1071 test_51c() {
1072     replay_barrier_nodf mds
1073     mkdir -p $DIR/${tdir}-1
1074     mkdir -p $DIR/${tdir}-2
1075     multiop $DIR/${tdir}-1/f O_c &
1076     pid=$!
1077     # give multiop a chance to open
1078     sleep 1
1079
1080     do_facet mds "sysctl -w lustre.fail_loc=0x80000107"
1081     touch $DIR/${tdir}-2/f &
1082     do_facet mds "sysctl -w lustre.fail_loc=0"
1083
1084     do_facet mds "sysctl -w lustre.fail_loc=0x80000115"
1085     kill -USR1 $pid
1086     do_facet mds "sysctl -w lustre.fail_loc=0"
1087
1088     fail mds
1089
1090     wait $pid || return 1
1091     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 2
1092     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 3
1093     rm -rf $DIR/${tdir}-*
1094 }
1095 run_test 51c "|X| open request and close request while two MDC requests in flight"
1096
1097 test_51d() {
1098     replay_barrier_nodf mds
1099     mkdir -p $DIR/${tdir}-1
1100     mkdir -p $DIR/${tdir}-2
1101     touch $DIR/${tdir}-2/f
1102     multiop $DIR/${tdir}-1/f O_c &
1103     pid=$!
1104     # give multiop a chance to open
1105     sleep 1
1106
1107     do_facet mds "sysctl -w lustre.fail_loc=0x80000122"
1108     kill -USR1 $pid
1109     do_facet mds "sysctl -w lustre.fail_loc=0"
1110     #$CHECKSTAT -t file $DIR/${tdir}-2/f || return 1
1111
1112     fail mds
1113
1114     wait $pid || return 2
1115     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1116     rm -rf $DIR/${tdir}-*
1117 }
1118 run_test 51d "|X| close reply while two MDC requests in flight"
1119
1120 test_51e() {
1121     replay_barrier_nodf mds
1122     mkdir -p $DIR/$tdir-1
1123     mkdir -p $DIR/$tdir-2
1124     multiop $DIR/$tdir-1/f O_c &
1125     pid=$!
1126     # give multiop a chance to open
1127     sleep 1
1128
1129     do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
1130     touch $DIR/${tdir}-2/f &
1131     usleep 500
1132     do_facet mds "sysctl -w lustre.fail_loc=0"
1133
1134     kill -USR1 $pid
1135     wait $pid || return 1
1136
1137     fail mds
1138
1139     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 2
1140     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 3
1141     rm -rf $DIR/${tdir}-*
1142 }
1143 run_test 51e "|X| open reply while two MDC requests in flight"
1144
1145 test_51f() {
1146     replay_barrier_nodf mds
1147     mkdir -p $DIR/${tdir}-1
1148     mkdir -p $DIR/${tdir}-2
1149     multiop $DIR/${tdir}-1/f O_c &
1150     pid=$!
1151     # give multiop a chance to open
1152     sleep 1
1153
1154     do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
1155     touch $DIR/${tdir}-2/f &
1156     do_facet mds "sysctl -w lustre.fail_loc=0"
1157
1158     do_facet mds "sysctl -w lustre.fail_loc=0x80000122"
1159     kill -USR1 $pid
1160     do_facet mds "sysctl -w lustre.fail_loc=0"
1161
1162     fail mds
1163
1164     wait $pid || return 1
1165     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 2
1166     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 3
1167     rm -rf $DIR/${tdir}-*
1168 }
1169 run_test 51f "|X| open reply and close reply while two MDC requests in flight"
1170
1171 test_51g() {
1172     replay_barrier_nodf mds
1173     mkdir -p $DIR/${tdir}-1
1174     mkdir -p $DIR/${tdir}-2
1175     multiop $DIR/${tdir}-1/f O_c &
1176     pid=$!
1177     # give multiop a chance to open
1178     sleep 1
1179
1180     do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
1181     touch $DIR/${tdir}-2/f &
1182     do_facet mds "sysctl -w lustre.fail_loc=0"
1183
1184     do_facet mds "sysctl -w lustre.fail_loc=0x80000115"
1185     kill -USR1 $pid
1186     do_facet mds "sysctl -w lustre.fail_loc=0"
1187
1188     fail mds
1189
1190     wait $pid || return 1
1191     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 2
1192     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 3
1193     rm -rf $DIR/${tdir}-*
1194 }
1195 run_test 51g "|X| open reply and close request while two MDC requests in flight"
1196
1197 test_51h() {
1198     replay_barrier_nodf mds
1199     mkdir -p $DIR/${tdir}-1
1200     mkdir -p $DIR/${tdir}-2
1201     multiop $DIR/${tdir}-1/f O_c &
1202     pid=$!
1203     # give multiop a chance to open
1204     sleep 1
1205
1206     do_facet mds "sysctl -w lustre.fail_loc=0x80000107"
1207     touch $DIR/${tdir}-2/f &
1208     do_facet mds "sysctl -w lustre.fail_loc=0"
1209
1210     do_facet mds "sysctl -w lustre.fail_loc=0x80000122"
1211     kill -USR1 $pid
1212     do_facet mds "sysctl -w lustre.fail_loc=0"
1213
1214     fail mds
1215
1216     wait $pid || return 1
1217     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 2
1218     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 3
1219     rm -rf $DIR/${tdir}-*
1220 }
1221 run_test 51h "|X| open request and close reply while two MDC requests in flight"
1222
1223 # b3764 timed out lock replay
1224 test_52() {
1225     touch $DIR/$tfile
1226     cancel_lru_locks MDC
1227
1228     multiop $DIR/$tfile s
1229     replay_barrier mds1
1230     do_facet mds1 "sysctl -w lustre.fail_loc=0x8000030c"
1231     fail mds1
1232     do_facet mds1 "sysctl -w lustre.fail_loc=0x0"
1233
1234     $CHECKSTAT -t file $DIR/$tfile-* && return 3 || true
1235 }
1236 run_test 52 "time out lock replay (3764)"
1237
1238 test_53() {
1239     replay_barrier_nodf mds
1240     f1=$DIR/${tfile}-1
1241     cat <<EOF > $f1
1242 #!/bin/sh
1243 true
1244 EOF
1245     chmod +x $f1
1246     do_facet mds "sysctl -w lustre.fail_loc=0x80000107"
1247     $f1 || return 1
1248     do_facet mds "sysctl -w lustre.fail_loc=0"
1249
1250     fail mds
1251     rm -f $f1
1252 }
1253 run_test 53 "|X| open request and close reply while two MDC requests in flight"
1254
1255 test_54() {
1256     replay_barrier mds
1257     createmany -o $DIR/$tfile 20
1258     unlinkmany $DIR/$tfile 20
1259     fail mds
1260 }
1261 run_test 54 "|X| open request and close reply while two MDC requests in flight"
1262
1263 #b3440 ASSERTION(rec->ur_fid2->id) failed
1264 test_55() {
1265     sysctl -w portals.debug=-1 portals.debug_mb=25
1266     ln -s foo $DIR/$tfile
1267     replay_barrier mds
1268     #drop_reply "cat $DIR/$tfile"
1269     fail mds
1270     sleep 10
1271     lctl dk /r/tmp/debug
1272 }
1273 run_test 55 "don't replay a symlink open request (3440)"
1274
1275 #b3761 ASSERTION(hash != 0) failed
1276 test_56() {
1277 # OBD_FAIL_MDS_OPEN_CREATE | OBD_FAIL_ONCE
1278     do_facet mds "sysctl -w lustre.fail_loc=0x8000012b"
1279     touch $DIR/$tfile
1280     pid=$!
1281     # give a chance for touch to run
1282     sleep 5
1283     do_facet mds "sysctl -w lustre.fail_loc=0x0"
1284     wait $pid || return 1
1285     rm $DIR/$tfile
1286     return 0
1287 }
1288 run_test 56 "let MDS_CHECK_RESENT return the original return code instead of 0
1289
1290 equals_msg test complete, cleaning up
1291 $CLEANUP
1292