Whamcloud - gitweb
Branch HEAD
[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     local at_max_saved=0
924
925     mdcdev=`lctl get_param -n devices | awk '/MDT0000-mdc-/ {print $1}'`
926     [ "$mdcdev" ] || exit 2
927
928     # adaptive timeouts slow this way down
929     if at_is_valid && at_is_enabled; then
930         at_max_saved=$(at_max_get mds)
931         at_max_set 40 mds
932     fi
933
934     for i in `seq 1 10`; do
935         echo "$i of 10 ($(date +%s))"
936         do_facet mds "grep service $LPROC/mdt/MDS/mds/timeouts"
937         #define OBD_FAIL_TGT_CONN_RACE     0x701
938         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000701"
939         $LCTL --device $mdcdev recover
940         df $MOUNT
941     done
942     do_facet $SINGLEMDS "lctl set_param fail_loc=0"
943     [ $at_max_saved -ne 0 ] && at_max_set $at_max_saved mds
944     return 0
945 }
946 run_test 44a "race in target handle connect"
947
948 test_44b() {
949     mdcdev=`lctl get_param -n devices | awk '/MDT0000-mdc-/ {print $1}'`
950     [ "$mdcdev" ] || exit 2
951     for i in `seq 1 10`; do
952         echo "$i of 10 ($(date +%s))"
953         do_facet mds "grep service $LPROC/mdt/MDS/mds/timeouts"
954         #define OBD_FAIL_TGT_DELAY_RECONNECT 0x704
955         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000704"
956         $LCTL --device $mdcdev recover
957         df $MOUNT
958     done
959     do_facet $SINGLEMDS "lctl set_param fail_loc=0"
960     return 0
961 }
962 run_test 44b "race in target handle connect"
963
964 # Handle failed close
965 test_45() {
966     mdcdev=`lctl get_param -n devices | awk '/MDT0000-mdc-/ {print $1}'`
967     [ "$mdcdev" ] || exit 2
968     $LCTL --device $mdcdev recover
969
970     multiop_bg_pause $DIR/$tfile O_c || return 1
971     pid=$!
972
973     # This will cause the CLOSE to fail before even
974     # allocating a reply buffer
975     $LCTL --device $mdcdev deactivate || return 4
976
977     # try the close
978     kill -USR1 $pid
979     wait $pid || return 1
980
981     $LCTL --device $mdcdev activate || return 5
982     sleep 1
983
984     $CHECKSTAT -t file $DIR/$tfile || return 2
985     return 0
986 }
987 run_test 45 "Handle failed close"
988
989 test_46() {
990     dmesg -c >/dev/null
991     drop_reply "touch $DIR/$tfile"
992     fail $SINGLEMDS
993     # ironically, the previous test, 45, will cause a real forced close,
994     # so just look for one for this test
995     dmesg | grep -i "force closing client file handle for $tfile" && return 1
996     return 0
997 }
998 run_test 46 "Don't leak file handle after open resend (3325)"
999
1000 test_47() { # bug 2824
1001     # create some files to make sure precreate has been done on all
1002     # OSTs. (just in case this test is run independently)
1003     createmany -o $DIR/$tfile 20  || return 1
1004
1005     # OBD_FAIL_OST_CREATE_NET 0x204
1006     fail ost1
1007     do_facet ost1 "lctl set_param fail_loc=0x80000204"
1008     df $MOUNT || return 2
1009
1010     # let the MDS discover the OST failure, attempt to recover, fail
1011     # and recover again.
1012     sleep $((3 * TIMEOUT))
1013
1014     # Without 2824, this createmany would hang
1015     createmany -o $DIR/$tfile 20 || return 3
1016     unlinkmany $DIR/$tfile 20 || return 4
1017
1018     do_facet ost1 "lctl set_param fail_loc=0"
1019     return 0
1020 }
1021 run_test 47 "MDS->OSC failure during precreate cleanup (2824)"
1022
1023 test_48() {
1024     replay_barrier $SINGLEMDS
1025     createmany -o $DIR/$tfile 20  || return 1
1026     # OBD_FAIL_OST_EROFS 0x216
1027     fail $SINGLEMDS
1028     do_facet ost1 "lctl set_param fail_loc=0x80000216"
1029     df $MOUNT || return 2
1030
1031     createmany -o $DIR/$tfile 20 20 || return 2
1032     unlinkmany $DIR/$tfile 40 || return 3
1033
1034     do_facet ost1 "lctl set_param fail_loc=0"
1035     return 0
1036 }
1037 run_test 48 "MDS->OSC failure during precreate cleanup (2824)"
1038
1039 test_50() {
1040     local oscdev=`do_facet $SINGLEMDS lctl get_param -n devices | grep ${ost1_svc}-osc-MDT0000 | awk '{print $1}'`
1041     [ "$oscdev" ] || return 1
1042     do_facet $SINGLEMDS $LCTL --device $oscdev recover || return 2
1043     do_facet $SINGLEMDS $LCTL --device $oscdev recover || return 3
1044     # give the mds_lov_sync threads a chance to run
1045     sleep 5
1046 }
1047 run_test 50 "Double OSC recovery, don't LASSERT (3812)"
1048
1049 # b3764 timed out lock replay
1050 test_52() {
1051     touch $DIR/$tfile
1052     cancel_lru_locks mdc
1053
1054     multiop $DIR/$tfile s || return 1
1055     replay_barrier $SINGLEMDS
1056 #define OBD_FAIL_LDLM_REPLY              0x30c
1057     do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000030c"
1058     fail $SINGLEMDS || return 2
1059     do_facet $SINGLEMDS "lctl set_param fail_loc=0x0"
1060
1061     $CHECKSTAT -t file $DIR/$tfile-* && return 3 || true
1062 }
1063 run_test 52 "time out lock replay (3764)"
1064
1065 # bug 3462 - simultaneous MDC requests
1066 test_53a() {
1067         mkdir -p $DIR/${tdir}-1
1068         mkdir -p $DIR/${tdir}-2
1069         multiop $DIR/${tdir}-1/f O_c &
1070         close_pid=$!
1071         # give multiop a change to open
1072         sleep 1
1073
1074         #define OBD_FAIL_MDS_CLOSE_NET 0x115
1075         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000115"
1076         kill -USR1 $close_pid
1077         cancel_lru_locks mdc    # force the close
1078         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
1079
1080         mcreate $DIR/${tdir}-2/f || return 1
1081
1082         # close should still be here
1083         [ -d /proc/$close_pid ] || return 2
1084
1085         replay_barrier_nodf $SINGLEMDS
1086         fail $SINGLEMDS
1087         wait $close_pid || return 3
1088
1089         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 4
1090         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 5
1091         rm -rf $DIR/${tdir}-*
1092 }
1093 run_test 53a "|X| close request while two MDC requests in flight"
1094
1095 test_53b() {
1096         mkdir -p $DIR/${tdir}-1
1097         mkdir -p $DIR/${tdir}-2
1098         multiop $DIR/${tdir}-1/f O_c &
1099         close_pid=$!
1100
1101         #define OBD_FAIL_MDS_REINT_NET 0x107
1102         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000107"
1103         mcreate $DIR/${tdir}-2/f &
1104         open_pid=$!
1105         sleep 1
1106
1107         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
1108         kill -USR1 $close_pid
1109         cancel_lru_locks mdc    # force the close
1110         wait $close_pid || return 1
1111         # open should still be here
1112         [ -d /proc/$open_pid ] || return 2
1113
1114         replay_barrier_nodf $SINGLEMDS
1115         fail $SINGLEMDS
1116         wait $open_pid || return 3
1117
1118         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 4
1119         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 5
1120         rm -rf $DIR/${tdir}-*
1121 }
1122 run_test 53b "|X| open request while two MDC requests in flight"
1123
1124 test_53c() {
1125         mkdir -p $DIR/${tdir}-1
1126         mkdir -p $DIR/${tdir}-2
1127         multiop $DIR/${tdir}-1/f O_c &
1128         close_pid=$!
1129
1130         #define OBD_FAIL_MDS_REINT_NET 0x107
1131         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000107"
1132         mcreate $DIR/${tdir}-2/f &
1133         open_pid=$!
1134         sleep 1
1135
1136         #define OBD_FAIL_MDS_CLOSE_NET 0x115
1137         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000115"
1138         kill -USR1 $close_pid
1139         cancel_lru_locks mdc    # force the close
1140
1141         replay_barrier_nodf $SINGLEMDS
1142         fail_nodf $SINGLEMDS
1143         wait $open_pid || return 1
1144         sleep 2
1145         # close should be gone
1146         [ -d /proc/$close_pid ] && return 2
1147         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
1148
1149         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1150         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 4
1151         rm -rf $DIR/${tdir}-*
1152 }
1153 run_test 53c "|X| open request and close request while two MDC requests in flight"
1154
1155 test_53d() {
1156         mkdir -p $DIR/${tdir}-1
1157         mkdir -p $DIR/${tdir}-2
1158         multiop $DIR/${tdir}-1/f O_c &
1159         close_pid=$!
1160         # give multiop a chance to open
1161         sleep 1
1162
1163         #define OBD_FAIL_MDS_CLOSE_NET_REP 0x13f
1164         do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000013f"
1165         kill -USR1 $close_pid
1166         cancel_lru_locks mdc    # force the close
1167         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
1168         mcreate $DIR/${tdir}-2/f || return 1
1169
1170         # close should still be here
1171         [ -d /proc/$close_pid ] || return 2
1172         fail $SINGLEMDS
1173         wait $close_pid || return 3
1174
1175         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 4
1176         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 5
1177         rm -rf $DIR/${tdir}-*
1178 }
1179 run_test 53d "|X| close reply while two MDC requests in flight"
1180
1181 test_53e() {
1182         mkdir -p $DIR/${tdir}-1
1183         mkdir -p $DIR/${tdir}-2
1184         multiop $DIR/${tdir}-1/f O_c &
1185         close_pid=$!
1186
1187         #define OBD_FAIL_MDS_REINT_NET_REP 0x119
1188         do_facet $SINGLEMDS "lctl set_param fail_loc=0x119"
1189         mcreate $DIR/${tdir}-2/f &
1190         open_pid=$!
1191         sleep 1
1192
1193         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
1194         kill -USR1 $close_pid
1195         cancel_lru_locks mdc    # force the close
1196         wait $close_pid || return 1
1197         # open should still be here
1198         [ -d /proc/$open_pid ] || return 2
1199
1200         replay_barrier_nodf $SINGLEMDS
1201         fail $SINGLEMDS
1202         wait $open_pid || return 3
1203
1204         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 4
1205         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 5
1206         rm -rf $DIR/${tdir}-*
1207 }
1208 run_test 53e "|X| open reply while two MDC requests in flight"
1209
1210 test_53f() {
1211         mkdir -p $DIR/${tdir}-1
1212         mkdir -p $DIR/${tdir}-2
1213         multiop $DIR/${tdir}-1/f O_c &
1214         close_pid=$!
1215
1216         #define OBD_FAIL_MDS_REINT_NET_REP 0x119
1217         do_facet $SINGLEMDS "lctl set_param fail_loc=0x119"
1218         mcreate $DIR/${tdir}-2/f &
1219         open_pid=$!
1220         sleep 1
1221
1222         #define OBD_FAIL_MDS_CLOSE_NET_REP 0x13f
1223         do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000013f"
1224         kill -USR1 $close_pid
1225         cancel_lru_locks mdc    # force the close
1226
1227         replay_barrier_nodf $SINGLEMDS
1228         fail_nodf $SINGLEMDS
1229         wait $open_pid || return 1
1230         sleep 2
1231         # close should be gone
1232         [ -d /proc/$close_pid ] && return 2
1233         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
1234
1235         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1236         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 4
1237         rm -rf $DIR/${tdir}-*
1238 }
1239 run_test 53f "|X| open reply and close reply while two MDC requests in flight"
1240
1241 test_53g() {
1242         mkdir -p $DIR/${tdir}-1
1243         mkdir -p $DIR/${tdir}-2
1244         multiop $DIR/${tdir}-1/f O_c &
1245         close_pid=$!
1246
1247         #define OBD_FAIL_MDS_REINT_NET_REP 0x119
1248         do_facet $SINGLEMDS "lctl set_param fail_loc=0x119"
1249         mcreate $DIR/${tdir}-2/f &
1250         open_pid=$!
1251         sleep 1
1252
1253         #define OBD_FAIL_MDS_CLOSE_NET 0x115
1254         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000115"
1255         kill -USR1 $close_pid
1256         cancel_lru_locks mdc    # force the close
1257
1258         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
1259         replay_barrier_nodf $SINGLEMDS
1260         fail_nodf $SINGLEMDS
1261         wait $open_pid || return 1
1262         sleep 2
1263         # close should be gone
1264         [ -d /proc/$close_pid ] && return 2
1265
1266         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1267         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 4
1268         rm -rf $DIR/${tdir}-*
1269 }
1270 run_test 53g "|X| drop open reply and close request while close and open are both in flight"
1271
1272 test_53h() {
1273         mkdir -p $DIR/${tdir}-1
1274         mkdir -p $DIR/${tdir}-2
1275         multiop $DIR/${tdir}-1/f O_c &
1276         close_pid=$!
1277
1278         #define OBD_FAIL_MDS_REINT_NET 0x107
1279         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000107"
1280         mcreate $DIR/${tdir}-2/f &
1281         open_pid=$!
1282         sleep 1
1283
1284         #define OBD_FAIL_MDS_CLOSE_NET_REP 0x13f
1285         do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000013f"
1286         kill -USR1 $close_pid
1287         cancel_lru_locks mdc    # force the close
1288         sleep 1
1289
1290         replay_barrier_nodf $SINGLEMDS
1291         fail_nodf $SINGLEMDS
1292         wait $open_pid || return 1
1293         sleep 2
1294         # close should be gone
1295         [ -d /proc/$close_pid ] && return 2
1296         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
1297
1298         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1299         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 4
1300         rm -rf $DIR/${tdir}-*
1301 }
1302 run_test 53h "|X| open request and close reply while two MDC requests in flight"
1303
1304 #b_cray 54 "|X| open request and close reply while two MDC requests in flight"
1305
1306 #b3761 ASSERTION(hash != 0) failed
1307 test_55() {
1308 # OBD_FAIL_MDS_OPEN_CREATE | OBD_FAIL_ONCE
1309     do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000012b"
1310     touch $DIR/$tfile &
1311     # give touch a chance to run
1312     sleep 5
1313     do_facet $SINGLEMDS "lctl set_param fail_loc=0x0"
1314     rm $DIR/$tfile
1315     return 0
1316 }
1317 run_test 55 "let MDS_CHECK_RESENT return the original return code instead of 0"
1318
1319 #b3440 ASSERTION(rec->ur_fid2->id) failed
1320 test_56() {
1321     ln -s foo $DIR/$tfile
1322     replay_barrier $SINGLEMDS
1323     #drop_reply "cat $DIR/$tfile"
1324     fail $SINGLEMDS
1325     sleep 10
1326 }
1327 run_test 56 "don't replay a symlink open request (3440)"
1328
1329 #recovery one mds-ost setattr from llog
1330 test_57() {
1331 #define OBD_FAIL_MDS_OST_SETATTR       0x12c
1332     do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000012c"
1333     touch $DIR/$tfile
1334     replay_barrier $SINGLEMDS
1335     fail $SINGLEMDS
1336     sleep 1
1337     $CHECKSTAT -t file $DIR/$tfile || return 1
1338     do_facet $SINGLEMDS "lctl set_param fail_loc=0x0"
1339     rm $DIR/$tfile
1340 }
1341 run_test 57 "test recovery from llog for setattr op"
1342
1343 #recovery many mds-ost setattr from llog
1344 test_58() {
1345     mkdir -p $DIR/$tdir
1346 #define OBD_FAIL_MDS_OST_SETATTR       0x12c
1347     do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000012c"
1348     createmany -o $DIR/$tdir/$tfile-%d 2500
1349     replay_barrier $SINGLEMDS
1350     fail $SINGLEMDS
1351     sleep 2
1352     $CHECKSTAT -t file $DIR/$tdir/$tfile-* >/dev/null || return 1
1353     do_facet $SINGLEMDS "lctl set_param fail_loc=0x0"
1354     unlinkmany $DIR/$tdir/$tfile-%d 2500
1355     rmdir $DIR/$tdir
1356 }
1357 run_test 58 "test recovery from llog for setattr op (test llog_gen_rec)"
1358
1359 # log_commit_thread vs filter_destroy race used to lead to import use after free
1360 # bug 11658
1361 test_59() {
1362     mkdir -p $DIR/$tdir
1363     createmany -o $DIR/$tdir/$tfile-%d 200
1364     sync
1365     unlinkmany $DIR/$tdir/$tfile-%d 200
1366 #define OBD_FAIL_PTLRPC_DELAY_RECOV       0x507
1367     do_facet ost1 "lctl set_param fail_loc=0x507"
1368     fail ost1
1369     fail $SINGLEMDS
1370     do_facet ost1 "lctl set_param fail_loc=0x0"
1371     sleep 20
1372     rmdir $DIR/$tdir
1373 }
1374 run_test 59 "test log_commit_thread vs filter_destroy race"
1375
1376 # race between add unlink llog vs cat log init in post_recovery (only for b1_6)
1377 # bug 12086: should no oops and No ctxt error for this test
1378 test_60() {
1379     mkdir -p $DIR/$tdir
1380     createmany -o $DIR/$tdir/$tfile-%d 200
1381     replay_barrier $SINGLEMDS
1382     unlinkmany $DIR/$tdir/$tfile-%d 0 100
1383     fail $SINGLEMDS
1384     unlinkmany $DIR/$tdir/$tfile-%d 100 100
1385     local no_ctxt=`dmesg | grep "No ctxt"`
1386     [ -z "$no_ctxt" ] || error "ctxt is not initialized in recovery"
1387 }
1388 run_test 60 "test llog post recovery init vs llog unlink"
1389
1390 #test race  llog recovery thread vs llog cleanup
1391 test_61a() {    # was test_61
1392     mkdir $DIR/$tdir
1393     createmany -o $DIR/$tdir/$tfile-%d 800
1394     replay_barrier ost1 
1395 #   OBD_FAIL_OST_LLOG_RECOVERY_TIMEOUT 0x221 
1396     unlinkmany $DIR/$tdir/$tfile-%d 800 
1397     set_nodes_failloc "$(osts_nodes)" 0x80000221
1398     facet_failover ost1
1399     sleep 10 
1400     fail ost1
1401     sleep 30
1402     set_nodes_failloc "$(osts_nodes)" 0x0
1403     
1404     $CHECKSTAT -t file $DIR/$tdir/$tfile-* && return 1
1405     rmdir $DIR/$tdir
1406 }
1407 run_test 61a "test race llog recovery vs llog cleanup"
1408
1409 #test race  mds llog sync vs llog cleanup
1410 test_61b() {
1411 #   OBD_FAIL_MDS_LLOG_SYNC_TIMEOUT 0x140
1412     do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000140"
1413     facet_failover $SINGLEMDS 
1414     sleep 10
1415     fail $SINGLEMDS
1416     do_facet client dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 || return 1
1417 }
1418 run_test 61b "test race mds llog sync vs llog cleanup"
1419
1420 #test race  cancel cookie cb vs llog cleanup
1421 test_61c() {
1422 #   OBD_FAIL_OST_CANCEL_COOKIE_TIMEOUT 0x222 
1423     touch $DIR/$tfile 
1424     set_nodes_failloc "$(osts_nodes)" 0x80000222
1425     rm $DIR/$tfile    
1426     sleep 10
1427     fail ost1
1428     set_nodes_failloc "$(osts_nodes)" 0x0
1429 }
1430 run_test 61c "test race mds llog sync vs llog cleanup"
1431
1432 test_62() { # Bug 15756 - don't mis-drop resent replay
1433     mkdir -p $DIR/$tdir
1434     replay_barrier $SINGLEMDS
1435     createmany -o $DIR/$tdir/$tfile- 25
1436 #define OBD_FAIL_TGT_REPLAY_DROP         0x706
1437     do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000707"
1438     facet_failover $SINGLEMDS
1439     df $MOUNT || return 1
1440     do_facet $SINGLEMDS "lctl set_param fail_loc=0"
1441     unlinkmany $DIR/$tdir/$tfile- 25 || return 2
1442     return 0
1443 }
1444 run_test 62 "don't mis-drop resent replay"
1445
1446 #Adaptive Timeouts (bug 3055)
1447 AT_MAX_SET=0
1448
1449 at_start()
1450 {
1451     if ! at_is_valid; then
1452         skip "AT env is invalid"
1453         return 1
1454     fi
1455
1456     if ! at_is_enabled; then
1457         echo "AT is disabled, enable it by force temporarily"
1458         at_max_set 600 mds ost client
1459         AT_MAX_SET=1
1460     fi
1461
1462     if [ -z "$ATOLDBASE" ]; then
1463         local at_history=$(do_facet mds "find /sys/ -name at_history")
1464         [ -z "$at_history" ] && skip "missing /sys/.../at_history " && return 1
1465         ATOLDBASE=$(do_facet mds "cat $at_history")
1466         # speed up the timebase so we can check decreasing AT
1467         do_facet mds "echo 8 >> $at_history"
1468         do_facet ost1 "echo 8 >> $at_history"
1469     fi
1470 }
1471
1472 test_65a() #bug 3055
1473 {
1474     at_start || return 0
1475     $LCTL dk > /dev/null
1476     debugsave
1477     sysctl -w lnet.debug="+other"
1478     # slow down a request
1479     do_facet mds sysctl -w lustre.fail_val=30000
1480 #define OBD_FAIL_PTLRPC_PAUSE_REQ        0x50a
1481     do_facet mds sysctl -w lustre.fail_loc=0x8000050a
1482     createmany -o $DIR/$tfile 10 > /dev/null
1483     unlinkmany $DIR/$tfile 10 > /dev/null
1484     # check for log message
1485     $LCTL dk | grep "Early reply #" || error "No early reply"
1486     debugrestore
1487     # client should show 30s estimates
1488     grep portal $LPROC/mdc/${FSNAME}-MDT0000-mdc-*/timeouts
1489     sleep 9
1490     grep portal $LPROC/mdc/${FSNAME}-MDT0000-mdc-*/timeouts
1491 }
1492 run_test 65a "AT: verify early replies"
1493
1494 test_65b() #bug 3055
1495 {
1496     at_start || return 0
1497     # turn on D_ADAPTTO
1498     debugsave
1499     sysctl -w lnet.debug="other trace"
1500     $LCTL dk > /dev/null
1501     # slow down bulk i/o
1502     do_facet ost1 sysctl -w lustre.fail_val=30
1503 #define OBD_FAIL_OST_BRW_PAUSE_PACK      0x224
1504     do_facet ost1 sysctl -w lustre.fail_loc=0x224
1505
1506     rm -f $DIR/$tfile
1507     lfs setstripe $DIR/$tfile --index=0 --count=1
1508     # force some real bulk transfer
1509     multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
1510
1511     do_facet ost1 sysctl -w lustre.fail_loc=0
1512     # check for log message
1513     $LCTL dk | grep "Early reply #" || error "No early reply"
1514     debugrestore
1515     # client should show 30s estimates
1516     grep portal $LPROC/osc/${FSNAME}-OST0000-osc-*/timeouts
1517 }
1518 run_test 65b "AT: verify early replies on packed reply / bulk"
1519
1520 test_66a() #bug 3055
1521 {
1522     at_start || return 0
1523     grep "portal 12" $LPROC/mdc/${FSNAME}-MDT0000-mdc-*/timeouts
1524     # adjust 5s at a time so no early reply is sent (within deadline)
1525     do_facet mds "sysctl -w lustre.fail_val=5000"
1526 #define OBD_FAIL_PTLRPC_PAUSE_REQ        0x50a
1527     do_facet mds "sysctl -w lustre.fail_loc=0x8000050a"
1528     createmany -o $DIR/$tfile 20 > /dev/null
1529     unlinkmany $DIR/$tfile 20 > /dev/null
1530     grep "portal 12" $LPROC/mdc/${FSNAME}-MDT0000-mdc-*/timeouts
1531     do_facet mds "sysctl -w lustre.fail_val=10000"
1532     do_facet mds "sysctl -w lustre.fail_loc=0x8000050a"
1533     createmany -o $DIR/$tfile 20 > /dev/null
1534     unlinkmany $DIR/$tfile 20 > /dev/null
1535     grep "portal 12" $LPROC/mdc/${FSNAME}-MDT0000-mdc-*/timeouts
1536     do_facet mds "sysctl -w lustre.fail_loc=0"
1537     sleep 9
1538     createmany -o $DIR/$tfile 20 > /dev/null
1539     unlinkmany $DIR/$tfile 20 > /dev/null
1540     grep portal $LPROC/mdc/${FSNAME}-MDT0000-mdc-*/timeouts | grep "portal 12"
1541     CUR=$(awk '/portal 12/ {print $5}' $LPROC/mdc/${FSNAME}-MDT0000-mdc-*/timeouts)
1542     WORST=$(awk '/portal 12/ {print $7}' $LPROC/mdc/${FSNAME}-MDT0000-mdc-*/timeouts)
1543     echo "Current MDT timeout $CUR, worst $WORST"
1544     [ $CUR -lt $WORST ] || error "Current $CUR should be less than worst $WORST"
1545 }
1546 run_test 66a "AT: verify MDT service time adjusts with no early replies"
1547
1548 test_66b() #bug 3055
1549 {
1550     at_start || return 0
1551     ORIG=$(awk '/network/ {print $4}' $LPROC/mdc/lustre-*/timeouts)
1552     sysctl -w lustre.fail_val=$(($ORIG + 5))
1553 #define OBD_FAIL_PTLRPC_PAUSE_REP      0x50c
1554     sysctl -w lustre.fail_loc=0x50c
1555     ls $DIR/$tfile > /dev/null 2>&1
1556     sysctl -w lustre.fail_loc=0
1557     CUR=$(awk '/network/ {print $4}' $LPROC/mdc/${FSNAME}-*/timeouts)
1558     WORST=$(awk '/network/ {print $6}' $LPROC/mdc/${FSNAME}-*/timeouts)
1559     echo "network timeout orig $ORIG, cur $CUR, worst $WORST"
1560     [ $WORST -gt $ORIG ] || error "Worst $WORST should be worse than orig $ORIG"
1561 }
1562 run_test 66b "AT: verify net latency adjusts"
1563
1564 test_67a() #bug 3055
1565 {
1566     at_start || return 0
1567     CONN1=$(awk '/_connect/ {total+=$2} END {print total}' $LPROC/osc/*/stats)
1568     # sleeping threads may drive values above this
1569     do_facet ost1 "sysctl -w lustre.fail_val=400"
1570 #define OBD_FAIL_PTLRPC_PAUSE_REQ    0x50a
1571     do_facet ost1 "sysctl -w lustre.fail_loc=0x50a"
1572     createmany -o $DIR/$tfile 20 > /dev/null
1573     unlinkmany $DIR/$tfile 20 > /dev/null
1574     do_facet ost1 "sysctl -w lustre.fail_loc=0"
1575     CONN2=$(awk '/_connect/ {total+=$2} END {print total}' $LPROC/osc/*/stats)
1576     ATTEMPTS=$(($CONN2 - $CONN1))
1577     echo "$ATTEMPTS osc reconnect attemps on gradual slow"
1578     [ $ATTEMPTS -gt 0 ] && error_ignore 13721 "AT should have prevented reconnect"
1579     return 0
1580 }
1581 run_test 67a "AT: verify slow request processing doesn't induce reconnects"
1582
1583 test_67b() #bug 3055
1584 {
1585     at_start || return 0
1586     CONN1=$(awk '/_connect/ {total+=$2} END {print total}' $LPROC/osc/*/stats)
1587 #define OBD_FAIL_OST_PAUSE_CREATE        0x223
1588     do_facet ost1 "sysctl -w lustre.fail_val=20000"
1589     do_facet ost1 "sysctl -w lustre.fail_loc=0x80000223"
1590     cp /etc/profile $DIR/$tfile || error "cp failed"
1591     client_reconnect
1592     cat $LPROC/ost/OSS/ost_create/timeouts
1593     log "phase 2"
1594     CONN2=$(awk '/_connect/ {total+=$2} END {print total}' $LPROC/osc/*/stats)
1595     ATTEMPTS=$(($CONN2 - $CONN1))
1596     echo "$ATTEMPTS osc reconnect attemps on instant slow"
1597     # do it again; should not timeout
1598     do_facet ost1 "sysctl -w lustre.fail_loc=0x80000223"
1599     cp /etc/profile $DIR/$tfile || error "cp failed"
1600     do_facet ost1 "sysctl -w lustre.fail_loc=0"
1601     client_reconnect
1602     cat $LPROC/ost/OSS/ost_create/timeouts
1603     CONN3=$(awk '/_connect/ {total+=$2} END {print total}' $LPROC/osc/*/stats)
1604     ATTEMPTS=$(($CONN3 - $CONN2))
1605     echo "$ATTEMPTS osc reconnect attemps on 2nd slow"
1606     [ $ATTEMPTS -gt 0 ] && error "AT should have prevented reconnect"
1607     return 0
1608 }
1609 run_test 67b "AT: verify instant slowdown doesn't induce reconnects"
1610
1611 test_68 () #bug 13813
1612 {
1613     at_start || return 0
1614     local ldlm_enqueue_min=$(find /sys -name ldlm_enqueue_min)
1615     [ -z "$ldlm_enqueue_min" ] && skip "missing /sys/.../ldlm_enqueue_min" && return 0
1616     local ENQ_MIN=$(cat $ldlm_enqueue_min)
1617     echo $TIMEOUT >> $ldlm_enqueue_min
1618     rm -f $DIR/${tfile}_[1-2]
1619     lfs setstripe $DIR/$tfile --index=0 --count=1
1620 #define OBD_FAIL_LDLM_PAUSE_CANCEL       0x312
1621     sysctl -w lustre.fail_val=$(($TIMEOUT - 1))
1622     sysctl -w lustre.fail_loc=0x80000312
1623     cp /etc/profile $DIR/${tfile}_1 || error "1st cp failed $?"
1624     sysctl -w lustre.fail_val=$((TIMEOUT * 3 / 2))
1625     sysctl -w lustre.fail_loc=0x80000312
1626     cp /etc/profile $DIR/${tfile}_2 || error "2nd cp failed $?"
1627     sysctl -w lustre.fail_loc=0
1628     echo $ENQ_MIN >> $ldlm_enqueue_min
1629     return 0
1630 }
1631 run_test 68 "AT: verify slowing locks"
1632
1633 if [ -n "$ATOLDBASE" ]; then
1634     at_history=$(do_facet mds "find /sys/ -name at_history")
1635     do_facet mds "echo $ATOLDBASE >> $at_history" || true
1636     do_facet ost1 "echo $ATOLDBASE >> $at_history" || true
1637 fi
1638
1639 if [ $AT_MAX_SET -ne 0 ]; then
1640     echo "restore AT status to be disabled"
1641     at_max_set 0 mds ost client
1642 fi
1643
1644 # end of AT tests includes above lines
1645
1646
1647 # start multi-client tests
1648 test_70a () {
1649         [ -z "$CLIENTS" ] && \
1650                 { skip "Need two or more clients." && return; }
1651         [ $CLIENTCOUNT -lt 2 ] && \
1652                 { skip "Need two or more clients, have $CLIENTCOUNT" && return; }
1653
1654         echo "mount clients $CLIENTS ..."
1655         zconf_mount_clients $CLIENTS $DIR
1656
1657         local clients=${CLIENTS//,/ }
1658         echo "Write/read files on $DIR ; clients $CLIENTS ... "
1659         for CLIENT in $clients; do
1660                 do_node $CLIENT dd bs=1M count=10 if=/dev/zero \
1661                         of=$DIR/${tfile}_${CLIENT} 2>/dev/null || \
1662                                 error "dd failed on $CLIENT"
1663         done
1664
1665         local prev_client=$(echo $clients | sed 's/^.* \(\w\+\)$/\1/') 
1666         for C in ${CLIENTS//,/ }; do
1667                 do_node $prev_client dd if=$DIR/${tfile}_${C} of=/dev/null 2>/dev/null || \
1668                         error "dd if=$DIR/${tfile}_${C} failed on $prev_client"
1669                 prev_client=$C
1670         done
1671         
1672         ls $DIR
1673
1674         zconf_umount_clients $CLIENTS $DIR
1675 }
1676 run_test 70a "check multi client t-f"
1677
1678 test_70b () {
1679         [ -z "$CLIENTS" ] && \
1680                 { skip "Need two or more clients." && return; }
1681         [ $CLIENTCOUNT -lt 2 ] && \
1682                 { skip "Need two or more clients, have $CLIENTCOUNT" && return; }
1683
1684         zconf_mount_clients $CLIENTS $DIR
1685         
1686         local duration="-t 60"
1687         local cmd="rundbench 1 $duration "
1688         local PID=""
1689         for CLIENT in ${CLIENTS//,/ }; do
1690                 $PDSH $CLIENT "set -x; PATH=:$PATH:$LUSTRE/utils:$LUSTRE/tests/:${DBENCH_LIB} DBENCH_LIB=${DBENCH_LIB} $cmd" &
1691                 PID=$!
1692                 echo $PID >pid.$CLIENT
1693                 echo "Started load PID=`cat pid.$CLIENT`"
1694         done
1695
1696         replay_barrier $SINGLEMDS 
1697         sleep 3 # give clients a time to do operations
1698
1699         log "$TESTNAME fail mds 1"
1700         fail $SINGLEMDS
1701
1702 # wait for client to reconnect to MDS
1703         sleep $TIMEOUT
1704
1705         for CLIENT in ${CLIENTS//,/ }; do
1706                 PID=`cat pid.$CLIENT`
1707                 wait $PID
1708                 rc=$?
1709                 echo "load on ${CLIENT} returned $rc"
1710         done
1711
1712         zconf_umount_clients $CLIENTS $DIR 
1713 }
1714 run_test 70b "mds recovery; $CLIENTCOUNT clients"
1715 # end multi-client tests
1716
1717 equals_msg `basename $0`: test complete, cleaning up
1718 check_and_cleanup_lustre
1719 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true