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