Whamcloud - gitweb
- removed crow test from replay-single;
[fs/lustre-release.git] / lustre / tests / replay-single.sh
1 #!/bin/sh
2
3 set -e
4 #set -v
5
6 #
7 # This test needs to be run on the client
8 #
9
10 LUSTRE=${LUSTRE:-`dirname $0`/..}
11 . $LUSTRE/tests/test-framework.sh
12 init_test_env $@
13 . ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
14
15
16 # Skip these tests
17 # bug number: 2766 4176
18 ALWAYS_EXCEPT="0b  39   $REPLAY_SINGLE_EXCEPT"
19
20 # failed in our b_new_cmd, please update this.
21 ALWAYS_EXCEPT=" 5 11 20b 25 30 31 52 58 $ALWAYS_EXCEPT"
22
23
24 build_test_filter
25
26 SETUP=${SETUP:-"setup"}
27 CLEANUP=${CLEANUP:-"stopall"}
28
29 if [ "$ONLY" == "cleanup" ]; then
30     sysctl -w lnet.debug=0 || true
31     $CLEANUP
32     exit 0
33 fi
34
35 setup() {
36     formatall
37     setupall
38 }
39
40 $SETUP
41
42 if [ "$ONLY" == "setup" ]; then
43     exit 0
44 fi
45
46 mkdir -p $DIR
47
48 test_0() {
49     replay_barrier mds
50     fail mds
51 }
52 run_test 0 "empty replay"
53
54 test_0b() {
55     # this test attempts to trigger a race in the precreation code, 
56     # and must run before any other objects are created on the filesystem
57     fail ost1
58     createmany -o $DIR/$tfile 20 || return 1
59     unlinkmany $DIR/$tfile 20 || return 2
60 }
61 run_test 0b "ensure object created after recover exists. (3284)"
62
63 seq_set_width()
64 {
65     local fn=`ls /proc/fs/lustre/seq-cli-srv*/seq_width` 
66     echo $1 > $fn
67 }
68
69 seq_get_width()
70 {
71     local fn=`ls /proc/fs/lustre/seq-cli-srv*/seq_width` 
72     cat $fn
73 }
74
75 test_0c() {
76     replay_barrier mds
77
78     local seq_width
79     
80     # make seq manager switch to next sequence each 
81     # time as new fid is needed.
82     seq_width=`seq_get_width`
83     seq_set_width 1
84     
85     # make sure that fld has created atleast one new 
86     # entry on server
87     touch $DIR/$tfile || return 1
88     seq_set_width $seq_width
89     
90     # fail mds and start recovery, replay RPCs, etc.
91     fail mds
92     
93     # wait for recovery finish
94     sleep 20
95     df $MOUNT
96     
97     # flush fld cache and dentry cache to make it lookup 
98     # created entry instead of revalidating existent one
99     umount $MOUNT
100     zconf_mount `hostname` $MOUNT
101     
102     # issue lookup which should call fld lookup which 
103     # should fail if client did not replay fld create 
104     # correctly and server has no fld entry
105     touch $DIR/$tfile || return 2
106     rm $DIR/$tfile || return 2
107 }
108 run_test 0c "fld create"
109
110 test_1() {
111     replay_barrier mds
112     mcreate $DIR/$tfile
113     fail mds
114     $CHECKSTAT -t file $DIR/$tfile || return 1
115     rm $DIR/$tfile
116 }
117 run_test 1 "simple create"
118
119 test_2a() {
120     replay_barrier mds
121     touch $DIR/$tfile
122     fail mds
123     $CHECKSTAT -t file $DIR/$tfile || return 1
124     rm $DIR/$tfile
125 }
126 run_test 2a "touch"
127
128 test_2b() {
129     ./mcreate $DIR/$tfile
130     replay_barrier mds
131     touch $DIR/$tfile
132     fail mds
133     $CHECKSTAT -t file $DIR/$tfile || return 1
134     rm $DIR/$tfile
135 }
136 run_test 2b "touch"
137
138 test_3a() {
139     replay_barrier mds
140     mcreate $DIR/$tfile
141     o_directory $DIR/$tfile
142     fail mds
143     $CHECKSTAT -t file $DIR/$tfile || return 2
144     rm $DIR/$tfile
145 }
146 run_test 3a "replay failed open(O_DIRECTORY)"
147
148 test_3b() {
149     replay_barrier mds
150 #define OBD_FAIL_MDS_OPEN_PACK | OBD_FAIL_ONCE
151     do_facet mds "sysctl -w lustre.fail_loc=0x80000114"
152     touch $DIR/$tfile
153     do_facet mds "sysctl -w lustre.fail_loc=0"
154     fail mds
155     $CHECKSTAT -t file $DIR/$tfile && return 2
156     return 0
157 }
158 run_test 3b "replay failed open -ENOMEM"
159
160 test_3c() {
161     replay_barrier mds
162 #define OBD_FAIL_MDS_ALLOC_OBDO | OBD_FAIL_ONCE
163     do_facet mds "sysctl -w lustre.fail_loc=0x80000128"
164     touch $DIR/$tfile
165     do_facet mds "sysctl -w lustre.fail_loc=0"
166     fail mds
167
168     $CHECKSTAT -t file $DIR/$tfile && return 2
169     return 0
170 }
171 run_test 3c "replay failed open -ENOMEM"
172
173 test_4() {
174     replay_barrier mds
175     for i in `seq 10`; do
176         echo "tag-$i" > $DIR/$tfile-$i
177     done 
178     fail mds
179     for i in `seq 10`; do
180       grep -q "tag-$i" $DIR/$tfile-$i || error "$tfile-$i"
181     done 
182 }
183 run_test 4 "|x| 10 open(O_CREAT)s"
184
185 test_4b() {
186     replay_barrier mds
187     rm -rf $DIR/$tfile-*
188     fail mds
189     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
190 }
191 run_test 4b "|x| rm 10 files"
192
193 # The idea is to get past the first block of precreated files on both 
194 # osts, and then replay.
195 test_5() {
196     replay_barrier mds
197     for i in `seq 220`; do
198         echo "tag-$i" > $DIR/$tfile-$i
199     done 
200     fail mds
201     for i in `seq 220`; do
202       grep -q "tag-$i" $DIR/$tfile-$i || error "f1c-$i"
203     done 
204     rm -rf $DIR/$tfile-*
205     sleep 3
206     # waiting for commitment of removal
207 }
208 run_test 5 "|x| 220 open(O_CREAT)"
209
210
211 test_6() {
212     replay_barrier mds
213     mkdir $DIR/$tdir
214     mcreate $DIR/$tdir/$tfile
215     fail mds
216     $CHECKSTAT -t dir $DIR/$tdir || return 1
217     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
218     sleep 2
219     # waiting for log process thread
220 }
221 run_test 6 "mkdir + contained create"
222
223 test_6b() {
224     replay_barrier mds
225     rm -rf $DIR/$tdir
226     fail mds
227     $CHECKSTAT -t dir $DIR/$tdir && return 1 || true 
228 }
229 run_test 6b "|X| rmdir"
230
231 test_7() {
232     mkdir $DIR/$tdir
233     replay_barrier mds
234     mcreate $DIR/$tdir/$tfile
235     fail mds
236     $CHECKSTAT -t dir $DIR/$tdir || return 1
237     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
238     rm -fr $DIR/$tdir
239 }
240 run_test 7 "mkdir |X| contained create"
241
242 test_8() {
243     replay_barrier mds
244     multiop $DIR/$tfile mo_c &
245     MULTIPID=$!
246     sleep 1
247     fail mds
248     ls $DIR/$tfile
249     $CHECKSTAT -t file $DIR/$tfile || return 1
250     kill -USR1 $MULTIPID || return 2
251     wait $MULTIPID || return 3
252     rm $DIR/$tfile
253 }
254 run_test 8 "creat open |X| close"
255
256 test_9() {
257     replay_barrier mds
258     mcreate $DIR/$tfile
259     local old_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
260     fail mds
261     local new_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
262
263     echo " old_inum == $old_inum, new_inum == $new_inum"
264     if [ $old_inum -eq $new_inum  ] ;
265     then
266         echo " old_inum and new_inum match"
267     else
268         echo "!!!! old_inum and new_inum NOT match"
269         return 1
270     fi
271     rm $DIR/$tfile
272 }
273 run_test 9  "|X| create (same inum/gen)"
274
275 test_10() {
276     mcreate $DIR/$tfile
277     replay_barrier mds
278     mv $DIR/$tfile $DIR/$tfile-2
279     rm -f $DIR/$tfile
280     fail mds
281     $CHECKSTAT $DIR/$tfile && return 1
282     $CHECKSTAT $DIR/$tfile-2 ||return 2
283     rm $DIR/$tfile-2
284     return 0
285 }
286 run_test 10 "create |X| rename unlink"
287
288 test_11() {
289     mcreate $DIR/$tfile
290     echo "old" > $DIR/$tfile
291     mv $DIR/$tfile $DIR/$tfile-2
292     replay_barrier mds
293     echo "new" > $DIR/$tfile
294     grep new $DIR/$tfile 
295     grep old $DIR/$tfile-2
296     fail mds
297     grep new $DIR/$tfile || return 1
298     grep old $DIR/$tfile-2 || return 2
299 }
300 run_test 11 "create open write rename |X| create-old-name read"
301
302 test_12() {
303     mcreate $DIR/$tfile 
304     multiop $DIR/$tfile o_tSc &
305     pid=$!
306     # give multiop a chance to open
307     sleep 1
308     rm -f $DIR/$tfile
309     replay_barrier mds
310     kill -USR1 $pid
311     wait $pid || return 1
312
313     fail mds
314     [ -e $DIR/$tfile ] && return 2
315     return 0
316 }
317 run_test 12 "open, unlink |X| close"
318
319
320 # 1777 - replay open after committed chmod that would make
321 #        a regular open a failure    
322 test_13() {
323     mcreate $DIR/$tfile 
324     multiop $DIR/$tfile O_wc &
325     pid=$!
326     # give multiop a chance to open
327     sleep 1 
328     chmod 0 $DIR/$tfile
329     $CHECKSTAT -p 0 $DIR/$tfile
330     replay_barrier mds
331     fail mds
332     kill -USR1 $pid
333     wait $pid || return 1
334
335     $CHECKSTAT -s 1 -p 0 $DIR/$tfile || return 2
336     return 0
337 }
338 run_test 13 "open chmod 0 |x| write close"
339
340 test_14() {
341     multiop $DIR/$tfile O_tSc &
342     pid=$!
343     # give multiop a chance to open
344     sleep 1 
345     rm -f $DIR/$tfile
346     replay_barrier mds
347     kill -USR1 $pid || return 1
348     wait $pid || return 2
349
350     fail mds
351     [ -e $DIR/$tfile ] && return 3
352     return 0
353 }
354 run_test 14 "open(O_CREAT), unlink |X| close"
355
356 test_15() {
357     multiop $DIR/$tfile O_tSc &
358     pid=$!
359     # give multiop a chance to open
360     sleep 1 
361     rm -f $DIR/$tfile
362     replay_barrier mds
363     touch $DIR/g11 || return 1
364     kill -USR1 $pid
365     wait $pid || return 2
366
367     fail mds
368     [ -e $DIR/$tfile ] && return 3
369     touch $DIR/h11 || return 4
370     return 0
371 }
372 run_test 15 "open(O_CREAT), unlink |X|  touch new, close"
373
374
375 test_16() {
376     replay_barrier mds
377     mcreate $DIR/$tfile
378     munlink $DIR/$tfile
379     mcreate $DIR/$tfile-2
380     fail mds
381     [ -e $DIR/$tfile ] && return 1
382     [ -e $DIR/$tfile-2 ] || return 2
383     munlink $DIR/$tfile-2 || return 3
384 }
385 run_test 16 "|X| open(O_CREAT), unlink, touch new,  unlink new"
386
387 test_17() {
388     replay_barrier mds
389     multiop $DIR/$tfile O_c &
390     pid=$!
391     # give multiop a chance to open
392     sleep 1 
393     fail mds
394     kill -USR1 $pid || return 1
395     wait $pid || return 2
396     $CHECKSTAT -t file $DIR/$tfile || return 3
397     rm $DIR/$tfile
398 }
399 run_test 17 "|X| open(O_CREAT), |replay| close"
400
401 test_18() {
402     replay_barrier mds
403     multiop $DIR/$tfile O_tSc &
404     pid=$!
405     # give multiop a chance to open
406     sleep 1 
407     rm -f $DIR/$tfile
408     touch $DIR/$tfile-2 || return 1
409     echo "pid: $pid will close"
410     kill -USR1 $pid
411     wait $pid || return 2
412
413     fail mds
414     [ -e $DIR/$tfile ] && return 3
415     [ -e $DIR/$tfile-2 ] || return 4
416     # this touch frequently fails
417     touch $DIR/$tfile-3 || return 5
418     munlink $DIR/$tfile-2 || return 6
419     munlink $DIR/$tfile-3 || return 7
420     return 0
421 }
422 run_test 18 "|X| open(O_CREAT), unlink, touch new, close, touch, unlink"
423
424 # bug 1855 (a simpler form of test_11 above)
425 test_19() {
426     replay_barrier mds
427     mcreate $DIR/$tfile
428     echo "old" > $DIR/$tfile
429     mv $DIR/$tfile $DIR/$tfile-2
430     grep old $DIR/$tfile-2
431     fail mds
432     grep old $DIR/$tfile-2 || return 2
433 }
434 run_test 19 "|X| mcreate, open, write, rename "
435
436 test_20() {
437     replay_barrier mds
438     multiop $DIR/$tfile O_tSc &
439     pid=$!
440     # give multiop a chance to open
441     sleep 1 
442     rm -f $DIR/$tfile
443
444     fail mds
445     kill -USR1 $pid
446     wait $pid || return 1
447     [ -e $DIR/$tfile ] && return 2
448     return 0
449 }
450 run_test 20 "|X| open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
451
452 test_20b() {
453     BEFORESPACE=`df -P $DIR | tail -1 | awk '{ print $4 }'`
454     dd if=/dev/zero of=$DIR/$tfile bs=4k count=10000 &
455     pid=$!
456     usleep 60                           # give dd a chance to start
457     lfs getstripe $DIR/$tfile || return 1
458     rm -f $DIR/$tfile   || return 2     # make it an orphan
459     mds_evict_client
460     df -P $DIR || df -P $DIR || true    # reconnect
461
462     fail mds                            # start orphan recovery
463     df -P $DIR || df -P $DIR || true    # reconnect
464     sleep 2
465     AFTERSPACE=`df -P $DIR | tail -1 | awk '{ print $4 }'`
466     [ $AFTERSPACE -lt $((BEFORESPACE - 20)) ] && \
467         error "after $AFTERSPACE < before $BEFORESPACE" && return 5
468     return 0
469 }
470 run_test 20b "write, unlink, eviction, replay, (test mds_cleanup_orphans)"
471
472 test_21() {
473     replay_barrier mds
474     multiop $DIR/$tfile O_tSc &
475     pid=$!
476     # give multiop a chance to open
477     sleep 1 
478     rm -f $DIR/$tfile
479     touch $DIR/g11 || return 1
480
481     fail mds
482     kill -USR1 $pid
483     wait $pid || return 2
484     [ -e $DIR/$tfile ] && return 3
485     touch $DIR/h11 || return 4
486     return 0
487 }
488 run_test 21 "|X| open(O_CREAT), unlink touch new, replay, close (test mds_cleanup_orphans)"
489
490 test_22() {
491     multiop $DIR/$tfile O_tSc &
492     pid=$!
493     # give multiop a chance to open
494     sleep 1 
495
496     replay_barrier mds
497     rm -f $DIR/$tfile
498
499     fail mds
500     kill -USR1 $pid
501     wait $pid || return 1
502     [ -e $DIR/$tfile ] && return 2
503     return 0
504 }
505 run_test 22 "open(O_CREAT), |X| unlink, replay, close (test mds_cleanup_orphans)"
506
507 test_23() {
508     multiop $DIR/$tfile O_tSc &
509     pid=$!
510     # give multiop a chance to open
511     sleep 1 
512
513     replay_barrier mds
514     rm -f $DIR/$tfile
515     touch $DIR/g11 || return 1
516
517     fail mds
518     kill -USR1 $pid
519     wait $pid || return 2
520     [ -e $DIR/$tfile ] && return 3
521     touch $DIR/h11 || return 4
522     return 0
523 }
524 run_test 23 "open(O_CREAT), |X| unlink touch new, replay, close (test mds_cleanup_orphans)"
525
526 test_24() {
527     multiop $DIR/$tfile O_tSc &
528     pid=$!
529     # give multiop a chance to open
530     sleep 1 
531
532     replay_barrier mds
533     fail mds
534     rm -f $DIR/$tfile
535     kill -USR1 $pid
536     wait $pid || return 1
537     [ -e $DIR/$tfile ] && return 2
538     return 0
539 }
540 run_test 24 "open(O_CREAT), replay, unlink, close (test mds_cleanup_orphans)"
541
542 test_25() {
543     multiop $DIR/$tfile O_tSc &
544     pid=$!
545     # give multiop a chance to open
546     sleep 1 
547     rm -f $DIR/$tfile
548
549     replay_barrier mds
550     fail mds
551     kill -USR1 $pid
552     wait $pid || return 1
553     [ -e $DIR/$tfile ] && return 2
554     return 0
555 }
556 run_test 25 "open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
557
558 test_26() {
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     kill -USR1 $pid2
569     wait $pid2 || return 1
570
571     fail mds
572     kill -USR1 $pid1
573     wait $pid1 || return 2
574     [ -e $DIR/$tfile-1 ] && return 3
575     [ -e $DIR/$tfile-2 ] && return 4
576     return 0
577 }
578 run_test 26 "|X| open(O_CREAT), unlink two, close one, replay, close one (test mds_cleanup_orphans)"
579
580 test_27() {
581     replay_barrier mds
582     multiop $DIR/$tfile-1 O_tSc &
583     pid1=$!
584     multiop $DIR/$tfile-2 O_tSc &
585     pid2=$!
586     # give multiop a chance to open
587     sleep 1 
588     rm -f $DIR/$tfile-1
589     rm -f $DIR/$tfile-2
590
591     fail mds
592     kill -USR1 $pid1
593     wait $pid1 || return 1
594     kill -USR1 $pid2
595     wait $pid2 || return 2
596     [ -e $DIR/$tfile-1 ] && return 3
597     [ -e $DIR/$tfile-2 ] && return 4
598     return 0
599 }
600 run_test 27 "|X| open(O_CREAT), unlink two, replay, close two (test mds_cleanup_orphans)"
601
602 test_28() {
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     kill -USR1 $pid2
613     wait $pid2 || return 1
614
615     fail mds
616     kill -USR1 $pid1
617     wait $pid1 || return 2
618     [ -e $DIR/$tfile-1 ] && return 3
619     [ -e $DIR/$tfile-2 ] && return 4
620     return 0
621 }
622 run_test 28 "open(O_CREAT), |X| unlink two, close one, replay, close one (test mds_cleanup_orphans)"
623
624 test_29() {
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     replay_barrier mds
632     rm -f $DIR/$tfile-1
633     rm -f $DIR/$tfile-2
634
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 29 "open(O_CREAT), |X| unlink two, replay, close two (test mds_cleanup_orphans)"
645
646 test_30() {
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     rm -f $DIR/$tfile-2
655
656     replay_barrier mds
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 30 "open(O_CREAT) two, unlink two, replay, close two (test mds_cleanup_orphans)"
667
668 test_31() {
669     multiop $DIR/$tfile-1 O_tSc &
670     pid1=$!
671     multiop $DIR/$tfile-2 O_tSc &
672     pid2=$!
673     # give multiop a chance to open
674     sleep 1 
675     rm -f $DIR/$tfile-1
676
677     replay_barrier mds
678     rm -f $DIR/$tfile-2
679     fail mds
680     kill -USR1 $pid1
681     wait $pid1 || return 1
682     kill -USR1 $pid2
683     wait $pid2 || return 2
684     [ -e $DIR/$tfile-1 ] && return 3
685     [ -e $DIR/$tfile-2 ] && return 4
686     return 0
687 }
688 run_test 31 "open(O_CREAT) two, unlink one, |X| unlink one, close two (test mds_cleanup_orphans)"
689
690 # tests for bug 2104; completion without crashing is success.  The close is
691 # stale, but we always return 0 for close, so the app never sees it.
692 test_32() {
693     multiop $DIR/$tfile O_c &
694     pid1=$!
695     multiop $DIR/$tfile O_c &
696     pid2=$!
697     # give multiop a chance to open
698     sleep 1
699     mds_evict_client
700     df $MOUNT || sleep 1 && df $MOUNT || return 1
701     kill -USR1 $pid1
702     kill -USR1 $pid2
703     sleep 1
704     return 0
705 }
706 run_test 32 "close() notices client eviction; close() after client eviction"
707
708 # Abort recovery before client complete
709 test_33() {
710     replay_barrier mds
711     touch $DIR/$tfile
712     fail_abort mds
713     # this file should be gone, because the replay was aborted
714     $CHECKSTAT -t file $DIR/$tfile && return 3
715     return 0
716 }
717 run_test 33 "abort recovery before client does replay"
718
719 test_34() {
720     multiop $DIR/$tfile O_c &
721     pid=$!
722     # give multiop a chance to open
723     sleep 1 
724     rm -f $DIR/$tfile
725
726     replay_barrier mds
727     fail_abort mds
728     kill -USR1 $pid
729     [ -e $DIR/$tfile ] && return 1
730     sync
731     return 0
732 }
733 run_test 34 "abort recovery before client does replay (test mds_cleanup_orphans)"
734
735 # bug 2278 - generate one orphan on OST, then destroy it during recovery from llog 
736 test_35() {
737     touch $DIR/$tfile
738
739 #define OBD_FAIL_MDS_REINT_NET_REP       0x119
740     do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
741     rm -f $DIR/$tfile &
742     sleep 1
743     sync
744     sleep 1
745     # give a chance to remove from MDS
746     fail_abort mds
747     $CHECKSTAT -t file $DIR/$tfile && return 1 || true
748 }
749 run_test 35 "test recovery from llog for unlink op"
750
751 # b=2432 resent cancel after replay uses wrong cookie,
752 # so don't resend cancels
753 test_36() {
754     replay_barrier mds
755     touch $DIR/$tfile
756     checkstat $DIR/$tfile
757     facet_failover mds
758     cancel_lru_locks mdc
759     if dmesg | grep "unknown lock cookie"; then 
760         echo "cancel after replay failed"
761         return 1
762     fi
763 }
764 run_test 36 "don't resend cancel"
765
766 # b=2368
767 # directory orphans can't be unlinked from PENDING directory
768 test_37() {
769     rmdir $DIR/$tfile 2>/dev/null
770     multiop $DIR/$tfile dD_c &
771     pid=$!
772     # give multiop a chance to open
773     sleep 1 
774     rmdir $DIR/$tfile
775
776     replay_barrier mds
777     # clear the dmesg buffer so we only see errors from this recovery
778     dmesg -c >/dev/null
779     fail_abort mds
780     kill -USR1 $pid
781     dmesg | grep  "mds_unlink_orphan.*error .* unlinking orphan" && return 1
782     sync
783     return 0
784 }
785 run_test 37 "abort recovery before client does replay (test mds_cleanup_orphans for directories)"
786
787 test_38() {
788     createmany -o $DIR/$tfile-%d 800
789     unlinkmany $DIR/$tfile-%d 0 400
790     replay_barrier mds
791     fail mds
792     unlinkmany $DIR/$tfile-%d 400 400
793     sleep 2
794     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
795 }
796 run_test 38 "test recovery from unlink llog (test llog_gen_rec) "
797
798 test_39() { # bug 4176
799     createmany -o $DIR/$tfile-%d 800
800     replay_barrier mds
801     unlinkmany $DIR/$tfile-%d 0 400
802     fail mds
803     unlinkmany $DIR/$tfile-%d 400 400
804     sleep 2
805     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
806 }
807 run_test 39 "test recovery from unlink llog (test llog_gen_rec) "
808
809 count_ost_writes() {
810     awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }' $LPROC/osc/*/stats
811 }
812
813 #b=2477,2532
814 test_40(){
815     $LCTL mark multiop $MOUNT/$tfile OS_c 
816     multiop $MOUNT/$tfile OS_c  &
817     PID=$!
818     writeme -s $MOUNT/${tfile}-2 &
819     WRITE_PID=$!
820     sleep 1
821     facet_failover mds
822 #define OBD_FAIL_MDS_CONNECT_NET         0x117
823     do_facet mds "sysctl -w lustre.fail_loc=0x80000117"
824     kill -USR1 $PID
825     stat1=`count_ost_writes`
826     sleep $TIMEOUT
827     stat2=`count_ost_writes`
828     echo "$stat1, $stat2"
829     if [ $stat1 -lt $stat2 ]; then 
830        echo "writes continuing during recovery"
831        RC=0
832     else
833        echo "writes not continuing during recovery, bug 2477"
834        RC=4
835     fi
836     echo "waiting for writeme $WRITE_PID"
837     kill $WRITE_PID
838     wait $WRITE_PID 
839
840     echo "waiting for multiop $PID"
841     wait $PID || return 2
842     do_facet client munlink $MOUNT/$tfile  || return 3
843     do_facet client munlink $MOUNT/${tfile}-2  || return 3
844     return $RC
845 }
846 run_test 40 "cause recovery in ptlrpc, ensure IO continues"
847
848
849 #b=2814
850 # make sure that a read to one osc doesn't try to double-unlock its page just
851 # because another osc is invalid.  trigger_group_io used to mistakenly return
852 # an error if any oscs were invalid even after having successfully put rpcs
853 # on valid oscs.  This was fatal if the caller was ll_readpage who unlocked
854 # the page, guarnateeing that the unlock from the RPC completion would
855 # assert on trying to unlock the unlocked page.
856 test_41() {
857     local f=$MOUNT/$tfile
858     # make sure the start of the file is ost1
859     lfs setstripe $f $((128 * 1024)) 0 0 
860     do_facet client dd if=/dev/zero of=$f bs=4k count=1 || return 3
861     cancel_lru_locks osc
862     # fail ost2 and read from ost1
863     local osc2dev=`grep ${ost2_svc}lustre-clilov-osc- $LPROC/devices | awk '{print $1}'`
864     [ "$osc2dev" ] || return 4
865     $LCTL --device $osc2dev deactivate || return 1
866     do_facet client dd if=$f of=/dev/null bs=4k count=1 || return 3
867     $LCTL --device $osc2dev activate || return 2
868     return 0
869 }
870 run_test 41 "read from a valid osc while other oscs are invalid"
871
872 # test MDS recovery after ost failure
873 test_42() {
874     blocks=`df -P $MOUNT | tail -n 1 | awk '{ print $2 }'`
875     createmany -o $DIR/$tfile-%d 800
876     replay_barrier ost1
877     unlinkmany $DIR/$tfile-%d 0 400
878     DEBUG42=`sysctl -n lnet.debug`
879     sysctl -w lnet.debug=-1
880     facet_failover ost1
881     
882     # osc is evicted, fs is smaller (but only with failout OSTs (bug 7287)
883     #blocks_after=`df -P $MOUNT | tail -n 1 | awk '{ print $2 }'`
884     #[ $blocks_after -lt $blocks ] || return 1
885     echo wait for MDS to timeout and recover
886     sleep $((TIMEOUT * 2))
887     sysctl -w lnet.debug=$DEBUG42
888     unlinkmany $DIR/$tfile-%d 400 400
889     $CHECKSTAT -t file $DIR/$tfile-* && return 2 || true
890 }
891 run_test 42 "recovery after ost failure"
892
893 # timeout in MDS/OST recovery RPC will LBUG MDS
894 test_43() { # bug 2530
895     replay_barrier mds
896
897     # OBD_FAIL_OST_CREATE_NET 0x204
898     do_facet ost1 "sysctl -w lustre.fail_loc=0x80000204"
899     fail mds
900     sleep 10
901     do_facet ost1 "sysctl -w lustre.fail_loc=0"
902
903     return 0
904 }
905 run_test 43 "mds osc import failure during recovery; don't LBUG"
906
907 test_44() {
908     mdcdev=`awk '/-mdc-/ {print $1}' $LPROC/devices`
909     [ "$mdcdev" ] || exit 2
910     for i in `seq 1 10`; do
911         #define OBD_FAIL_TGT_CONN_RACE     0x701
912         do_facet mds "sysctl -w lustre.fail_loc=0x80000701"
913         $LCTL --device $mdcdev recover
914         df $MOUNT
915     done
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 test_44b() {
922     mdcdev=`awk '/-mdc-/ {print $1}' $LPROC/devices`
923     [ "$mdcdev" ] || exit 2
924     for i in `seq 1 10`; do
925         #define OBD_FAIL_TGT_DELAY_RECONNECT 0x704
926         do_facet mds "sysctl -w lustre.fail_loc=0x80000704"
927         $LCTL --device $mdcdev recover
928         df $MOUNT
929     done
930     do_facet mds "sysctl -w lustre.fail_loc=0"
931     return 0
932 }
933 run_test 44b "race in target handle connect"
934
935 # Handle failed close
936 test_45() {
937     mdcdev=`awk '/-mdc-/ {print $1}' $LPROC/devices`
938     [ "$mdcdev" ] || exit 2
939     $LCTL --device $mdcdev recover
940
941     multiop $DIR/$tfile O_c &
942     pid=$!
943     sleep 1
944
945     # This will cause the CLOSE to fail before even 
946     # allocating a reply buffer
947     $LCTL --device $mdcdev deactivate || return 4
948
949     # try the close
950     kill -USR1 $pid
951     wait $pid || return 1
952
953     $LCTL --device $mdcdev activate || return 5
954     sleep 1
955
956     $CHECKSTAT -t file $DIR/$tfile || return 2
957     return 0
958 }
959 run_test 45 "Handle failed close"
960
961 test_46() {
962     dmesg -c >/dev/null
963     drop_reply "touch $DIR/$tfile"
964     fail mds
965     # ironically, the previous test, 45, will cause a real forced close,
966     # so just look for one for this test
967     dmesg | grep -i "force closing client file handle for $tfile" && return 1
968     return 0
969 }
970 run_test 46 "Don't leak file handle after open resend (3325)"
971
972 test_47() { # bug 2824
973     # create some files to make sure precreate has been done on all 
974     # OSTs. (just in case this test is run independently)
975     createmany -o $DIR/$tfile 20  || return 1
976
977     # OBD_FAIL_OST_CREATE_NET 0x204
978     fail ost1
979     do_facet ost1 "sysctl -w lustre.fail_loc=0x80000204"
980     df $MOUNT || return 2
981
982     # let the MDS discover the OST failure, attempt to recover, fail
983     # and recover again.  
984     sleep $((3 * TIMEOUT))
985
986     # Without 2824, this createmany would hang 
987     createmany -o $DIR/$tfile 20 || return 3
988     unlinkmany $DIR/$tfile 20 || return 4
989
990     do_facet ost1 "sysctl -w lustre.fail_loc=0"
991     return 0
992 }
993 run_test 47 "MDS->OSC failure during precreate cleanup (2824)"
994
995 test_48() {
996     replay_barrier mds
997     createmany -o $DIR/$tfile 20  || return 1
998     # OBD_FAIL_OST_EROFS 0x216
999     fail mds
1000     do_facet ost1 "sysctl -w lustre.fail_loc=0x80000216"
1001     df $MOUNT || return 2
1002
1003     createmany -o $DIR/$tfile 20 20 || return 2
1004     unlinkmany $DIR/$tfile 40 || return 3
1005
1006     do_facet ost1 "sysctl -w lustre.fail_loc=0"
1007     return 0
1008 }
1009 run_test 48 "MDS->OSC failure during precreate cleanup (2824)"
1010
1011 test_50() {
1012     local oscdev=`grep ${ost1_svc}lustre-clilov-osc- $LPROC/devices | awk '{print $1}'`
1013     [ "$oscdev" ] || return 1
1014     $LCTL --device $oscdev recover &&  $LCTL --device $oscdev recover
1015     # give the mds_lov_sync threads a chance to run
1016     sleep 5
1017 }
1018 run_test 50 "Double OSC recovery, don't LASSERT (3812)"
1019
1020 # b3764 timed out lock replay
1021 test_52() {
1022     touch $DIR/$tfile
1023     cancel_lru_locks mdc
1024
1025     multiop $DIR/$tfile s
1026     replay_barrier mds
1027     do_facet mds "sysctl -w lustre.fail_loc=0x8000030c"
1028     fail mds
1029     do_facet mds "sysctl -w lustre.fail_loc=0x0"
1030
1031     $CHECKSTAT -t file $DIR/$tfile-* && return 3 || true
1032 }
1033 run_test 52 "time out lock replay (3764)"
1034
1035 #b_cray 53 "|X| open request and close reply while two MDC requests in flight"
1036 #b_cray 54 "|X| open request and close reply while two MDC requests in flight"
1037
1038 #b3761 ASSERTION(hash != 0) failed
1039 test_55() {
1040 # OBD_FAIL_MDS_OPEN_CREATE | OBD_FAIL_ONCE
1041     do_facet mds "sysctl -w lustre.fail_loc=0x8000012b"
1042     touch $DIR/$tfile &
1043     # give touch a chance to run
1044     sleep 5
1045     do_facet mds "sysctl -w lustre.fail_loc=0x0"
1046     rm $DIR/$tfile
1047     return 0
1048 }
1049 run_test 55 "let MDS_CHECK_RESENT return the original return code instead of 0"
1050
1051 #b3440 ASSERTION(rec->ur_fid2->id) failed
1052 test_56() {
1053     ln -s foo $DIR/$tfile
1054     replay_barrier mds
1055     #drop_reply "cat $DIR/$tfile"
1056     fail mds
1057     sleep 10
1058 }
1059 run_test 56 "don't replay a symlink open request (3440)"
1060
1061 #recovery one mds-ost setattr from llog
1062 test_57() {
1063 #define OBD_FAIL_MDS_OST_SETATTR       0x12c
1064     do_facet mds "sysctl -w lustre.fail_loc=0x8000012c"
1065     touch $DIR/$tfile
1066     replay_barrier mds
1067     fail mds
1068     sleep 1
1069     $CHECKSTAT -t file $DIR/$tfile || return 1
1070     do_facet mds "sysctl -w lustre.fail_loc=0x0"
1071     rm $DIR/$tfile
1072 }
1073 run_test 57 "test recovery from llog for setattr op"
1074
1075 #recovery many mds-ost setattr from llog
1076 test_58() {
1077 #define OBD_FAIL_MDS_OST_SETATTR       0x12c
1078     do_facet mds "sysctl -w lustre.fail_loc=0x8000012c"
1079     mkdir $DIR/$tdir
1080     createmany -o $DIR/$tdir/$tfile-%d 2500
1081     replay_barrier mds
1082     fail mds
1083     sleep 2
1084     $CHECKSTAT -t file $DIR/$tdir/$tfile-* || return 1
1085     do_facet mds "sysctl -w lustre.fail_loc=0x0"
1086     unlinkmany $DIR/$tdir/$tfile-%d 2500
1087     rmdir $DIR/$tdir
1088 }
1089 run_test 58 "test recovery from llog for setattr op (test llog_gen_rec)"
1090
1091 equals_msg test complete, cleaning up
1092 $CLEANUP