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