Whamcloud - gitweb
b=19884 wait mds-ost sync patch + mds_ost proc value
[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 remote_mds_nodsh && log "SKIP: remote MDS with nodsh" && exit 0
20
21 # Skip these tests
22 # bug number:
23 ALWAYS_EXCEPT="$REPLAY_SINGLE_EXCEPT"
24
25 if [ "$FAILURE_MODE" = "HARD" ] && mixed_ost_devs; then
26     CONFIG_EXCEPTIONS="0b 42 47 61a 61c"
27     echo -n "Several ost services on one ost node are used with FAILURE_MODE=$FAILURE_MODE. "
28     echo "Except the tests: $CONFIG_EXCEPTIONS"
29     ALWAYS_EXCEPT="$ALWAYS_EXCEPT $CONFIG_EXCEPTIONS"
30 fi
31
32 #                                                  63 min  7 min  AT AT AT AT"
33 [ "$SLOW" = "no" ] && EXCEPT_SLOW="1 2 3 4 6 12 16 44a     44b    65 66 67 68"
34
35 build_test_filter
36
37 check_and_setup_lustre
38
39 mkdir -p $DIR
40
41 assert_DIR
42 rm -rf $DIR/[df][0-9]*
43
44 test_0a() {     # was test_0
45     replay_barrier mds
46     fail mds
47 }
48 run_test 0a "empty replay"
49
50 test_0b() {
51     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
52
53     # this test attempts to trigger a race in the precreation code,
54     # and must run before any other objects are created on the filesystem
55     fail ost1
56     createmany -o $DIR/$tfile 20 || return 1
57     unlinkmany $DIR/$tfile 20 || return 2
58 }
59 run_test 0b "ensure object created after recover exists. (3284)"
60
61 test_0c() {
62     replay_barrier mds
63     umount $DIR
64     facet_failover mds
65     zconf_mount `hostname` $DIR || error "mount fails"
66     clients_up || error "post-failover df failed"
67 }
68 run_test 0c "expired recovery with no clients"
69
70 test_1() {
71     replay_barrier mds
72     mcreate $DIR/$tfile
73     fail mds
74     $CHECKSTAT -t file $DIR/$tfile || return 1
75     rm $DIR/$tfile
76 }
77 run_test 1 "simple create"
78
79 test_2a() {
80     replay_barrier mds
81     touch $DIR/$tfile
82     fail mds
83     $CHECKSTAT -t file $DIR/$tfile || return 1
84     rm $DIR/$tfile
85 }
86 run_test 2a "touch"
87
88 test_2b() {
89     mcreate $DIR/$tfile
90     replay_barrier mds
91     touch $DIR/$tfile
92     fail mds
93     $CHECKSTAT -t file $DIR/$tfile || return 1
94     rm $DIR/$tfile
95 }
96 run_test 2b "touch"
97
98 test_3a() {
99     local file=$DIR/$tfile
100     replay_barrier mds
101     mcreate $file
102     openfile -f O_DIRECTORY $file
103     fail mds
104     $CHECKSTAT -t file $file || return 2
105     rm $file
106 }
107 run_test 3a "replay failed open(O_DIRECTORY)"
108
109 test_3b() {
110     replay_barrier mds
111 #define OBD_FAIL_MDS_OPEN_PACK | OBD_FAIL_ONCE
112     do_facet mds "lctl set_param fail_loc=0x80000114"
113     touch $DIR/$tfile
114     do_facet mds "lctl set_param fail_loc=0"
115     fail mds
116     $CHECKSTAT -t file $DIR/$tfile && return 2
117     return 0
118 }
119 run_test 3b "replay failed open -ENOMEM"
120
121 test_3c() {
122     replay_barrier mds
123 #define OBD_FAIL_MDS_ALLOC_OBDO | OBD_FAIL_ONCE
124     do_facet mds "lctl set_param fail_loc=0x80000128"
125     touch $DIR/$tfile
126     do_facet mds "lctl set_param fail_loc=0"
127     fail mds
128
129     $CHECKSTAT -t file $DIR/$tfile && return 2
130     return 0
131 }
132 run_test 3c "replay failed open -ENOMEM"
133
134 test_4a() {     # was test_4
135     replay_barrier mds
136     for i in `seq 10`; do
137         echo "tag-$i" > $DIR/$tfile-$i
138     done
139     fail mds
140     for i in `seq 10`; do
141       grep -q "tag-$i" $DIR/$tfile-$i || error "$tfile-$i"
142     done
143 }
144 run_test 4a "|x| 10 open(O_CREAT)s"
145
146 test_4b() {
147     replay_barrier mds
148     rm -rf $DIR/$tfile-*
149     fail mds
150     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
151 }
152 run_test 4b "|x| rm 10 files"
153
154 # The idea is to get past the first block of precreated files on both
155 # osts, and then replay.
156 test_5() {
157     replay_barrier mds
158     for i in `seq 220`; do
159         echo "tag-$i" > $DIR/$tfile-$i
160     done
161     fail mds
162     for i in `seq 220`; do
163       grep -q "tag-$i" $DIR/$tfile-$i || error "$tfile-$i"
164     done
165     rm -rf $DIR/$tfile-*
166     sleep 3
167     # waiting for commitment of removal
168 }
169 run_test 5 "|x| 220 open(O_CREAT)"
170
171
172 test_6a() {     # was test_6
173     mkdir -p $DIR/$tdir
174     replay_barrier mds
175     mcreate $DIR/$tdir/$tfile
176     fail mds
177     $CHECKSTAT -t dir $DIR/$tdir || return 1
178     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
179     sleep 2
180     # waiting for log process thread
181 }
182 run_test 6a "mkdir + contained create"
183
184 test_6b() {
185     mkdir -p $DIR/$tdir
186     replay_barrier mds
187     rm -rf $DIR/$tdir
188     fail mds
189     $CHECKSTAT -t dir $DIR/$tdir && return 1 || true
190 }
191 run_test 6b "|X| rmdir"
192
193 test_7() {
194     mkdir -p $DIR/$tdir
195     replay_barrier mds
196     mcreate $DIR/$tdir/$tfile
197     fail mds
198     $CHECKSTAT -t dir $DIR/$tdir || return 1
199     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
200     rm -fr $DIR/$tdir
201 }
202 run_test 7 "mkdir |X| contained create"
203
204 test_8() {
205     replay_barrier mds
206     multiop_bg_pause $DIR/$tfile mo_c || return 4
207     MULTIPID=$!
208     fail mds
209     ls $DIR/$tfile
210     $CHECKSTAT -t file $DIR/$tfile || return 1
211     kill -USR1 $MULTIPID || return 2
212     wait $MULTIPID || return 3
213     rm $DIR/$tfile
214 }
215 run_test 8 "creat open |X| close"
216
217 test_9() {
218     replay_barrier mds
219     mcreate $DIR/$tfile
220     local old_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
221     fail mds
222     local new_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
223
224     echo " old_inum == $old_inum, new_inum == $new_inum"
225     if [ $old_inum -eq $new_inum  ] ;
226     then
227         echo " old_inum and new_inum match"
228     else
229         echo "!!!! old_inum and new_inum NOT match"
230         return 1
231     fi
232     rm $DIR/$tfile
233 }
234 run_test 9  "|X| create (same inum/gen)"
235
236 test_10() {
237     mcreate $DIR/$tfile
238     replay_barrier mds
239     mv $DIR/$tfile $DIR/$tfile-2
240     rm -f $DIR/$tfile
241     fail mds
242     $CHECKSTAT $DIR/$tfile && return 1
243     $CHECKSTAT $DIR/$tfile-2 ||return 2
244     rm $DIR/$tfile-2
245     return 0
246 }
247 run_test 10 "create |X| rename unlink"
248
249 test_11() {
250     mcreate $DIR/$tfile
251     echo "old" > $DIR/$tfile
252     mv $DIR/$tfile $DIR/$tfile-2
253     replay_barrier mds
254     echo "new" > $DIR/$tfile
255     grep new $DIR/$tfile
256     grep old $DIR/$tfile-2
257     fail mds
258     grep new $DIR/$tfile || return 1
259     grep old $DIR/$tfile-2 || return 2
260 }
261 run_test 11 "create open write rename |X| create-old-name read"
262
263 test_12() {
264     mcreate $DIR/$tfile
265     multiop_bg_pause $DIR/$tfile o_tSc || return 3
266     pid=$!
267     rm -f $DIR/$tfile
268     replay_barrier mds
269     kill -USR1 $pid
270     wait $pid || return 1
271
272     fail mds
273     [ -e $DIR/$tfile ] && return 2
274     return 0
275 }
276 run_test 12 "open, unlink |X| close"
277
278
279 # 1777 - replay open after committed chmod that would make
280 #        a regular open a failure
281 test_13() {
282     mcreate $DIR/$tfile
283     multiop_bg_pause $DIR/$tfile O_wc || return 3
284     pid=$!
285     chmod 0 $DIR/$tfile
286     $CHECKSTAT -p 0 $DIR/$tfile
287     replay_barrier mds
288     fail mds
289     kill -USR1 $pid
290     wait $pid || return 1
291
292     $CHECKSTAT -s 1 -p 0 $DIR/$tfile || return 2
293     rm $DIR/$tfile || return 4
294     return 0
295 }
296 run_test 13 "open chmod 0 |x| write close"
297
298 test_14() {
299     multiop_bg_pause $DIR/$tfile O_tSc || return 4
300     pid=$!
301     rm -f $DIR/$tfile
302     replay_barrier mds
303     kill -USR1 $pid || return 1
304     wait $pid || return 2
305
306     fail mds
307     [ -e $DIR/$tfile ] && return 3
308     return 0
309 }
310 run_test 14 "open(O_CREAT), unlink |X| close"
311
312 test_15() {
313     multiop_bg_pause $DIR/$tfile O_tSc || return 5
314     pid=$!
315     rm -f $DIR/$tfile
316     replay_barrier mds
317     touch $DIR/g11 || return 1
318     kill -USR1 $pid
319     wait $pid || return 2
320
321     fail mds
322     [ -e $DIR/$tfile ] && return 3
323     touch $DIR/h11 || return 4
324     return 0
325 }
326 run_test 15 "open(O_CREAT), unlink |X|  touch new, close"
327
328 test_16() {
329     replay_barrier mds
330     mcreate $DIR/$tfile
331     munlink $DIR/$tfile
332     mcreate $DIR/$tfile-2
333     fail mds
334     [ -e $DIR/$tfile ] && return 1
335     [ -e $DIR/$tfile-2 ] || return 2
336     munlink $DIR/$tfile-2 || return 3
337 }
338 run_test 16 "|X| open(O_CREAT), unlink, touch new,  unlink new"
339
340 test_17() {
341     replay_barrier mds
342     multiop_bg_pause $DIR/$tfile O_c || return 4
343     pid=$!
344     fail mds
345     kill -USR1 $pid || return 1
346     wait $pid || return 2
347     $CHECKSTAT -t file $DIR/$tfile || return 3
348     rm $DIR/$tfile
349 }
350 run_test 17 "|X| open(O_CREAT), |replay| close"
351
352 test_18() {
353     replay_barrier mds
354     multiop_bg_pause $DIR/$tfile O_tSc || return 8
355     pid=$!
356     rm -f $DIR/$tfile
357     touch $DIR/$tfile-2 || return 1
358     echo "pid: $pid will close"
359     kill -USR1 $pid
360     wait $pid || return 2
361
362     fail mds
363     [ -e $DIR/$tfile ] && return 3
364     [ -e $DIR/$tfile-2 ] || return 4
365     # this touch frequently fails
366     touch $DIR/$tfile-3 || return 5
367     munlink $DIR/$tfile-2 || return 6
368     munlink $DIR/$tfile-3 || return 7
369     return 0
370 }
371 run_test 18 "|X| open(O_CREAT), unlink, touch new, close, touch, unlink"
372
373 # bug 1855 (a simpler form of test_11 above)
374 test_19() {
375     replay_barrier mds
376     mcreate $DIR/$tfile
377     echo "old" > $DIR/$tfile
378     mv $DIR/$tfile $DIR/$tfile-2
379     grep old $DIR/$tfile-2
380     fail mds
381     grep old $DIR/$tfile-2 || return 2
382 }
383 run_test 19 "|X| mcreate, open, write, rename "
384
385 test_20a() {    # was test_20
386     replay_barrier mds
387     multiop_bg_pause $DIR/$tfile O_tSc || return 3
388     pid=$!
389     rm -f $DIR/$tfile
390
391     fail mds
392     kill -USR1 $pid
393     wait $pid || return 1
394     [ -e $DIR/$tfile ] && return 2
395     return 0
396 }
397 run_test 20a "|X| open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
398
399 test_20b() { # bug 10480
400     BEFOREUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
401
402     dd if=/dev/zero of=$DIR/$tfile bs=4k count=10000 &
403     pid=$!
404     while [ ! -e $DIR/$tfile ] ; do
405         sleep 0.060s                           # give dd a chance to start
406     done
407
408     lfs getstripe $DIR/$tfile || return 1
409     rm -f $DIR/$tfile || return 2       # make it an orphan
410     mds_evict_client
411     client_up || client_up || true    # reconnect
412
413     fail mds                            # start orphan recovery
414     wait_recovery_complete mds || error "MDS recovery isn't done"
415     wait_mds_ost_sync || return 3
416     AFTERUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
417     log "before $BEFOREUSED, after $AFTERUSED"
418     [ $AFTERUSED -gt $((BEFOREUSED + 20)) ] && \
419         error "after $AFTERUSED > before $BEFOREUSED" && return 5
420     return 0
421 }
422 run_test 20b "write, unlink, eviction, replay, (test mds_cleanup_orphans)"
423
424 test_20c() { # bug 10480
425     multiop $DIR/$tfile Ow_c &
426     pid=$!
427     # give multiop a chance to open
428     sleep 1
429
430     ls -la $DIR/$tfile
431
432     mds_evict_client
433     client_up || client_up || true    # reconnect
434
435     kill -USR1 $pid
436     wait $pid || return 1
437     [ -s $DIR/$tfile ] || error "File was truncated"
438
439     return 0
440 }
441 run_test 20c "check that client eviction does not affect file content"
442
443 test_21() {
444     replay_barrier mds
445     multiop_bg_pause $DIR/$tfile O_tSc || return 5
446     pid=$!
447     rm -f $DIR/$tfile
448     touch $DIR/g11 || return 1
449
450     fail mds
451     kill -USR1 $pid
452     wait $pid || return 2
453     [ -e $DIR/$tfile ] && return 3
454     touch $DIR/h11 || return 4
455     return 0
456 }
457 run_test 21 "|X| open(O_CREAT), unlink touch new, replay, close (test mds_cleanup_orphans)"
458
459 test_22() {
460     multiop_bg_pause $DIR/$tfile O_tSc || return 3
461     pid=$!
462
463     replay_barrier mds
464     rm -f $DIR/$tfile
465
466     fail mds
467     kill -USR1 $pid
468     wait $pid || return 1
469     [ -e $DIR/$tfile ] && return 2
470     return 0
471 }
472 run_test 22 "open(O_CREAT), |X| unlink, replay, close (test mds_cleanup_orphans)"
473
474 test_23() {
475     multiop_bg_pause $DIR/$tfile O_tSc || return 5
476     pid=$!
477
478     replay_barrier mds
479     rm -f $DIR/$tfile
480     touch $DIR/g11 || return 1
481
482     fail mds
483     kill -USR1 $pid
484     wait $pid || return 2
485     [ -e $DIR/$tfile ] && return 3
486     touch $DIR/h11 || return 4
487     return 0
488 }
489 run_test 23 "open(O_CREAT), |X| unlink touch new, replay, close (test mds_cleanup_orphans)"
490
491 test_24() {
492     multiop_bg_pause $DIR/$tfile O_tSc || return 3
493     pid=$!
494
495     replay_barrier mds
496     fail mds
497     rm -f $DIR/$tfile
498     kill -USR1 $pid
499     wait $pid || return 1
500     [ -e $DIR/$tfile ] && return 2
501     return 0
502 }
503 run_test 24 "open(O_CREAT), replay, unlink, close (test mds_cleanup_orphans)"
504
505 test_25() {
506     multiop_bg_pause $DIR/$tfile O_tSc || return 3
507     pid=$!
508     rm -f $DIR/$tfile
509
510     replay_barrier mds
511     fail mds
512     kill -USR1 $pid
513     wait $pid || return 1
514     [ -e $DIR/$tfile ] && return 2
515     return 0
516 }
517 run_test 25 "open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
518
519 test_26() {
520     replay_barrier mds
521     multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
522     pid1=$!
523     multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
524     pid2=$!
525     rm -f $DIR/$tfile-1
526     rm -f $DIR/$tfile-2
527     kill -USR1 $pid2
528     wait $pid2 || return 1
529
530     fail mds
531     kill -USR1 $pid1
532     wait $pid1 || return 2
533     [ -e $DIR/$tfile-1 ] && return 3
534     [ -e $DIR/$tfile-2 ] && return 4
535     return 0
536 }
537 run_test 26 "|X| open(O_CREAT), unlink two, close one, replay, close one (test mds_cleanup_orphans)"
538
539 test_27() {
540     replay_barrier mds
541     multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
542     pid1=$!
543     multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
544     pid2=$!
545     rm -f $DIR/$tfile-1
546     rm -f $DIR/$tfile-2
547
548     fail mds
549     kill -USR1 $pid1
550     wait $pid1 || return 1
551     kill -USR1 $pid2
552     wait $pid2 || return 2
553     [ -e $DIR/$tfile-1 ] && return 3
554     [ -e $DIR/$tfile-2 ] && return 4
555     return 0
556 }
557 run_test 27 "|X| open(O_CREAT), unlink two, replay, close two (test mds_cleanup_orphans)"
558
559 test_28() {
560     multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
561     pid1=$!
562     multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
563     pid2=$!
564     replay_barrier mds
565     rm -f $DIR/$tfile-1
566     rm -f $DIR/$tfile-2
567     kill -USR1 $pid2
568     wait $pid2 || return 1
569
570     fail mds
571     kill -USR1 $pid1
572     wait $pid1 || return 2
573     [ -e $DIR/$tfile-1 ] && return 3
574     [ -e $DIR/$tfile-2 ] && return 4
575     return 0
576 }
577 run_test 28 "open(O_CREAT), |X| unlink two, close one, replay, close one (test mds_cleanup_orphans)"
578
579 test_29() {
580     multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
581     pid1=$!
582     multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
583     pid2=$!
584     replay_barrier mds
585     rm -f $DIR/$tfile-1
586     rm -f $DIR/$tfile-2
587
588     fail mds
589     kill -USR1 $pid1
590     wait $pid1 || return 1
591     kill -USR1 $pid2
592     wait $pid2 || return 2
593     [ -e $DIR/$tfile-1 ] && return 3
594     [ -e $DIR/$tfile-2 ] && return 4
595     return 0
596 }
597 run_test 29 "open(O_CREAT), |X| unlink two, replay, close two (test mds_cleanup_orphans)"
598
599 test_30() {
600     multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
601     pid1=$!
602     multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
603     pid2=$!
604     rm -f $DIR/$tfile-1
605     rm -f $DIR/$tfile-2
606
607     replay_barrier mds
608     fail mds
609     kill -USR1 $pid1
610     wait $pid1 || return 1
611     kill -USR1 $pid2
612     wait $pid2 || return 2
613     [ -e $DIR/$tfile-1 ] && return 3
614     [ -e $DIR/$tfile-2 ] && return 4
615     return 0
616 }
617 run_test 30 "open(O_CREAT) two, unlink two, replay, close two (test mds_cleanup_orphans)"
618
619 test_31() {
620     multiop_bg_pause $DIR/$tfile-1 O_tSc || return 5
621     pid1=$!
622     multiop_bg_pause $DIR/$tfile-2 O_tSc || return 6
623     pid2=$!
624     rm -f $DIR/$tfile-1
625
626     replay_barrier mds
627     rm -f $DIR/$tfile-2
628     fail mds
629     kill -USR1 $pid1
630     wait $pid1 || return 1
631     kill -USR1 $pid2
632     wait $pid2 || return 2
633     [ -e $DIR/$tfile-1 ] && return 3
634     [ -e $DIR/$tfile-2 ] && return 4
635     return 0
636 }
637 run_test 31 "open(O_CREAT) two, unlink one, |X| unlink one, close two (test mds_cleanup_orphans)"
638
639 # tests for bug 2104; completion without crashing is success.  The close is
640 # stale, but we always return 0 for close, so the app never sees it.
641 test_32() {
642     multiop_bg_pause $DIR/$tfile O_c || return 2
643     pid1=$!
644     multiop_bg_pause $DIR/$tfile O_c || return 3
645     pid2=$!
646     mds_evict_client
647     client_up || client_up || return 1
648     kill -USR1 $pid1
649     kill -USR1 $pid2
650     wait $pid1 || return 4
651     wait $pid2 || return 5
652     return 0
653 }
654 run_test 32 "close() notices client eviction; close() after client eviction"
655
656 # Abort recovery before client complete
657 test_33a() {    # was test_33
658     replay_barrier mds
659     createmany -o $DIR/$tfile-%d 100
660     fail_abort mds
661     # this file should be gone, because the replay was aborted
662     $CHECKSTAT -t file $DIR/$tfile-* && return 3
663     unlinkmany $DIR/$tfile-%d 0 100
664     return 0
665 }
666 run_test 33a "abort recovery before client does replay"
667
668 test_34() {
669     multiop_bg_pause $DIR/$tfile O_c || return 2
670     pid=$!
671     rm -f $DIR/$tfile
672
673     replay_barrier mds
674     fail_abort mds
675     kill -USR1 $pid
676     wait $pid || return 3
677     [ -e $DIR/$tfile ] && return 1
678     sync
679     return 0
680 }
681 run_test 34 "abort recovery before client does replay (test mds_cleanup_orphans)"
682
683 # bug 2278 - generate one orphan on OST, then destroy it during llog recovery
684 test_35() {
685     touch $DIR/$tfile
686
687 #define OBD_FAIL_MDS_REINT_NET_REP       0x119
688     do_facet mds "lctl set_param fail_loc=0x80000119"
689     rm -f $DIR/$tfile &
690     sleep 1
691     sync
692     sleep 1
693     # give a chance to remove from MDS
694     fail_abort mds
695     $CHECKSTAT -t file $DIR/$tfile && return 1 || true
696 }
697 run_test 35 "test recovery from llog for unlink op"
698
699 # b=2432 resent cancel after replay uses wrong cookie,
700 # so don't resend cancels
701 test_36() {
702     replay_barrier mds
703     touch $DIR/$tfile
704     checkstat $DIR/$tfile
705     facet_failover mds
706     cancel_lru_locks mdc
707     if dmesg | grep "unknown lock cookie"; then
708         echo "cancel after replay failed"
709         return 1
710     fi
711 }
712 run_test 36 "don't resend cancel"
713
714 # b=2368
715 # directory orphans can't be unlinked from PENDING directory
716 test_37() {
717     rmdir $DIR/$tfile 2>/dev/null
718     multiop_bg_pause $DIR/$tfile dD_c || return 2
719     pid=$!
720     rmdir $DIR/$tfile
721
722     replay_barrier mds
723     # clear the dmesg buffer so we only see errors from this recovery
724     dmesg -c >/dev/null
725     fail_abort mds
726     kill -USR1 $pid
727     dmesg | grep  "mds_unlink_orphan.*error .* unlinking orphan" && return 1
728     wait $pid || return 3
729     sync
730     return 0
731 }
732 run_test 37 "abort recovery before client does replay (test mds_cleanup_orphans for directories)"
733
734 test_38() {
735     createmany -o $DIR/$tfile-%d 800
736     unlinkmany $DIR/$tfile-%d 0 400
737     replay_barrier mds
738     fail mds
739     unlinkmany $DIR/$tfile-%d 400 400
740     sleep 2
741     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
742 }
743 run_test 38 "test recovery from unlink llog (test llog_gen_rec) "
744
745 test_39() { # bug 4176
746     createmany -o $DIR/$tfile-%d 800
747     replay_barrier mds
748     unlinkmany $DIR/$tfile-%d 0 400
749     fail mds
750     unlinkmany $DIR/$tfile-%d 400 400
751     sleep 2
752     ls -1f $DIR/$tfile-*
753     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
754 }
755 run_test 39 "test recovery from unlink llog (test llog_gen_rec) "
756
757 count_ost_writes() {
758     lctl get_param -n osc.*.stats | awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }'
759 }
760
761 #b=2477,2532
762 test_40(){
763     $LCTL mark multiop $MOUNT/$tfile OS_c
764     multiop $MOUNT/$tfile OS_c  &
765     PID=$!
766     writeme -s $MOUNT/${tfile}-2 &
767     WRITE_PID=$!
768     sleep 1
769     facet_failover mds
770 #define OBD_FAIL_MDS_CONNECT_NET         0x117
771     do_facet mds "lctl set_param fail_loc=0x80000117"
772     kill -USR1 $PID
773     stat1=`count_ost_writes`
774     sleep $TIMEOUT
775     stat2=`count_ost_writes`
776     echo "$stat1, $stat2"
777     if [ $stat1 -lt $stat2 ]; then
778        echo "writes continuing during recovery"
779        RC=0
780     else
781        echo "writes not continuing during recovery, bug 2477"
782        RC=4
783     fi
784     echo "waiting for writeme $WRITE_PID"
785     kill $WRITE_PID
786     wait $WRITE_PID
787
788     echo "waiting for multiop $PID"
789     wait $PID || return 2
790     do_facet client munlink $MOUNT/$tfile  || return 3
791     do_facet client munlink $MOUNT/${tfile}-2  || return 3
792     return $RC
793 }
794 run_test 40 "cause recovery in ptlrpc, ensure IO continues"
795
796 #b=2814
797 # make sure that a read to one osc doesn't try to double-unlock its page just
798 # because another osc is invalid.  trigger_group_io used to mistakenly return
799 # an error if any oscs were invalid even after having successfully put rpcs
800 # on valid oscs.  This was fatal if the caller was ll_readpage who unlocked
801 # the page, guarnateeing that the unlock from the RPC completion would
802 # assert on trying to unlock the unlocked page.
803 test_41() {
804     [ $OSTCOUNT -lt 2 ] && \
805         skip_env "skipping test 41: we don't have a second OST to test with" && \
806         return
807
808     local f=$MOUNT/$tfile
809     # make sure the start of the file is ost1
810     lfs setstripe $f -s $((128 * 1024)) -i 0
811     do_facet client dd if=/dev/zero of=$f bs=4k count=1 || return 3
812     cancel_lru_locks osc
813     # fail ost2 and read from ost1
814     local osc2dev=`lctl get_param -n devices | grep ${ost2_svc}-osc- | awk '{print $1}'`
815     [ "$osc2dev" ] || return 4
816     $LCTL --device $osc2dev deactivate || return 1
817     do_facet client dd if=$f of=/dev/null bs=4k count=1 || return 3
818     $LCTL --device $osc2dev activate || return 2
819     return 0
820 }
821 run_test 41 "read from a valid osc while other oscs are invalid"
822
823 # test MDS recovery after ost failure
824 test_42() {
825     blocks=`df -P $MOUNT | tail -n 1 | awk '{ print $2 }'`
826     createmany -o $DIR/$tfile-%d 800
827     replay_barrier ost1
828     unlinkmany $DIR/$tfile-%d 0 400
829     debugsave
830     lctl set_param debug=-1
831     facet_failover ost1
832
833     # osc is evicted, fs is smaller (but only with failout OSTs (bug 7287)
834     #blocks_after=`df -P $MOUNT | tail -n 1 | awk '{ print $2 }'`
835     #[ $blocks_after -lt $blocks ] || return 1
836     echo wait for MDS to timeout and recover
837     sleep $((TIMEOUT * 2))
838     debugrestore
839     unlinkmany $DIR/$tfile-%d 400 400
840     $CHECKSTAT -t file $DIR/$tfile-* && return 2 || true
841 }
842 run_test 42 "recovery after ost failure"
843
844 # timeout in MDS/OST recovery RPC will LBUG MDS
845 test_43() { # bug 2530
846     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
847
848     replay_barrier mds
849
850     # OBD_FAIL_OST_CREATE_NET 0x204
851     do_facet ost1 "lctl set_param fail_loc=0x80000204"
852     fail mds
853     sleep 10
854     do_facet ost1 "lctl set_param fail_loc=0"
855
856     return 0
857 }
858 run_test 43 "mds osc import failure during recovery; don't LBUG"
859
860 test_44a() { # was test_44
861     local at_max_saved=0
862
863     mdcdev=`lctl get_param -n devices | awk '/-mdc-/ {print $1}'`
864     [ "$mdcdev" ] || return 2
865     [ $(echo $mdcdev | wc -w) -eq 1 ] || { echo $mdcdev=$mdcdev && return 3; }
866
867     # adaptive timeouts slow this way down
868     if at_is_enabled; then
869         at_max_saved=$(at_max_get mds)
870         at_max_set 40 mds
871     fi
872
873     local dev=$(get_mds_mdt_device_proc_path)
874     for i in `seq 1 10`; do
875         echo "$i of 10 ($(date +%s))"
876         do_facet mds "lctl get_param -n mdt.*.$dev.timeouts | grep service"
877         #define OBD_FAIL_TGT_CONN_RACE     0x701
878         do_facet mds "lctl set_param fail_loc=0x80000701"
879         # lctl below may fail, it is valid case
880         $LCTL --device $mdcdev recover
881         df $MOUNT
882     done
883
884     do_facet mds "lctl set_param fail_loc=0"
885     [ $at_max_saved -ne 0 ] && at_max_set $at_max_saved mds
886     return 0
887 }
888 run_test 44a "race in target handle connect"
889
890 test_44b() {
891     local mdcdev=`lctl get_param -n devices | awk '/-mdc-/ {print $1}'`
892     [ "$mdcdev" ] || return 2
893     [ $(echo $mdcdev | wc -w) -eq 1 ] || { echo $mdcdev=$mdcdev && return 3; }
894
895     local dev=$(get_mds_mdt_device_proc_path)
896     for i in `seq 1 10`; do
897         echo "$i of 10 ($(date +%s))"
898         do_facet mds "lctl get_param -n mdt.*.$dev.timeouts | grep service"
899         #define OBD_FAIL_TGT_DELAY_RECONNECT 0x704
900         do_facet mds "lctl set_param fail_loc=0x80000704"
901         # lctl below may fail, it is valid case
902         $LCTL --device $mdcdev recover
903         df $MOUNT
904     done
905     do_facet mds "lctl set_param fail_loc=0"
906     return 0
907 }
908 run_test 44b "race in target handle connect"
909
910 # Handle failed close
911 test_45() {
912     local mdcdev=`lctl get_param -n devices | awk '/-mdc-/ {print $1}'`
913     [ "$mdcdev" ] || return 2
914     [ $(echo $mdcdev | wc -w) -eq 1 ] || { echo $mdcdev=$mdcdev && return 3; }
915
916     $LCTL --device $mdcdev recover || return 6 
917
918     multiop_bg_pause $DIR/$tfile O_c || return 1
919     pid=$!
920
921     # This will cause the CLOSE to fail before even
922     # allocating a reply buffer
923     $LCTL --device $mdcdev deactivate || return 4
924
925     # try the close
926     kill -USR1 $pid
927     wait $pid || return 1
928
929     $LCTL --device $mdcdev activate || return 5
930     sleep 1
931
932     $CHECKSTAT -t file $DIR/$tfile || return 2
933     return 0
934 }
935 run_test 45 "Handle failed close"
936
937 test_46() {
938     dmesg -c >/dev/null
939     drop_reply "touch $DIR/$tfile"
940     fail mds
941     # ironically, the previous test, 45, will cause a real forced close,
942     # so just look for one for this test
943     dmesg | grep -i "force closing client file handle for $tfile" && return 1
944     return 0
945 }
946 run_test 46 "Don't leak file handle after open resend (3325)"
947
948 test_47() { # bug 2824
949     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
950
951     # create some files to make sure precreate has been done on all
952     # OSTs. (just in case this test is run independently)
953     createmany -o $DIR/$tfile 20  || return 1
954
955     # OBD_FAIL_OST_CREATE_NET 0x204
956     fail ost1
957     do_facet ost1 "lctl set_param fail_loc=0x80000204"
958     client_up || return 2
959
960     # let the MDS discover the OST failure, attempt to recover, fail
961     # and recover again.
962     sleep $((3 * TIMEOUT))
963
964     # Without 2824, this createmany would hang
965     createmany -o $DIR/$tfile 20 || return 3
966     unlinkmany $DIR/$tfile 20 || return 4
967
968     do_facet ost1 "lctl set_param fail_loc=0"
969     return 0
970 }
971 run_test 47 "MDS->OSC failure during precreate cleanup (2824)"
972
973 test_48() {
974     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
975     [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return
976
977     replay_barrier mds
978     createmany -o $DIR/$tfile 20  || return 1
979     facet_failover mds
980     #define OBD_FAIL_OST_EROFS 0x216
981     do_facet ost1 "lctl set_param fail_loc=0x80000216"
982     client_up || return 2
983
984     createmany -o $DIR/$tfile 20 20 || return 2
985     unlinkmany $DIR/$tfile 40 || return 3
986     return 0
987 }
988 run_test 48 "MDS->OSC failure during precreate cleanup (2824)"
989
990 test_49a() {
991     multiop $DIR/$tfile O_c &
992     pid=$!
993     sleep 1
994     rm -rf $DIR/$tfile
995
996 #define OBD_FAIL_MDS_ALL_REPLY_NET       0x122
997     do_facet mds "lctl set_param fail_loc=0x80000122"
998     kill -USR1 $pid
999     do_facet mds "lctl set_param fail_loc=0"
1000
1001     replay_barrier_nodf mds
1002     fail mds
1003
1004     wait $pid || return 1
1005     $CHECKSTAT -t file $DIR/$tfile && return 2
1006     return 0
1007 }
1008 run_test 49a "mds fail after close reply is dropped: open|create "
1009
1010 test_49c() {
1011     touch $DIR/$tfile
1012     multiop $DIR/$tfile o_c &
1013     pid=$!
1014     sleep 1
1015     rm -rf $DIR/$tfile
1016
1017 #define OBD_FAIL_MDS_ALL_REPLY_NET       0x122
1018     do_facet mds "lctl set_param fail_loc=0x80000122"
1019     kill -USR1 $pid
1020     do_facet mds "lctl set_param fail_loc=0"
1021
1022     replay_barrier_nodf mds
1023     fail mds
1024
1025     wait $pid || return 1
1026     $CHECKSTAT -t file $DIR/$tfile && return 2
1027     return 0
1028 }
1029 run_test 49c "mds fail after close reply is dropped: open"
1030
1031 test_50() {
1032     local oscdev=`do_facet mds lctl get_param -n devices | grep ${ost1_svc}-osc | awk '{print $1}' | head -1`
1033     [ "$oscdev" ] || return 1
1034     do_facet mds $LCTL --device $oscdev recover || return 2
1035     do_facet mds $LCTL --device $oscdev recover || return 3
1036     # give the mds_lov_sync threads a chance to run
1037     sleep 5
1038 }
1039 run_test 50 "Double OSC recovery, don't LASSERT (3812)"
1040
1041 # b3764 timed out lock replay
1042 test_52() {
1043     touch $DIR/$tfile
1044     cancel_lru_locks mdc
1045
1046     multiop $DIR/$tfile s || return 1
1047     replay_barrier mds
1048 #define OBD_FAIL_LDLM_REPLY              0x30c
1049     do_facet mds "lctl set_param fail_loc=0x8000030c"
1050     fail mds || return 2
1051     do_facet mds "lctl set_param fail_loc=0x0"
1052
1053     $CHECKSTAT -t file $DIR/$tfile-* && return 3 || true
1054 }
1055 run_test 52 "time out lock replay (3764)"
1056
1057 # bug 3462 - simultaneous MDC requests
1058 test_53a() {
1059     cancel_lru_locks mdc  # lock cleanup
1060     mkdir -p $DIR/${tdir}-1
1061     mkdir -p $DIR/${tdir}-2
1062     multiop $DIR/${tdir}-1/f O_c &
1063     close_pid=$!
1064     # give multiop a chance to open
1065     sleep 1
1066
1067     #define OBD_FAIL_MDS_CLOSE_NET 0x115
1068     do_facet mds "lctl set_param fail_loc=0x80000115"
1069     kill -USR1 $close_pid
1070     cancel_lru_locks mdc # force the close
1071     do_facet mds "lctl set_param fail_loc=0"
1072     mcreate $DIR/${tdir}-2/f || return 1
1073
1074     # close should still be here
1075     [ -d /proc/$close_pid ] || return 2
1076     replay_barrier_nodf mds
1077     fail mds
1078     wait $close_pid || return 3
1079
1080     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 4
1081     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 5
1082     rm -rf $DIR/${tdir}-*
1083 }
1084 run_test 53a "|X| close request while two MDC requests in flight"
1085
1086 test_53b() {
1087     cancel_lru_locks mdc  # lock cleanup
1088     rm -rf $DIR/${tdir}-1 $DIR/${tdir}-2
1089
1090     mkdir -p $DIR/$tdir-1
1091     mkdir -p $DIR/$tdir-2
1092
1093     multiop_bg_pause $DIR/$tdir-1/f O_c || return 6
1094     close_pid=$!
1095
1096     #define OBD_FAIL_MDS_REINT_NET 0x107
1097     do_facet mds "lctl set_param fail_loc=0x80000107"
1098     mcreate $DIR/${tdir}-2/f &
1099     open_pid=$!
1100     sleep 1
1101
1102     do_facet mds "lctl set_param fail_loc=0"
1103     kill -USR1 $close_pid
1104     cancel_lru_locks mdc # force the close
1105     wait $close_pid || return 1
1106     # open should still be here
1107     [ -d /proc/$open_pid ] || return 2
1108
1109     replay_barrier_nodf mds
1110     fail mds
1111     wait $open_pid || return 3
1112
1113     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 4
1114     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 5
1115     rm -rf $DIR/${tdir}-*
1116 }
1117 run_test 53b "|X| open request while two MDC requests in flight"
1118
1119 test_53c() {
1120     cancel_lru_locks mdc  # lock cleanup
1121     rm -rf $DIR/${tdir}-1 $DIR/${tdir}-2
1122
1123     mkdir -p $DIR/${tdir}-1
1124     mkdir -p $DIR/${tdir}-2
1125     multiop $DIR/${tdir}-1/f O_c &
1126     close_pid=$!
1127
1128 #define OBD_FAIL_MDS_REINT_NET           0x107
1129     do_facet mds "lctl set_param fail_loc=0x80000107"
1130     mcreate $DIR/${tdir}-2/f &
1131     open_pid=$!
1132     sleep 1
1133
1134 #define OBD_FAIL_MDS_CLOSE_NET           0x115
1135     do_facet mds "lctl set_param fail_loc=0x80000115"
1136     kill -USR1 $close_pid
1137     cancel_lru_locks mdc  # force the close
1138
1139     replay_barrier_nodf mds
1140     fail_nodf mds
1141     wait $open_pid || return 1
1142     sleep 2
1143     # close should be gone
1144     [ -d /proc/$close_pid ] && return 2
1145     do_facet mds "lctl set_param fail_loc=0"
1146
1147     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1148     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 4
1149     rm -rf $DIR/${tdir}-*
1150 }
1151 run_test 53c "|X| open request and close request while two MDC requests in flight"
1152
1153 test_53d() {
1154     cancel_lru_locks mdc  # lock cleanup
1155     rm -rf $DIR/${tdir}-1 $DIR/${tdir}-2
1156
1157     mkdir -p $DIR/${tdir}-1
1158     mkdir -p $DIR/${tdir}-2
1159     multiop $DIR/${tdir}-1/f O_c &
1160     close_pid=$!
1161     # give multiop a chance to open
1162     sleep 1
1163
1164 #define OBD_FAIL_MDS_CLOSE_NET_REP       0x13b
1165     do_facet mds "lctl set_param fail_loc=0x8000013b"
1166     kill -USR1 $close_pid
1167     cancel_lru_locks mdc  # force the close
1168     do_facet mds "lctl set_param fail_loc=0"
1169     mcreate $DIR/${tdir}-2/f || return 1
1170
1171     # close should still be here
1172     [ -d /proc/$close_pid ] || return 2
1173     replay_barrier_nodf mds
1174     fail mds
1175     wait $close_pid || return 3
1176
1177     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 4
1178     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 5
1179     rm -rf $DIR/${tdir}-*
1180 }
1181 run_test 53d "|X| close reply while two MDC requests in flight"
1182
1183 test_53e() {
1184     cancel_lru_locks mdc  # lock cleanup
1185     rm -rf $DIR/${tdir}-1 $DIR/${tdir}-2
1186
1187     mkdir -p $DIR/$tdir-1
1188     mkdir -p $DIR/$tdir-2
1189     multiop $DIR/$tdir-1/f O_c &
1190     close_pid=$!
1191
1192     #define OBD_FAIL_MDS_REINT_NET_REP       0x119
1193     do_facet mds "lctl set_param fail_loc=0x80000119"
1194     mcreate $DIR/${tdir}-2/f &
1195     open_pid=$!
1196     sleep 1
1197
1198     do_facet mds "lctl set_param fail_loc=0"
1199     kill -USR1 $close_pid
1200     cancel_lru_locks mdc  # force the close
1201     wait $close_pid || return 1
1202     # open should still be here
1203     [ -d /proc/$open_pid ] || return 2
1204
1205     replay_barrier_nodf mds
1206     fail mds
1207     wait $open_pid || return 3
1208
1209     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 4
1210     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 5
1211     rm -rf $DIR/${tdir}-*
1212 }
1213 run_test 53e "|X| open reply while two MDC requests in flight"
1214
1215 test_53f() {
1216         cancel_lru_locks mdc  # lock cleanup
1217         rm -rf $DIR/${tdir}-1 $DIR/${tdir}-2
1218
1219         mkdir -p $DIR/${tdir}-1
1220         mkdir -p $DIR/${tdir}-2
1221         multiop $DIR/${tdir}-1/f O_c &
1222         close_pid=$!
1223
1224 #define OBD_FAIL_MDS_REINT_NET_REP       0x119
1225         do_facet mds "lctl set_param fail_loc=0x80000119"
1226         mcreate $DIR/${tdir}-2/f &
1227         open_pid=$!
1228         sleep 1
1229
1230 #define OBD_FAIL_MDS_CLOSE_NET_REP       0x13b
1231         do_facet mds "lctl set_param fail_loc=0x8000013b"
1232         kill -USR1 $close_pid
1233         cancel_lru_locks mdc
1234
1235         replay_barrier_nodf mds
1236         fail_nodf mds
1237         wait $open_pid || return 1
1238         sleep 2
1239         #close should be gone
1240         [ -d /proc/$close_pid ] && return 2
1241         do_facet mds "lctl set_param fail_loc=0"
1242
1243         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1244         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 4
1245         rm -rf $DIR/${tdir}-*
1246 }
1247 run_test 53f "|X| open reply and close reply while two MDC requests in flight"
1248
1249 test_53g() {
1250         cancel_lru_locks mdc  # lock cleanup
1251         rm -rf $DIR/${tdir}-1 $DIR/${tdir}-2
1252
1253         mkdir -p $DIR/${tdir}-1
1254         mkdir -p $DIR/${tdir}-2
1255         multiop $DIR/${tdir}-1/f O_c &
1256         close_pid=$!
1257
1258 #define OBD_FAIL_MDS_REINT_NET_REP       0x119
1259         do_facet mds "lctl set_param fail_loc=0x80000119"
1260         mcreate $DIR/${tdir}-2/f &
1261         open_pid=$!
1262         sleep 1
1263
1264 #define OBD_FAIL_MDS_CLOSE_NET           0x115
1265         do_facet mds "lctl set_param fail_loc=0x80000115"
1266         kill -USR1 $close_pid
1267         cancel_lru_locks mdc # force the close
1268
1269         do_facet mds "lctl set_param fail_loc=0"
1270         replay_barrier_nodf mds
1271         fail_nodf mds
1272         wait $open_pid || return 1
1273         sleep 2
1274         # close should be gone
1275         [ -d /proc/$close_pid ] && return 2
1276
1277         $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1278         $CHECKSTAT -t file $DIR/${tdir}-2/f || return 4
1279         rm -rf $DIR/${tdir}-*
1280 }
1281 run_test 53g "|X| drop open reply and close request while close and open are both in flight"
1282
1283 test_53h() {
1284     cancel_lru_locks mdc  # lock cleanup
1285     rm -rf $DIR/${tdir}-1 $DIR/${tdir}-2
1286
1287     mkdir -p $DIR/${tdir}-1
1288     mkdir -p $DIR/${tdir}-2
1289     multiop $DIR/${tdir}-1/f O_c &
1290     close_pid=$!
1291
1292 #define OBD_FAIL_MDS_REINT_NET           0x107
1293     do_facet mds "lctl set_param fail_loc=0x80000107"
1294     mcreate $DIR/${tdir}-2/f &
1295     open_pid=$!
1296     sleep 1
1297
1298 #define OBD_FAIL_MDS_CLOSE_NET_REP       0x13b
1299     do_facet mds "lctl set_param fail_loc=0x8000013b"
1300     kill -USR1 $close_pid
1301     cancel_lru_locks mdc  # force the close
1302     sleep 1
1303
1304     replay_barrier_nodf mds
1305     fail_nodf mds
1306     wait $open_pid || return 1
1307     sleep 2
1308     # close should be gone
1309     [ -d /proc/$close_pid ] && return 2
1310     do_facet mds "lctl set_param fail_loc=0"
1311
1312     $CHECKSTAT -t file $DIR/${tdir}-1/f || return 3
1313     $CHECKSTAT -t file $DIR/${tdir}-2/f || return 4
1314     rm -rf $DIR/${tdir}-*
1315 }
1316 run_test 53h "|X| open request and close reply while two MDC requests in flight"
1317
1318 #b3761 ASSERTION(hash != 0) failed
1319 test_55() {
1320 # OBD_FAIL_MDS_OPEN_CREATE | OBD_FAIL_ONCE
1321     do_facet mds "lctl set_param fail_loc=0x8000012b"
1322     touch $DIR/$tfile &
1323     # give touch a chance to run
1324     sleep 5
1325     do_facet mds "lctl set_param fail_loc=0x0"
1326     rm $DIR/$tfile
1327     return 0
1328 }
1329 run_test 55 "let MDS_CHECK_RESENT return the original return code instead of 0"
1330
1331 #b3440 ASSERTION(rec->ur_fid2->id) failed
1332 test_56() {
1333     ln -s foo $DIR/$tfile
1334     replay_barrier mds
1335     #drop_reply "cat $DIR/$tfile"
1336     fail mds
1337     sleep 10
1338 }
1339 run_test 56 "don't replay a symlink open request (3440)"
1340
1341 #recovery one mds-ost setattr from llog
1342 test_57() {
1343 #define OBD_FAIL_MDS_OST_SETATTR       0x12c
1344     do_facet mds "lctl set_param fail_loc=0x8000012c"
1345     touch $DIR/$tfile
1346     replay_barrier mds
1347     fail mds
1348     sleep 1
1349     $CHECKSTAT -t file $DIR/$tfile || return 1
1350     do_facet mds "lctl set_param fail_loc=0x0"
1351     rm $DIR/$tfile
1352 }
1353 run_test 57 "test recovery from llog for setattr op"
1354
1355 #recovery many mds-ost setattr from llog
1356 test_58a() {
1357     mkdir -p $DIR/$tdir
1358 #define OBD_FAIL_MDS_OST_SETATTR       0x12c
1359     do_facet mds "lctl set_param fail_loc=0x8000012c"
1360     createmany -o $DIR/$tdir/$tfile-%d 2500
1361     replay_barrier mds
1362     fail mds
1363     sleep 2
1364     $CHECKSTAT -t file $DIR/$tdir/$tfile-* >/dev/null || return 1
1365     do_facet mds "lctl set_param fail_loc=0x0"
1366     unlinkmany $DIR/$tdir/$tfile-%d 2500
1367     rmdir $DIR/$tdir
1368 }
1369 run_test 58a "test recovery from llog for setattr op (test llog_gen_rec)"
1370
1371 test_58b() {
1372     mount_client $MOUNT2
1373     mkdir -p $DIR/$tdir
1374     touch $DIR/$tdir/$tfile
1375     replay_barrier mds
1376     setfattr -n trusted.foo -v bar $DIR/$tdir/$tfile
1377     fail mds
1378     VAL=`getfattr --absolute-names --only-value -n trusted.foo $MOUNT2/$tdir/$tfile`
1379     [ x$VAL = x"bar" ] || return 1
1380     rm -f $DIR/$tdir/$tfile
1381     rmdir $DIR/$tdir
1382     zconf_umount `hostname` $MOUNT2
1383 }
1384 run_test 58b "test replay of setxattr op"
1385
1386 test_58c() { # bug 16570
1387         mount_client $MOUNT2
1388         mkdir -p $DIR/$tdir
1389         touch $DIR/$tdir/$tfile
1390         drop_request "setfattr -n trusted.foo -v bar $DIR/$tdir/$tfile" || \
1391                 return 1
1392         VAL=`getfattr --absolute-names --only-value -n trusted.foo $MOUNT2/$tdir/$tfile`
1393         [ x$VAL = x"bar" ] || return 2
1394         drop_reint_reply "setfattr -n trusted.foo1 -v bar1 $DIR/$tdir/$tfile" || \
1395                 return 3
1396         VAL=`getfattr --absolute-names --only-value -n trusted.foo1 $MOUNT2/$tdir/$tfile`
1397         [ x$VAL = x"bar1" ] || return 4
1398         rm -f $DIR/$tdir/$tfile
1399         rmdir $DIR/$tdir
1400         zconf_umount `hostname` $MOUNT2
1401 }
1402 run_test 58c "resend/reconstruct setxattr op"
1403
1404 # log_commit_thread vs filter_destroy race used to lead to import use after free
1405 # bug 11658
1406 test_59() {
1407     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1408
1409     mkdir -p $DIR/$tdir
1410     createmany -o $DIR/$tdir/$tfile-%d 200
1411     sync
1412     unlinkmany $DIR/$tdir/$tfile-%d 200
1413 #define OBD_FAIL_PTLRPC_DELAY_RECOV       0x507
1414     do_facet ost1 "lctl set_param fail_loc=0x507"
1415     fail ost1
1416     fail mds
1417     do_facet ost1 "lctl set_param fail_loc=0x0"
1418     sleep 20
1419     rmdir $DIR/$tdir
1420 }
1421 run_test 59 "test log_commit_thread vs filter_destroy race"
1422
1423 # race between add unlink llog vs cat log init in post_recovery (only for b1_6)
1424 # bug 12086: should no oops and No ctxt error for this test
1425 test_60() {
1426     mkdir -p $DIR/$tdir
1427     createmany -o $DIR/$tdir/$tfile-%d 200
1428     replay_barrier mds
1429     unlinkmany $DIR/$tdir/$tfile-%d 0 100
1430     fail mds
1431     unlinkmany $DIR/$tdir/$tfile-%d 100 100
1432     local no_ctxt=`dmesg | grep "No ctxt"`
1433     [ -z "$no_ctxt" ] || error "ctxt is not initialized in recovery"
1434 }
1435 run_test 60 "test llog post recovery init vs llog unlink"
1436
1437 #test race  llog recovery thread vs llog cleanup
1438 test_61a() {
1439     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1440
1441     mkdir -p $DIR/$tdir
1442     createmany -o $DIR/$tdir/$tfile-%d 800
1443     replay_barrier ost1
1444 #   OBD_FAIL_OST_LLOG_RECOVERY_TIMEOUT 0x221
1445     unlinkmany $DIR/$tdir/$tfile-%d 800
1446     do_facet ost "lctl set_param fail_loc=0x80000221"
1447     facet_failover ost1
1448     sleep 10
1449     fail ost1
1450     sleep 30
1451     do_facet ost "lctl set_param fail_loc=0x0"
1452     $CHECKSTAT -t file $DIR/$tdir/$tfile-* && return 1
1453     rmdir $DIR/$tdir
1454 }
1455 run_test 61a "test race llog recovery vs llog cleanup"
1456
1457 #test race  mds llog sync vs llog cleanup
1458 test_61b() {
1459 #   OBD_FAIL_MDS_LLOG_SYNC_TIMEOUT 0x13a
1460     do_facet mds "lctl set_param fail_loc=0x8000013a"
1461     facet_failover mds
1462     sleep 10
1463     fail mds
1464     do_facet client dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 || return 1
1465 }
1466 run_test 61b "test race mds llog sync vs llog cleanup"
1467
1468 #test race  cancel cookie cb vs llog cleanup
1469 test_61c() {
1470     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1471
1472 #   OBD_FAIL_OST_CANCEL_COOKIE_TIMEOUT 0x222
1473     touch $DIR/$tfile
1474     do_facet ost "lctl set_param fail_loc=0x80000222"
1475     rm $DIR/$tfile
1476     sleep 10
1477     fail ost1
1478 }
1479 run_test 61c "test race mds llog sync vs llog cleanup"
1480
1481 test_61d() { # bug 16002
1482 #define OBD_FAIL_OBD_LLOG_SETUP        0x605
1483     stop mgs
1484     do_facet mgs "lctl set_param fail_loc=0x80000605"
1485     start mgs $MGSDEV $mgs_MOUNT_OPTS && error "mgs start should have failed"
1486     do_facet mgs "lctl set_param fail_loc=0"
1487     start mgs $MGSDEV $mgs_MOUNT_OPTS || error "cannot restart mgs"
1488 }
1489 run_test 61d "error in llog_setup should cleanup the llog context correctly"
1490
1491 test_62() { # Bug 15756 - don't mis-drop resent replay
1492     mkdir -p $DIR/$tdir
1493     replay_barrier mds
1494     createmany -o $DIR/$tdir/$tfile- 25
1495 #define OBD_FAIL_TGT_REPLAY_DROP         0x707
1496     do_facet mds "lctl set_param fail_loc=0x80000707"
1497     fail mds
1498     do_facet mds "lctl set_param fail_loc=0"
1499     unlinkmany $DIR/$tdir/$tfile- 25 || return 2
1500     return 0
1501 }
1502 run_test 62 "don't mis-drop resent replay"
1503
1504 #Adaptive Timeouts (bug 3055)
1505 AT_MAX_SET=0
1506
1507 at_cleanup () {
1508     local var
1509     local facet
1510     local at_new
1511
1512     echo "Cleaning up AT ..."
1513     if [ -n "$ATOLDBASE" ]; then
1514         local at_history=$($LCTL get_param -n at_history)
1515         do_facet mds "lctl set_param at_history=$at_history" || true
1516         do_facet ost1 "lctl set_param at_history=$at_history" || true
1517     fi
1518
1519     if [ $AT_MAX_SET -ne 0 ]; then
1520         for facet in mds client ost; do
1521             var=AT_MAX_SAVE_${facet}
1522             echo restore AT on $facet to saved value ${!var}
1523             at_max_set ${!var} $facet
1524             at_new=$(at_max_get $facet)
1525             echo Restored AT value on $facet $at_new
1526             [ $at_new -eq ${!var} ] || \
1527             error "$facet : AT value was not restored SAVED ${!var} NEW $at_new"
1528         done
1529     fi
1530 }
1531
1532 at_start()
1533 {
1534     local at_max_new=600
1535
1536     # Save at_max original values
1537     local facet
1538     if [ $AT_MAX_SET -eq 0 ]; then
1539         # Suppose that all osts have the same at_max
1540         for facet in mds client ost; do
1541             eval AT_MAX_SAVE_${facet}=$(at_max_get $facet)
1542         done
1543     fi
1544     local at_max
1545     for facet in mds client ost; do
1546         at_max=$(at_max_get $facet)
1547         if [ $at_max -ne $at_max_new ]; then
1548             echo "AT value on $facet is $at_max, set it by force temporarily to $at_max_new"
1549             at_max_set $at_max_new $facet
1550             AT_MAX_SET=1
1551         fi
1552     done
1553
1554     if [ -z "$ATOLDBASE" ]; then
1555         ATOLDBASE=$(do_facet mds "lctl get_param -n at_history")
1556         # speed up the timebase so we can check decreasing AT
1557         do_facet mds "lctl set_param at_history=8" || true
1558         do_facet ost1 "lctl set_param at_history=8" || true
1559
1560         # sleep for a while to cool down, should be > 8s and also allow
1561         # at least one ping to be sent. simply use TIMEOUT to be safe.
1562         sleep $TIMEOUT
1563     fi
1564 }
1565
1566 test_65a() #bug 3055
1567 {
1568     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1569
1570     at_start || return 0
1571     $LCTL dk > /dev/null
1572     debugsave
1573     lctl set_param debug="+other"
1574     # Slow down a request to the current service time, this is critical
1575     # because previous tests may have caused this value to increase.
1576     REQ_DELAY=`lctl get_param -n mdc.${FSNAME}-MDT0000-mdc-*.timeouts |
1577                awk '/portal 12/ {print $5}'`
1578     REQ_DELAY=$((${REQ_DELAY} + ${REQ_DELAY} / 4 + 5))
1579
1580     do_facet mds lctl set_param fail_val=$((${REQ_DELAY} * 1000))
1581 #define OBD_FAIL_PTLRPC_PAUSE_REQ        0x50a
1582     do_facet mds lctl set_param fail_loc=0x8000050a
1583     createmany -o $DIR/$tfile 10 > /dev/null
1584     unlinkmany $DIR/$tfile 10 > /dev/null
1585     # check for log message
1586     $LCTL dk | grep "Early reply #" || error "No early reply"
1587     # client should show REQ_DELAY estimates
1588     lctl get_param -n mdc.${FSNAME}-MDT0000-mdc-*.timeouts | grep portal
1589     sleep 9
1590     lctl get_param -n mdc.${FSNAME}-MDT0000-mdc-*.timeouts | grep portal
1591 }
1592 run_test 65a "AT: verify early replies"
1593
1594 test_65b() #bug 3055
1595 {
1596     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1597
1598     at_start || return 0
1599     # turn on D_ADAPTTO
1600     debugsave
1601     lctl set_param debug="+other"
1602     $LCTL dk > /dev/null
1603     # Slow down a request to the current service time, this is critical
1604     # because previous tests may have caused this value to increase.
1605     lfs setstripe $DIR/$tfile --index=0 --count=1
1606     multiop $DIR/$tfile Ow1yc
1607     REQ_DELAY=`lctl get_param -n osc.${FSNAME}-OST0000-osc-*.timeouts |
1608                awk '/portal 6/ {print $5}'`
1609     REQ_DELAY=$((${REQ_DELAY} + ${REQ_DELAY} / 4 + 5))
1610
1611     do_facet ost1 lctl set_param fail_val=${REQ_DELAY}
1612 #define OBD_FAIL_OST_BRW_PAUSE_PACK      0x224
1613     do_facet ost1 lctl set_param fail_loc=0x224
1614
1615     rm -f $DIR/$tfile
1616     lfs setstripe $DIR/$tfile --index=0 --count=1
1617     # force some real bulk transfer
1618     multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
1619
1620     do_facet ost1 lctl set_param fail_loc=0
1621     # check for log message
1622     $LCTL dk | grep "Early reply #" || error "No early reply"
1623     debugrestore
1624     # client should show REQ_DELAY estimates
1625     lctl get_param -n osc.${FSNAME}-OST0000-osc-*.timeouts | grep portal
1626 }
1627 run_test 65b "AT: verify early replies on packed reply / bulk"
1628
1629 test_66a() #bug 3055
1630 {
1631     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1632
1633     at_start || return 0
1634     lctl get_param -n mdc.${FSNAME}-MDT0000-mdc-*.timeouts | grep "portal 12"
1635     # adjust 5s at a time so no early reply is sent (within deadline)
1636     do_facet mds "lctl set_param fail_val=5000"
1637 #define OBD_FAIL_PTLRPC_PAUSE_REQ        0x50a
1638     do_facet mds "lctl set_param fail_loc=0x8000050a"
1639     createmany -o $DIR/$tfile 20 > /dev/null
1640     unlinkmany $DIR/$tfile 20 > /dev/null
1641     lctl get_param -n mdc.${FSNAME}-MDT0000-mdc-*.timeouts | grep "portal 12"
1642     do_facet mds "lctl set_param fail_val=10000"
1643     do_facet mds "lctl set_param fail_loc=0x8000050a"
1644     createmany -o $DIR/$tfile 20 > /dev/null
1645     unlinkmany $DIR/$tfile 20 > /dev/null
1646     lctl get_param -n mdc.${FSNAME}-MDT0000-mdc-*.timeouts | grep "portal 12"
1647     do_facet mds "lctl set_param fail_loc=0"
1648     sleep 9
1649     createmany -o $DIR/$tfile 20 > /dev/null
1650     unlinkmany $DIR/$tfile 20 > /dev/null
1651     lctl get_param -n mdc.${FSNAME}-MDT0000-mdc-*.timeouts | grep portal | grep "portal 12"
1652     CUR=$(lctl get_param -n mdc.${FSNAME}-MDT0000-mdc-*.timeouts | awk '/portal 12/ {print $5}')
1653     WORST=$(lctl get_param -n mdc.${FSNAME}-MDT0000-mdc-*.timeouts | awk '/portal 12/ {print $7}')
1654     echo "Current MDT timeout $CUR, worst $WORST"
1655     [ $CUR -lt $WORST ] || error "Current $CUR should be less than worst $WORST"
1656 }
1657 run_test 66a "AT: verify MDT service time adjusts with no early replies"
1658
1659 test_66b() #bug 3055
1660 {
1661     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1662
1663     at_start || return 0
1664     ORIG=$(lctl get_param -n mdc.${FSNAME}-*.timeouts | awk '/network/ {print $4}')
1665     lctl set_param fail_val=$(($ORIG + 5))
1666 #define OBD_FAIL_PTLRPC_PAUSE_REP      0x50c
1667     lctl set_param fail_loc=0x50c
1668     ls $DIR/$tfile > /dev/null 2>&1
1669     lctl set_param fail_loc=0
1670     CUR=$(lctl get_param -n mdc.${FSNAME}-*.timeouts | awk '/network/ {print $4}')
1671     WORST=$(lctl get_param -n mdc.${FSNAME}-*.timeouts | awk '/network/ {print $6}')
1672     echo "network timeout orig $ORIG, cur $CUR, worst $WORST"
1673     [ $WORST -gt $ORIG ] || error "Worst $WORST should be worse than orig $ORIG"
1674 }
1675 run_test 66b "AT: verify net latency adjusts"
1676
1677 test_67a() #bug 3055
1678 {
1679     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1680
1681     at_start || return 0
1682     CONN1=$(lctl get_param -n osc.*.stats | awk '/_connect/ {total+=$2} END {print total}')
1683     # sleeping threads may drive values above this
1684     do_facet ost1 "lctl set_param fail_val=400"
1685 #define OBD_FAIL_PTLRPC_PAUSE_REQ    0x50a
1686     do_facet ost1 "lctl set_param fail_loc=0x50a"
1687     createmany -o $DIR/$tfile 20 > /dev/null
1688     unlinkmany $DIR/$tfile 20 > /dev/null
1689     do_facet ost1 "lctl set_param fail_loc=0"
1690     CONN2=$(lctl get_param -n osc.*.stats | awk '/_connect/ {total+=$2} END {print total}')
1691     ATTEMPTS=$(($CONN2 - $CONN1))
1692     echo "$ATTEMPTS osc reconnect attemps on gradual slow"
1693     [ $ATTEMPTS -gt 0 ] && error_ignore 13721 "AT should have prevented reconnect"
1694     return 0
1695 }
1696 run_test 67a "AT: verify slow request processing doesn't induce reconnects"
1697
1698 test_67b() #bug 3055
1699 {
1700     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1701
1702     at_start || return 0
1703     CONN1=$(lctl get_param -n osc.*.stats | awk '/_connect/ {total+=$2} END {print total}')
1704
1705     # exhaust precreations on ost1
1706     local OST=$(lfs osts | grep ^0": " | awk '{print $2}' | sed -e 's/_UUID$//')
1707     local mdtosc=$(get_mdtosc_proc_path $OST)
1708     local last_id=$(do_facet mds lctl get_param -n osc.$mdtosc.prealloc_last_id)
1709     local next_id=$(do_facet mds lctl get_param -n osc.$mdtosc.prealloc_next_id)
1710
1711     mkdir -p $DIR/$tdir/${OST}
1712     lfs setstripe $DIR/$tdir/${OST} -o 0 -c 1 || error "setstripe"
1713     echo "Creating to objid $last_id on ost $OST..."
1714 #define OBD_FAIL_OST_PAUSE_CREATE        0x223
1715     do_facet ost1 "lctl set_param fail_val=20000"
1716     do_facet ost1 "lctl set_param fail_loc=0x80000223"
1717     createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1718
1719     client_reconnect
1720     do_facet ost1 "lctl get_param -n ost.OSS.ost_create.timeouts"
1721     log "phase 2"
1722     CONN2=$(lctl get_param -n osc.*.stats | awk '/_connect/ {total+=$2} END {print total}')
1723     ATTEMPTS=$(($CONN2 - $CONN1))
1724     echo "$ATTEMPTS osc reconnect attemps on instant slow"
1725     # do it again; should not timeout
1726     do_facet ost1 "lctl set_param fail_loc=0x80000223"
1727     cp /etc/profile $DIR/$tfile || error "cp failed"
1728     do_facet ost1 "lctl set_param fail_loc=0"
1729     client_reconnect
1730     do_facet ost1 "lctl get_param -n ost.OSS.ost_create.timeouts"
1731     CONN3=$(lctl get_param -n osc.*.stats | awk '/_connect/ {total+=$2} END {print total}')
1732     ATTEMPTS=$(($CONN3 - $CONN2))
1733     echo "$ATTEMPTS osc reconnect attemps on 2nd slow"
1734     [ $ATTEMPTS -gt 0 ] && error "AT should have prevented reconnect"
1735     return 0
1736 }
1737 run_test 67b "AT: verify instant slowdown doesn't induce reconnects"
1738
1739 test_68 () #bug 13813
1740 {
1741     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
1742
1743     at_start || return 0
1744     local ldlm_enqueue_min=$(find /sys -name ldlm_enqueue_min)
1745     [ -z "$ldlm_enqueue_min" ] && skip "missing /sys/.../ldlm_enqueue_min" && return 0
1746     local ldlm_enqueue_min_r=$(do_facet ost1 "find /sys -name ldlm_enqueue_min")
1747     [ -z "$ldlm_enqueue_min_r" ] && skip "missing /sys/.../ldlm_enqueue_min in the ost1" && return 0
1748     local ENQ_MIN=$(cat $ldlm_enqueue_min)
1749     local ENQ_MIN_R=$(do_facet ost1 "cat $ldlm_enqueue_min_r")
1750     echo $TIMEOUT >> $ldlm_enqueue_min
1751     do_facet ost1 "echo $TIMEOUT >> $ldlm_enqueue_min_r"
1752
1753     rm -rf $DIR/$tdir
1754     mkdir -p $DIR/$tdir
1755     lfs setstripe $DIR/$tdir --index=0 --count=1
1756 #define OBD_FAIL_LDLM_PAUSE_CANCEL       0x312
1757     lctl set_param fail_val=$(($TIMEOUT - 1))
1758     lctl set_param fail_loc=0x80000312
1759     cp /etc/profile $DIR/$tdir/${tfile}_1 || error "1st cp failed $?"
1760     lctl set_param fail_val=$((TIMEOUT * 5 / 4))
1761     lctl set_param fail_loc=0x80000312
1762     cp /etc/profile $DIR/$tdir/${tfile}_2 || error "2nd cp failed $?"
1763     lctl set_param fail_loc=0
1764
1765     echo $ENQ_MIN >> $ldlm_enqueue_min
1766     do_facet ost1 "echo $ENQ_MIN_R >> $ldlm_enqueue_min_r"
1767     rm -rf $DIR/$tdir
1768     return 0
1769 }
1770 run_test 68 "AT: verify slowing locks"
1771
1772 at_cleanup
1773 # end of AT tests includes above lines
1774
1775 # start multi-client tests
1776 test_70a () {
1777         [ -z "$CLIENTS" ] && \
1778                 { skip "Need two or more clients." && return; }
1779         [ $CLIENTCOUNT -lt 2 ] && \
1780                 { skip "Need two or more clients, have $CLIENTCOUNT" && return; }
1781
1782         echo "mount clients $CLIENTS ..."
1783         zconf_mount_clients $CLIENTS $DIR
1784
1785         local clients=${CLIENTS//,/ }
1786         echo "Write/read files on $DIR ; clients $CLIENTS ... "
1787         for CLIENT in $clients; do
1788                 do_node $CLIENT dd bs=1M count=10 if=/dev/zero \
1789                         of=$DIR/${tfile}_${CLIENT} 2>/dev/null || \
1790                                 error "dd failed on $CLIENT"
1791         done
1792
1793         local prev_client=$(echo $clients | sed 's/^.* \(.\+\)$/\1/')
1794         for C in ${CLIENTS//,/ }; do
1795                 do_node $prev_client dd if=$DIR/${tfile}_${C} of=/dev/null 2>/dev/null || \
1796                         error "dd if=$DIR/${tfile}_${C} failed on $prev_client"
1797                 prev_client=$C
1798         done
1799         
1800         ls $DIR
1801 }
1802 run_test 70a "check multi client t-f"
1803
1804 test_70b () {
1805         local clients=${CLIENTS:-$HOSTNAME}
1806
1807         zconf_mount_clients $clients $DIR
1808         
1809         local duration=300
1810         [ "$SLOW" = "no" ] && duration=60
1811         local cmd="rundbench 1 -t $duration"
1812         local PID=""
1813         do_nodesv $clients "set -x; MISSING_DBENCH_OK=$MISSING_DBENCH_OK \
1814                 PATH=:$PATH:$LUSTRE/utils:$LUSTRE/tests/:$DBENCH_LIB \
1815                 DBENCH_LIB=$DBENCH_LIB TESTSUITE=$TESTSUITE TESTNAME=$TESTNAME \
1816                 LCTL=$LCTL $cmd" &
1817         PID=$!
1818         log "Started rundbench load PID=$PID ..."
1819
1820         ELAPSED=0
1821         NUM_FAILOVERS=0
1822         START_TS=$(date +%s)
1823         CURRENT_TS=$START_TS
1824         while [ $ELAPSED -lt $duration ]; do
1825                 sleep 1
1826                 replay_barrier mds
1827                 sleep 1 # give clients a time to do operations
1828                 # Increment the number of failovers
1829                 NUM_FAILOVERS=$((NUM_FAILOVERS+1))
1830                 log "$TESTNAME fail mds1 $NUM_FAILOVERS times"
1831                 facet_failover mds
1832                 CURRENT_TS=$(date +%s)
1833                 ELAPSED=$((CURRENT_TS - START_TS))
1834         done
1835
1836         wait $PID || error "rundbench load on $CLIENTS failed!"
1837 }
1838 run_test 70b "mds recovery; $CLIENTCOUNT clients"
1839 # end multi-client tests
1840
1841 # vbr export handling
1842 test_71a() {
1843     delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; }
1844
1845     UUID=$(lctl dl | awk '/mdc.*-mdc-/ { print $5 }')
1846     echo "Client UUID is $UUID"
1847     replay_barrier mds
1848     umount $DIR
1849     facet_failover mds
1850     zconf_mount `hostname` $DIR || error "mount fails"
1851     client_up || error "post-failover df failed"
1852     do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|grep $UUID" || \
1853         error "no delayed exports"
1854     OLD_AGE=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_export_age")
1855     NEW_AGE=10
1856     do_facet mds "lctl set_param mds.${mds_svc}.stale_export_age=$NEW_AGE"
1857     sleep $((NEW_AGE + 2))
1858     do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|grep \"$UUID.*EXPIRED\"" || \
1859         error "exports didn't expire"
1860     do_facet mds "lctl set_param mds.${mds_svc}.evict_client=$UUID"
1861     do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|grep $UUID" && \
1862         error "Export wasn't removed manually"
1863     do_facet mds "lctl set_param mds.${mds_svc}.stale_export_age=$OLD_AGE"
1864     return 0;
1865 }
1866 run_test 71a "lost client export is kept"
1867
1868 test_71b() {
1869     delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; }
1870
1871     FAKE_NUM=10
1872     create_fake_exports mds $FAKE_NUM
1873     NUM=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|wc -l")
1874     [ $NUM -eq 0 ] && error "no fake exports $NUM - $FAKE_NUM"
1875     OLD_AGE=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_export_age")
1876     NEW_AGE=10
1877     do_facet mds "lctl set_param mds.${mds_svc}.stale_export_age=$NEW_AGE"
1878     sleep $((NEW_AGE + 2))
1879     EX_NUM=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|grep -c EXPIRED")
1880     [ "$EX_NUM" -eq "$NUM" ] || error "not all exports are expired $EX_NUM != $NUM"
1881     do_facet mds "lctl set_param mds.${mds_svc}.flush_stale_exports=1"
1882     do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|grep EXPIRED" && \
1883         error "Exports weren't flushed"
1884     do_facet mds "lctl set_param mds.${mds_svc}.stale_export_age=$OLD_AGE"
1885     return 0;
1886 }
1887 run_test 71b "stale exports are expired, lctl flushes them"
1888
1889 test_71c() {
1890     delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; }
1891
1892     FAKE_NUM=10
1893     create_fake_exports mds $FAKE_NUM
1894     NUM=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|wc -l")
1895     [ "$NUM" -eq "$FAKE_NUM" ] || error "no fake exports $NUM - $FAKE_NUM"
1896     OLD_AGE=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_export_age")
1897     NEW_AGE=10
1898     do_facet mds "lctl set_param mds.${mds_svc}.stale_export_age=$NEW_AGE"
1899     sleep $((NEW_AGE + 2))
1900     EX_NUM=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|grep -c EXPIRED")
1901     [ "$EX_NUM" -eq "$NUM" ] || error "not all exports are expired $EX_NUM != $NUM"
1902
1903     umount $DIR
1904     zconf_mount `hostname` $DIR || error "mount fails"
1905
1906     NUM=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|wc -l")
1907     [ $NUM -eq 0 ] || error "$NUM fake exports are still exists"
1908     do_facet mds "lctl set_param mds.${mds_svc}.stale_export_age=$OLD_AGE"
1909     return 0;
1910 }
1911 run_test 71c "stale exports are expired, new client connection flush them"
1912
1913 test_71d() {
1914     delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; }
1915
1916     FAKE_NUM=10
1917     create_fake_exports mds $FAKE_NUM
1918     NUM=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|wc -l")
1919     [ "$NUM" -eq "$FAKE_NUM" ] || error "no fake exports $NUM - $FAKE_NUM"
1920     OLD_AGE=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_export_age")
1921     NEW_AGE=10
1922     do_facet mds "lctl conf_param ${mds_svc}.mdt.stale_export_age=$NEW_AGE"
1923     sleep $((NEW_AGE + 2))
1924     EX_NUM=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|grep -c EXPIRED")
1925     [ "$EX_NUM" -eq "$NUM" ] || error "not all exports are expired $EX_NUM != $NUM"
1926
1927     fail mds
1928
1929     FAIL_AGE=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_export_age")
1930     [ $FAIL_AGE -eq $NEW_AGE ] || error "new age wasn't set after recovery"
1931     NUM=$(do_facet mds "lctl get_param -n mds.${mds_svc}.stale_exports|wc -l")
1932     [ $NUM -eq 0 ] || error "$NUM fake exports are still exists"
1933     do_facet mds "lctl conf_param ${mds_svc}.mdt.stale_export_age=$OLD_AGE"
1934     return 0;
1935 }
1936 run_test 71d "expired exports, server init removes them, conf_param works"
1937
1938 # end vbr exports tests
1939
1940 test_72() { #bug 16711
1941     replay_barrier mds
1942     multiop_bg_pause $DIR/$tfile O_c || return 4
1943     pid=$!
1944 #define OBD_FAIL_TGT_REPLAY_DELAY 0x709
1945     do_facet mds "lctl set_param fail_loc=0x80000709"
1946     fail mds
1947     kill -USR1 $pid || return 1
1948     wait $pid || return 2
1949     $CHECKSTAT -t file $DIR/$tfile || return 3
1950 }
1951 run_test 72 "target_finish_recovery vs process_recovery_queue race"
1952
1953 test_73a() {
1954     multiop_bg_pause $DIR/$tfile O_tSc || return 3
1955     pid=$!
1956     rm -f $DIR/$tfile
1957
1958     replay_barrier mds
1959 #define OBD_FAIL_LDLM_ENQUEUE       0x302
1960     do_facet mds "lctl set_param fail_loc=0x80000302"
1961     fail mds
1962     kill -USR1 $pid
1963     wait $pid || return 1
1964     [ -e $DIR/$tfile ] && return 2
1965     return 0
1966 }
1967 run_test 73a "open(O_CREAT), unlink, replay, reconnect before open replay , close"
1968
1969 test_73b() {
1970     multiop_bg_pause $DIR/$tfile O_tSc || return 3
1971     pid=$!
1972     rm -f $DIR/$tfile
1973
1974     replay_barrier mds
1975 #define OBD_FAIL_LDLM_REPLY       0x30c
1976     do_facet mds "lctl set_param fail_loc=0x8000030c"
1977     fail mds
1978     kill -USR1 $pid
1979     wait $pid || return 1
1980     [ -e $DIR/$tfile ] && return 2
1981     return 0
1982 }
1983 run_test 73b "open(O_CREAT), unlink, replay, reconnect at open_replay reply, close"
1984
1985 test_73c() {
1986     multiop_bg_pause $DIR/$tfile O_tSc || return 3
1987     pid=$!
1988     rm -f $DIR/$tfile
1989
1990     replay_barrier mds
1991 #define OBD_FAIL_TGT_LAST_REPLAY       0x710
1992     do_facet mds "lctl set_param fail_loc=0x80000710"
1993     fail mds
1994     kill -USR1 $pid
1995     wait $pid || return 1
1996     [ -e $DIR/$tfile ] && return 2
1997     return 0
1998 }
1999 run_test 73c "open(O_CREAT), unlink, replay, reconnect at last_replay, close"
2000
2001 test_80a() {
2002     do_facet ost1 "lctl get_param obdfilter.${ost1_svc}.sync_journal" ||
2003         { skip "sync journal is not implemeted" && return; }
2004
2005     do_facet ost1 "lctl set_param -n obdfilter.${ost1_svc}.sync_journal 0"
2006
2007     replay_barrier ost1
2008     lfs setstripe -i 0 -c 1 $DIR/$tfile
2009     dd if=/dev/urandom of=$DIR/$tfile bs=1024k count=8 || error "Cannot write"
2010     cksum=`md5sum $DIR/$tfile | awk '{print $1}'`
2011     cancel_lru_locks osc
2012     fail ost1
2013     dd if=$DIR/$tfile of=/dev/null bs=1024k count=8 || error "Cannot read"
2014     cksum2=`md5sum $DIR/$tfile | awk '{print $1}'`
2015     if [ $cksum != $cksum2 ] ; then
2016         error "New checksum $cksum2 does not match original $cksum"
2017     fi
2018 }
2019 run_test 80a "write replay"
2020
2021 test_80b() {
2022     do_facet ost1 "lctl get_param obdfilter.${ost1_svc}.sync_journal" ||
2023         { skip "sync journal is not implemeted" && return; }
2024
2025     do_facet ost1 "lctl set_param -n obdfilter.${ost1_svc}.sync_journal 0"
2026     
2027     replay_barrier ost1
2028     lfs setstripe -i 0 -c 1 $DIR/$tfile
2029     dd if=/dev/urandom of=$DIR/$tfile bs=1024k count=8 || error "Cannot write"
2030     sleep 1 # Give it a chance to flush dirty data
2031     echo TESTTEST | dd of=$DIR/$tfile bs=1 count=8 seek=64
2032     cksum=`md5sum $DIR/$tfile | awk '{print $1}'`
2033     cancel_lru_locks osc
2034     fail ost1
2035     dd if=$DIR/$tfile of=/dev/null bs=1024k count=8 || error "Cannot read"
2036     cksum2=`md5sum $DIR/$tfile | awk '{print $1}'`
2037     if [ $cksum != $cksum2 ] ; then
2038         error "New checksum $cksum2 does not match original $cksum"
2039     fi
2040 }
2041 run_test 80b "write replay with changed data (checksum resend)"
2042
2043 test_81a() {
2044     mkdir -p $DIR/$tdir
2045     createmany -o $DIR/$tdir/$tfile- 10 || return 1
2046 #define OBD_FAIL_MDS_FAIL_LOV_LOG_ADD       0x140
2047     do_facet mds "lctl set_param fail_loc=0x80000140"
2048     unlinkmany $DIR/$tdir/$tfile- 10 || return 2
2049 }
2050 run_test 81a "fail log_add during unlink recovery"
2051
2052 test_81b() {
2053     mkdir -p $DIR/$tdir
2054     createmany -o $DIR/$tdir/$tfile- 10 || return 1
2055     replay_barrier mds
2056     unlinkmany $DIR/$tdir/$tfile- 10 || return 2
2057 #define OBD_FAIL_MDS_FAIL_LOV_LOG_ADD       0x140
2058     do_facet mds "lctl set_param fail_loc=0x80000140"
2059     fail mds
2060 }
2061 run_test 81b "fail log_add during unlink recovery"
2062
2063 test_82() { #bug 18927
2064     multiop_bg_pause $DIR/$tfile O_c || return 1
2065     pid1=$!
2066     multiop_bg_pause $DIR/$tfile o:O_CREAT:O_RDONLY:_c || return 2
2067     pid2=$!
2068     rm -f $DIR/$tfile
2069     replay_barrier mds
2070     fail mds
2071     kill -USR1 $pid1
2072     wait $pid1 || return 3
2073     kill -USR1 $pid2
2074     wait $pid2 || return 4
2075     [ -e $DIR/$tfile ] && return 5
2076     return 0
2077 }
2078 run_test 82 "second open|creat in replay with open orphan"
2079
2080 test_83() { #bug 19224
2081 #define OBD_FAIL_MDS_SPLIT_OPEN  0x142
2082     do_facet mds "lctl set_param fail_loc=0x80000142"
2083     # open will sleep after first transaction
2084     touch $DIR/$tfile &
2085     PID=$!
2086     sleep 2
2087     # set barrier between open transactions
2088     replay_barrier_nodf mds
2089     createmany -o $DIR/$tfile- 10
2090     # open should finish now
2091     wait $PID || return 1
2092     fail mds
2093     rm $DIR/$tfile || return 2
2094     unlinkmany $DIR/$tfile- 10 || return 3
2095     return 0
2096 }
2097 run_test 83 "open replay with barrier between transactions"
2098
2099 test_84() {
2100 #define OBD_FAIL_OBD_FAIL_MDS_SPLIT_OPEN 0x142
2101     do_facet mds "lctl set_param fail_loc=0x80000142"
2102     createmany -o $DIR/$tfile- 1 &
2103     PID=$!
2104     mds_evict_client
2105     wait $PID || true
2106     client_up || client_up || true    # reconnect
2107 }
2108 run_test 84 "stale open during export disconnect"
2109
2110 test_85a() { #bug 16774
2111     lctl set_param -n ldlm.cancel_unused_locks_before_replay "1"
2112
2113     for i in `seq 100`; do
2114         echo "tag-$i" > $DIR/$tfile-$i
2115         grep -q "tag-$i" $DIR/$tfile-$i || error "f2-$i"
2116     done
2117
2118     lov_id=`lctl dl | grep "clilov"` 
2119     addr=`echo $lov_id | awk '{print $4}' | awk -F '-' '{print $3}'`
2120     count=`lctl get_param -n ldlm.namespaces.*MDT0000*$addr.lock_unused_count`
2121     echo "before recovery: unused locks count = $count"
2122
2123     fail mds
2124     
2125     count2=`lctl get_param -n ldlm.namespaces.*MDT0000*$addr.lock_unused_count`
2126     echo "after recovery: unused locks count = $count2"
2127
2128     if [ $count2 -ge $count ]; then
2129         error "unused locks are not canceled"
2130     fi
2131 }
2132 run_test 85a "check the cancellation of unused locks during recovery(IBITS)"
2133
2134 test_85b() { #bug 16774
2135     lctl set_param -n ldlm.cancel_unused_locks_before_replay "1"
2136
2137     lfs setstripe -o 0 -c 1 $DIR
2138
2139     for i in `seq 100`; do
2140         dd if=/dev/urandom of=$DIR/$tfile-$i bs=4096 count=32 >/dev/null 2>&1
2141     done
2142
2143     cancel_lru_locks osc
2144
2145     for i in `seq 100`; do
2146         dd if=$DIR/$tfile-$i of=/dev/null bs=4096 count=32 >/dev/null 2>&1
2147     done
2148
2149     lov_id=`lctl dl | grep "clilov"` 
2150     addr=`echo $lov_id | awk '{print $4}' | awk -F '-' '{print $3}'`
2151     count=`lctl get_param -n ldlm.namespaces.*OST0000*$addr.lock_unused_count`
2152     echo "before recovery: unused locks count = $count"
2153
2154     fail ost1
2155     
2156     count2=`lctl get_param -n ldlm.namespaces.*OST0000*$addr.lock_unused_count`
2157     echo "after recovery: unused locks count = $count2"
2158
2159     if [ $count2 -ge $count ]; then
2160         error "unused locks are not canceled"
2161     fi
2162 }
2163 run_test 85b "check the cancellation of unused locks during recovery(EXTENT)"
2164
2165 test_86() {
2166         local dev=$(get_mds_mdt_device_proc_path)
2167         umount $MOUNT
2168         do_facet mds lctl set_param $dev.${FSNAME}-MDT*.exports.clear=0
2169         fail mds
2170 }
2171 run_test 86 "umount server after clear nid_stats should not hit LBUG"
2172
2173 equals_msg `basename $0`: test complete, cleaning up
2174 check_and_cleanup_lustre
2175 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true