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