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