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